Lexsion 发布的文章

Edge浏览器菜单透明效果异常导致无法看清的处理方案

前言:

笔者最近新换的电脑出厂预装Windows11,这个系统稳定性真不行,会出很多莫名其妙的问题。于是笔者装了个Windows11 的虚拟机,在虚拟机中安装Windows10还是有点小问题的,这里不展开。完活后发现的第一个问题就是Edge浏览器菜单透明样式异常,完全看不清选项。如下图所示:

Edge

处理思路:

  1. 这个问题一看就感觉与显示渲染有关,很有可能是虚拟机图形显示驱动兼容性问题。首先考虑换个黑主题碰碰运气,试了一下果然不行。

  2. 然后就打开搜索引擎开摆。最开始用关键词 Edge 菜单透明 搜索未果,考虑 Edge 和 Chrome 都采用的 Chromium 内核,会不会有Chrome用户遇到这个问题呢?

  3. 然后换关键词 Chrome 菜单透明 ,找到有用的信息了。

    有知乎用户于19年发文表示Chrome遇到此问题,前辈在文中表示他几乎把能试的都试了,都无效。最后突然想到显示相关office相关软件有个设置叫 硬件加速 前辈找了一下果然Chrome也有 硬件加速 ,然后关掉就好了。

    文末还有不愿透露ID的大佬评论,通过实验项目改一下图形后端渲染模式也可以解决。

详细操作:

于是我们有了两个办法二选一:

  1. 修改ANGLE graphics backend

    该项设置属于实验型设置,在Chrome中是在 chrome://flags 位置,那么在Edge中就应该是在地址栏中输入 edge://flags 回车打开实验项目设置。

    搜索 Choose ANGLE graphics backend 设置项,笔者测试只有 D3D11on12 选项是能恢复正常工作的。如果你不是虚拟机遇到此问题,可以试试换其他选项。如果所有选项都不行,那只好试试下面的办法了。

  2. 关闭硬件加速

    打开Edge浏览器的设置,如果看不清不好选择,可直接在地址栏输入 edge://settings 回车进入。然后在左侧选择 系统和性能 (有些环境中是:系统),然后在右侧的设置条目中找到使用硬件加速,将其关闭

    其实VMware虚拟机的话,还有一个办法:那就是在虚拟机设置中取消 加速3D图形 ,该设置在虚拟机设置的 显示器 部分。这个设置关闭虚拟机才能改哦!(非常糟糕的方案)

总结:为不影响性能,尽量用第一个办法解决。

参考:

Chrome部分框架窗口都变半透明了——WireWolf

使用SSH连接GitHub仓库

前言:

讲一个笑话:最近给新电脑装Git工具,才意识到自己之前用SSH连接GitHub的方法居然是错的。是这样的,我配置了密钥对后依然在使用之前配置的浏览器登录。这次换新电脑,之前没有登录GitHub,新装的Git工具。跟着官方文档配置完成后,git push -u origin master 居然还弹出登录页面,然后我才意识到之前错了。使用SSH连接仓库和创建仓库时GitHub教你的方法两者协议是不一样的,网页上给的参考命令是用的HTTPS。这些其实在开始使用Git文档中有的,只是不仔细看容易忽略。官方的SSH连接操作文档半中半英可读性也不够好,第一次读的时候没看仔细。以上教训告诉我们,学习不能急于求成,基础要仔细掌握。所以鄙人在此水贴一篇,算是个基础教程吧。(看我不如通读GitHub的文档?)

前置基础:

GitHub是一个提供Git服务的网站。Git是一套版本控制工具。所以,使用GitHub除了一些网页上的设置,其主要功能就是使用Git。首次使用Git首先要下载安装,然后便是要配置用户名和邮箱,建议设置成和GitHub上相同的。配置分为全局配置和仓库配置,全局就是没有仓库配置时默认的用户信息;仓库的就是单独某个仓库生效的。下载安装程序运行,一路点击下一步,装完Git后便可以打开Git Bash啦。

# 设置全局配置:
git config --global user.name "github's Name"
git config --global user.email "github@xx.com"
# 设置仓库的配置,要在仓库目录下执行:
git config user.name "git's Name"
git config user.email "git@xx.com"
# 查看的命令,查哪在哪执行:
git config --list

Git存储内容项目的单元被称为仓库(Repository),作为一个仓库,创建的过程称之为初始化。然后创建文件,需要产生一个历史记录时,就将变更的文件按需添加到暂存区,提交(Commit)一次。有了一次Commit后,便可以为其设置远端仓库地址,将本地的仓库变化推送过去保存。大致这么个流程:

# 创建一个以仓库名称命名的目录(或者叫文件夹),并进入其中。
mkdir XX-Repository
cd XX-Repository
# 使用初始化命令
git init
# 按照实际需要,创建或从其他地方拷贝文件到目录下。惯例要创建一个README.md文件,给人看。
touch README.md
cp ../../XXX.XXX ./XXX.XXX     # 这个Linux下用的多,Win下不如直接图形界面拖拽。
# 文件写的差不多了,先按需添加到Commit暂存区,
git add XXX.XXX XXX.XXX      # 添加指定文件
git add -A      # 添加所有新增或变更的文件
# 然后执行Commit,一般惯例要带-m参数,备注本次提交的变更。
git commit -m "first commit"
# 添加远端仓库地址,地址从仓库主页的绿色Code按钮中能看到:
git remote add origin https://github.com/USERNAME/REPOSITORY.git
# 设置远端仓库的分支为master,并推送到该分支。
git push -u origin master
# 因为上面是HTTPS的连接方式,所以会弹出网页的登录页面。按提示登录即可完成推送。

到此一个Git仓库大致就在GitHub上搞起来了。那如何换用SSH方式连接仓库呢?

通过SSH连接:

这里我抄一下官方的内容,原文半英半中,写了很多注意事项,很多内容的位置却不合理。在此我缩减了一下,有问题建议看官方文档。

检查已有的SSH密钥对

首先可以检查下您电脑上有没有已经生产的可用的密钥对,他们是成对的一组文件,包含私钥和公钥。

  1. 打开Git Bash。
  2. 执行 ls -al ~/.ssh ,如果.ssh目录下有密钥对变回在回显的信息中看到文件名类似于:
    • id_rsa.pub
    • id_ecdsa.pub
    • id_ed25519.pub

这里,如果提示目录不存在,那看样子就是啥都没有了。如果有密钥对,就可以用后面的方法检查有没有密码加密,没有密码或者知道密码便可以直接用。否则就按下面的方法新建密钥对。

生成新的SSH密钥

如果您还没有 SSH 密钥,则必须生成新 SSH 密钥用于身份验证。为了安全,需要在生产的密钥对上添加密码保护。如果不想在每次使用 SSH 密钥时重新输入这个密码,您可以将密钥添加到 SSH 代理(即ssh-agent),让它管理您的 SSH 密钥并记住您的密码。

  1. 打开Git Bash。

  2. 复制下面的文本粘贴到Bash中执行(替换为您自己的 GitHub 电子邮件地址)。

    ssh-keygen -t ed25519 -C "your_email@example.com"

    注:如果您使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  3. 此时将以邮箱地址为标签生成新的SSH密钥对。

    • 提示您“Enter a file in which to save the key(输入要保存密钥的文件)”时,按 Enter 键。 这密钥会存在默认文件位置。(即~/.ssh ,不存在默认位置没有积极意义且会让后面更繁琐。)
    • 在提示 Enter passphrase 时设置密码,在提示 Enter same passphrase again: 时重复密码。

在 Git for Windows 上自动启动 ssh-agent

您可以在打开 bash 或 Git shell 时自动运行 ssh-agent。并让它自动添加~/.ssh目录下新的 SSH 密钥。

  1. 复制以下内容并将其粘贴到 Git shell 的 ~/.profile 文件中保存,没有就创建一个:

    env=~/.ssh/agent.env
    
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
    
    agent_start () {
        (umask 077; ssh-agent >| "$env")
        . "$env" >| /dev/null ; }
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
        ssh-add
    elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
        ssh-add
    fi
    
    unset env

    ~/ 这个位置是用户的HOME目录,Windows 下就是 C:\Users\<你的用户名> 这个目录。

    如果您的私钥没有存储在默认位置之一(如 ~/.ssh/id_rsa),您需要告知 SSH 身份验证代理其所在位置。 要将密钥添加到 ssh-agent,请输入 ssh-add ~/path/to/my_key

  2. 重新开一个Git Bash窗口,ssh-agent首次被启动,自动搜索新增的密钥对,然后提示输入密码,按要求输入密码后密钥对就被加入了ssh-agent。以后运行 Git Bash 时便会自动启动 ssh-agent ,不再需要输入密码。

  3. ssh-agent 进程将继续运行,直到您注销、关闭计算机或终止该进程。

添加SSH 公钥到 GitHub 帐户

前面的操作概括来讲就是将本地的私钥添加到了本地的SSH代理中,下面要将公钥添加到GitHub上。

  1. 网页右上角点击头像,然后点击 Settings。在左侧找到 Access 部分,点击 SSH and GPG keys

  2. 点击右上方的 New SSH key,打开 SSH keys/ Add new 页面。

  3. 在 "Title"(标题)文本框中,为新公钥添加描述性标题,要求自己看到就知道是啥。 例如,如果密钥对用于枪神6笔记本上,此公钥名称可以是 "God of Gun 6"。

  4. 使用以下命令将 SSH 公钥复制到剪贴板,并粘贴到网页的"Key"(密钥)文本框中。最后点击 Add SSH key(添加 SSH 密钥),按提示输入GitHub的登录密码完成公钥的添加。

    clip < ~/.ssh/id_ed25519.pub

    提示:注意文件位置,此处是默认位置与文件名,如果前面你的位置不一样,需要灵活改变。如果 clip 命令不可用,可找到隐藏的 .ssh 文件夹,在常用的文本编辑器中打开该.pub文件,并将其内容复制到剪贴板。

这样GitHub那边有对应的公钥,我有对应的私钥,我本地的SSH便能够向GitHub证明我的身份啦。

测试 SSH 连接

测试连接时,您可能需要使用密码(即您之前创建的 SSH 密钥对的密码)验证此操作。如果密钥的密码之前没有缓存到ssh-agent中。如果是按照前面操作过来的,应该无需再次输入密码。

  1. 打开 Git Bash。

  2. 输入以下内容:

    ssh -T git@github.com

    您可能会看到类似如下的警告:

    > The authenticity of host 'github.com (IP ADDRESS)' can't be established.
    > RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
    > Are you sure you want to continue connecting (yes/no)?
  3. 验证所看到消息中的指纹是否匹配 GitHub 的 RSA 公钥指纹。 如果是,则输入 yes。如果一切正常,会看到GitHub返回了一段包含您的用户名的消息。

    > Hi username! You've successfully authenticated, but GitHub does not
    > provide shell access.

将远端仓库的 URL 从 HTTPS 切换到 SSH

  1. 打开 Git Bash。

  2. 将当前工作目录切换到为您的本地仓库。

  3. 列出现有远程仓库以获取要更改的远程仓库的名称,关注一下USERNAME和REPOSITORY部分。

    $ git remote -v
    > origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
    > origin  https://github.com/USERNAME/REPOSITORY.git (push)
  4. 使用 git remote set-url 命令更改远端的 URL ,注意将上面获取的名称换到下面命令中。

    $ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

这里也可以使用git config 命令直接调整配置处理。

git config -l # 查看配置
git config remote.origin.url git@github.com:USERNAME/REPOSITORY.git
git config -l # 再次执行,检查修改结果

参考:

GoldenDict搭配Python 程序使用腾讯云机器翻译

前言:

笔者之前曾经写过一篇博文,介绍了自己使用翻译工具的经历。最后还安利了一波 GoldenDict ,同时安利了某位大佬的项目,调用 Python 程序通过 Google 翻译为 GoldenDict 添加整句翻译功能。最近笔者在新买的电脑上配置这套翻译工具时,发现这个Python程序只支持通过Google.com翻译了。而在中国大陆是无法直连Google.com的,于是我希望有一个替代方案。经过一番简单的对比,发现腾讯云提供了易于上手、免费额度足的翻译API,腾讯翻译君也是用的这个API。于是我便参考大佬的项目,通过腾讯云API接口,自己写了一个Python程序。

因为笔者学习Python的总时长不超过5小时,才疏学浅,还请大佬们不要喷我写的辣鸡代码,代码会放到GitHub上,大佬如果看不下去,欢迎添砖加瓦。整个配置分为申请翻译接口和部署Python程序两大步。

仓库链接

申请翻译接口:

目前腾讯机器翻译每月提供5百万字符的免费文本翻译额度,一般的非翻译工作者,这个量应该足够了。只需要开通机器翻译免费账户,到达月免费限额会自动中断服务,不会扣费。当然,你也可以升级付费账号,超出免费额度后付费使用。

  1. 首先我们需要打开 腾讯云 官网并登录,没有可先点击页面右上角注册账号,登录后需要在右上角的菜单中进行个人实名认证。
  2. 注册后点击机器翻译 TMT页面上的立即使用按钮,会跳转到机器翻译的服务控制台。
  3. 在控制台勾选 我已阅读··· ,然后点击免费试用,按提示免费开通机器翻译服务。为避免超出免费额度后被收费,首次开通建议选择试用版,若以后发现免费版不够用,可以随时改付费版。
  4. 开通后,鼠标放在网页右上角头像上,在弹出的菜单中点击访问管理,然后在左侧菜单选择访问密钥 --> API 密钥管理,进入之后会有一个弹窗提示。
  5. 弹窗的内容是告诉你,在目前界面创建的密钥可以调用账号里的所有腾讯云资源,为保险起见,建议创建一个子账号,然后只给这个子账号分配需要的服务对应权限,最后使用子账号创建密钥,这样更安全。
  6. 此时有两种方法:
    • 一种是忽略提示,点击 继续使用 ,然后点击 新建密钥 按钮,表格里就会添加新的密钥,能看到Secretld和SecretKey。这样操作简单,但一旦泄露风险较大。
    • 另一种操作繁琐一些,但更安全。点击 切换使用子账号密钥 ,会跳转到新建用户页面。点击自定义创建,选择 可访问资源并接收消息 ,然后点击 下一步 。新的页面中设置用户信息:填写用户名,备注可填写 机器翻译接口-GoldenDict访问方式:只勾选编程访问。其他不必填写,完成后点击下一步。新的页面中搜索“ 机器翻译 ”,勾选QcloudTMTFullAccess(机器翻译(TMT)全读写访问权限) 即可,然后点击下一步。最后的页面用于审阅之前几步填写的信息,确认无误后点击 完成 即可。此时就会看到这个子账户的SecretId和SecretKey
  7. 完成上面操作后,保持页面,等待下面部署Python程序阶段使用SecretIdSecretKey

部署Python程序:

注意,笔者Python初学者,技术很菜,目前发现程序有个Bug,如果输入的Text包含“®™”这类符号,会报错退出。

安装Python3.3.6以上,到官网下载,装的时候注意勾上pip和PATH。

安装腾讯云SDK:

pip install --upgrade tencentcloud-sdk-python

中国大陆地区的用户可以使用国内镜像源提高下载速度,例如:

pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python

GitHub下载TencentTrans.pyfavicon.ico两个文件,随手丢在合适的地方。目录不要太深,注意不要有空格。

文本编辑器打开 TencentTrans.py ,修改以下两行中的内容为上一大步中申请的ID和KEY。

SecretId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
SecretKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

GoldenDict 中点击 编辑 --> 词书 ,在 来源 选项卡中选择 程序 选项卡。点击 添加 按钮,类型选择 纯文本 ,名称填写 腾讯翻译君 ,命令行填写 python 文件路径\TencentTran.py %GDWORD% ,图标填写 文件路径\favicon.ico

以上的路径要使用 绝对路径,类似于这样格式 python C:\GoldenDict\XXX\Python.py , C:\GoldenDict\XXX\favicon.ico

填写完成后将前面的已启用打勾,点击确定按钮完成配置。这样就可以使用啦!

参考资料:

J-Link V9 使用7.x工具包提示 Probe 为 Clone 产品的处理

前言:

今天找出了以前低价拍到的 STM32_F4VE 开发板,又找到了网友处以散件形式低价购得的 J-Link V9 ,去 SEGGER 官网下载了 JLink 工具包并进行了安装。到了测试连接时却出现了问题,J-Flash 弹出以下警告:

The connected probe appears to be a J-Link clone.Using the J-Link software with a clone is forbidden and illegal.Proper operation cannot be guaranteed.

翻译成中文大致如此:当前连接的探针(调试器)看起来是一个 J-Link 复制品(盗版)。在复制品上使用 J-Link 软件不被允许也不合法。我们无法保证它能正常工作。

看了一下固件版本,固件应该是还是16年的魔改版本,也没有像原版一样的自动更新功能。这样肯定不行,于是我搜索了一下该如何处理。通过一番搜索,发现出现此问题的原因貌似是因为SEGGER升级了盗版识别机制,加入了对 SN 和扩展功能方面的验证,从而导致被检测为 Clone品,具体参考该贴

注意:本文所述方法仅针对使用 STM32F205RC/RE 主控的 J-Link V9 复制品,随着厂商更新,无法保证方法一直有效。刷写固件存在设备报废的风险,请自行斟酌,谨慎操作!

处理办法:

通过网友们的帖子了解到,解决此问题的方法,无非就是刷固件、改序列号、清除掉魔改添加的功能。经过一番尝试,发现最简单的方法就是刷入某不具名大佬提供的 Bootloader ,连接电脑打开 J-Link Configurator ,等待其自动升级最新固件即可。这样的结果是 SN 值会变成 -1,当然也有办法自定义 SN ,但神奇的是,SN 值为 -1 并不影响其功能。

相关文件已存储于IPFS网络,链接在此

具体过程:

相信您已经安装了 J-Link 软件包,对此这里不再赘述。使用一个可以正常工作的 J-Link 连接此异常 J-Link 的 SWD 调试接口,J-Link V9 标准克隆版通常会在靠近 PCB 边缘有四到五个预留焊盘,一般从靠近 F205 一端开始,依次为 VCC、GND、SWDIO、SWCLK 。没有大鸡也可以用 J-Link OB ,只是需要用 OB 的 SN 在 Segger J-Link keygen 中生成一个 J-Flash 许可添加到 J-Link License Manager 中,因为 J-Link OB 默认是不具有 J-Flash 使用许可的 。注意:视情况,目标板可能需要单独供电。

保证 SWD 接口稳固连接,打开 J-Flash 。在欢迎页选择 Create new project --> Start J-Flash 。Target device 中点击 ··· 按钮,根据实际情况搜索并选择 STM32F205R* ,Target interface 选择 SWD,Speed 选择1000kHz,如果后面无法建立连接,建议减小速率。最后点击 OK

将解压后的 bootloader.bin 文件拖入 J-Flash,设置起始地址为 0x8000000 ,点击 OK。点击 Target --> Connect 建立连接,点击 Manual Programming --> Erase Chip 擦除原始固件,点击 Manual Programming --> Program&Verify 刷入 Bootloader 并校验。

如果您希望自定义 J-Link 的 SN,此时可以关闭 Bootloader 数据窗口,点击 Manual Programming --> Read back --> Entire chip 回读整个芯片数据,然后回读的数据会显示在数据窗口中。通过Go To: 功能快速跳转到地址 0x800BF00 ,通过修改0x800BF000x800BF03 四个字节可以定义 J-Link V9 的 SN 。例如:0x800BF000x800BF03 依次是 7D、C3、C0、01,则 SN 为 01C9C37D = 29999997。按自己意愿修改后参考上面步骤重新全片擦除并写入即完成 SN 的自定义。如果不需要自定义 SN,可跳过本段。

拆除固件烧录的相关连接,将刷好 Bootloader 的 J-Link V9 通过 USB 连接到计算机,打开 J-Link Configurator ,会自动弹出固件修复窗口,等待其完成最新版本固件的刷入,然后拔下 USB 重新连接,J-Link V9 即可正常使用了。如果没有自定义SN,会看到硬件SN是-1,如果有自定义SN,则会显示自定义的SN。

参考:

USB Type-C 设备插入电脑显示 BillBoard设备

前言:

笔者有一台带有 Type-C 接口的口袋电脑,近期为其买了一个C口转A口+以太网口+TF&SD卡+HDMI+PD的强大 USB 扩展坞 ,笔者注意到,扩展坞插入电脑后会在设备管理器中显示一个名为 USB 2.0 BILLBOARD 的设备。众所周知,BillBoard意思是公告板,为什么会出现这样的设备呢?笔者经过一番查证,以下便是它的前因后果。

BillBoard 是什么?

USB-IF 协会于2014年公布了 Power Delivery v2.0 的规格,同时也在原本的USB Class定义了新的分类:Billboard Device Class v1.0。

USB-C 即 Type-C 接口已经广泛应用于各种设备中,相比之前的传统 USB 接口,Type-C 接口具有结构小巧、支持正反插、更高的电力传输,以及可选模式(如 DisplayPort ,即 DP 视频传输/又如 Thunderbolt,即雷电接口)等特性。其中,对于各种可选模式的支持,离不开 Type-C 接口物理结构的支持。Type-C 接口中提供了四组差分信号,他们成中心对称排列于上下两排触点,每排都分别有1收1发,以支持正反插。Type-C 接口可用的场景很多(比如视频音频传输、PD 快充),不再像传统USB接口那样单纯的提供数据传输。有些功能通过简单的外围电路进行识别,如 USB2.0、DCP、Accessory Mode(附件模式);而有些则需要通过 USB 控制器实现,比如 USB3.0 通信时,USB 控制器负责进行协商,分配差分信号通路。

正如前文所述,Type-C 接口除了传统的数据传输,还支持一些其他的功能。而这些功能在设计时是可选的。比如,并不是用了 Type-C 口的设备就一定会有 DP 视频输入输出功能,毕竟需要考虑产品实际需要的功能。这方面,Type-C 定义了一种模式称之为 Alternate Mode(交替模式)。USB 协会为每一个标准的可选模式定义了唯一的标准编码,Host 和 Device 的 USB 控制器通过此编码沟通是否支持某种模式,识别进入退出 Alternate Mode 的相关的命令是由 USB PD 组织 VDM 命令发生的,相关信号的传输是通过 CC 引脚(配置通道)进行的。

这里举一个例子:一台支持通过 Type-C 进行 DP 视频输出的笔记本电脑,和一台 Type-C 接口的 DP 显示器连接,这种显示器一般带有USB扩展坞功能。此时,电脑作为 USB Host ,显示器作为 Device。它们都支持 DP,USB 控制器沟通后会将两路差分对(即一个发送和一个接收)分配给 USB 数据,另两路差分对分配给DP 用作视频流传输。

而如果 DP 显示器通过 Type-C 接口插在了不支持 DP 的显示器上,结果就是作为 Device 的显示器与做为 Host 的计算机沟通进入 Alternate Mode 失败。针对此情况,USB 协会定义:Device 端产生一个 BillBoard 设备,以此通知Host端与用户了解此问题。

综上所述:BillBoard是Device端提供支持的,用于 Device 端发现自己支持的功能没有被 Host 端接受时触发,以提醒该事件。

什么情况会出现 BillBoard?

上文提到,出现 BillBoard 设备表示 Device 端发现自己支持的功能没有被 Host 端接受。所以,电脑出现此提示一般有两个原因:

  1. Host端不支持相应的 Alternate Mode。比如 Type-C 口 DP 显示器通过 Type-C 连接线插在了不支持Type-C 口输出 DP 的电脑上。笔者的破电脑就是这个情况,这种情况自然是无解的,也是正常的。能做的只是咱们忽略这个提示,不使用相关功能。
  2. Host 端支持相应的 Alternate Mode,但设备之间使用了 USB A to Type-C 线。即使用 USB A to Type-C 线,Type-C 的那一头插在 Device 端,USB A 口插在了 Host 端。而 A 口显然是无法提供 Alternate Mode 支持的,因为它没有 Type-C 接口那么多的差分对提供。这种情况换一根双头满 Pin 的 C2C 线就好了。

USB通信协议非常复杂,笔者水平有限,如有错漏,欢迎指正。

参考:

Arduino MKR Zero 上手笔记

前言:

笔者最近参与了 DigiKeyB站的Arduino盘点抽奖活动,有幸获得了一块Arduino MKR ZERO开发板。与复制品很常见的UNO和Mega2560不同,MKR ZERO使用的是 Microchip 的 SAMD21处理器 ,内核为32位的ARM Cortex-M0+ ,而前两者是8位的 AVR内核。这种原版的开发板我是万万买不起的,这次既然有幸得到,自然要点灯为敬。

Arduino MKR Zero——DigiKey零件页面

以上得捷页面提供了部分信息,话说看其价格也许比某宝便宜一些?(但不知道加上运费怎么样?

简介:

Arduino MKR ZERO 开发板在较小的尺寸上提供了不错的性能。MCU采用 32 位 ARM Cortex® M0+ 内核,且内有DAC。开发板提供了Micro USB & 电池双供电以及电池充电电路,且板载使用SPI接口的MicroSD连接器和一枚ECC508加密IC。如此,该开发板可以在不添加其他硬件的情况下播放音频文件。

警告:与大多数Arduino和Genuino板不同,MKRZero的运行电压为3.3V。I/O引脚可以承受的最大电压为3.3V。对任何 I/O 引脚施加高于 3.3V 的电压可能会损坏电路板。

技术信息:

技术信息
微控制器 SAMD21 Cortex‐M0+ 32bit low power ARM MCU
开发板供电电源 5V Max Micro USB
支持的电池 单节 Li-Po,3.7V ,至少700mAh容量
3.3V最大输出 600mA
5V最大输出 600mA
IO工作电压 3.3V Max
数字I/O数量 22
PWM引脚 12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, A2 - or 18-, A4 - or 19)
串口数量 1
SPI数量 1
I2C数量 1
模拟输入引脚数量 7 (ADC 8/10/12 bit)
模拟输出引脚数量 1 (DAC 10 bit)
外部中断引脚 8 (0, 1, 4, 5, 6, 7, 8, A1 ‐or 16‐, A2 ‐ or 17)
单个 I/O 最大电流 7 mA
容量 256K Flash (8K Bootloader),32K SRAM,NO EEPROM
时钟频率 48MHz (Main),32.768kHz(RTC)
板载LED引脚 32 (PB08) LED_BUILTIN suggested

开发资料:

开发环境部署:

Arduino MKR Zero 是Arduino官方出品的开发板,其使用的开发环境自然是Arduino IDE。

首先到 Arduino IDE下载页 下载Arduino最新的Arduino 1.8,并按提示完成安装,安装路径建议不要有空格或中文。

安装完成后打开Arduino IDE,接下来要安装SAMD Core。点击 工具 > 开发板: > 开发板管理器... , 在弹出的窗口中将显示所有可用的开发板。

在搜索框中以 samd 为关键词搜索,在搜索结果中找到Arduino SAMD Boards (32-bits ARM Cortex-M0+) 并点击安装,安装期间若有驱动安装提示请允许,否则无法正常上传固件。若安装有困难,可能需要使用代理。

点击 工具 > 开发板: > Arduino SAMD Boards (32-bits ARM Cortex-M0+ > Arduino MKRZERO 选择开发板型号,点击 工具 > 端口 > COMxx(Arduino MKRZERO) 选定开发板串口。这时点击 工具 > 取得开发板信息 可以读到开发板信息即表示通信正常。

点灯:

点击 文件 > 示例 > 01.Basics > Blink ,打开闪灯示例程序,为了与出厂预置闪灯程序区分,将delay延时函数的参数改为250(代码如下),然后点击 上传 ,此时Arduino IDE会开始编译,编译完成后自动上传。等待其成功上传后观察板载LED闪烁速度,变快了便是成功了。

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(250);                       // wait for a second
}

参考: