访问 Arduino 官方网站软件下载页面:https://www.arduino.cc/en/software 提供了多种版本的 IDE 可供选择,最上边的两个一个是在线 IDE,另一个是供下载到本地运行的 IDE。 前者在编辑器方面提供了与桌面版几乎一样的体验,代码会保存在云上,而且不需要安装板载包,还包含了大部分流行的库,如果需要也可以上传自己的库。不过我认为下载 IDE 并在本地开发更适合初学者。 下载软件是免费的,你也可以在下载页面选择捐赠以支持 Arduino 开发团队的工作。下载安装后初次运行会安装一些驱动程序和下载一些包,默认允许即可。 此外还可以使用 Visual Studio Code + PlatformIO 等,后续单独介...
IAR for RL78 使用未声明函数引起的问题
在使用 IAR for RL78 1.30.3 时遇到一个奇怪的问题: 调用一个函数(反转 IO 口电平)时总不能达到预期结果,一通分析也查不出个所以然,最后只能通过反汇编结果分析了一下。向函数传递的是 uint8_t 参数(函数定义 void gpio_toggle(uint8_t port)),使用的却是 16 位的 AX 寄存器,低 8 位存放在 X 寄存器,但进入函数处理时却是从 A 寄存器中取值的(而不是 X),这就导致参数传递错误了。 还发现,奇怪的是在别的地方调用同样的函数却是正常的!传递参数用的是 8 位的寄存器 A: 搞糊涂了,为什么同样的函数在不同文件中调用的结果是不同的呢?而且后续还发现出问题的那个函数所在文件的其他函数也会有类似的问题。于是疯狂地怀疑这儿怀疑那儿,还怀疑是不是这个低版本的编译器存在 Bug 😅 冷静下来后排查了一下编译时的 Warning: Warning[w6]: Type conflict for external/entry "gpio_toggle", in module ... against external/entry in module hal_gpio; prototyped function vs K&R function 其实警告信息说的不够直白,实际的情况是调用了没有声明的函数(没有引用头文件或头文件中没有声明函数),所以加上声明 extern void gpio_toggle(uint8_t port); 就正常了。 反思:我没把这条警告信息当回事儿,想当然地认为编译链接不报错就应该是正确地链接了,如果是链接到找不到的函数会报错的。实在是大意了😂 找不到函数你倒是不要给我瞎传参数啊,报错也好啊!不知道更新版本的 IAR 是否存在同样的问题,年轻人真是不讲武德啊 😎 总结:认真对待每一条警告信息,耗子尾汁儿! 后记:还真是令我印象更深刻了,后续又遇到了这个问题。把一个 enum 参数传递给了函数,但进到函数后却不能正确地得到这个参数,忽然想到以前遇到过类似的问题,一查还真是没有引用相关头文...
旋转编码开关(Rotary Encoder)
旋转编码开关是一种电子开关,可以通过旋转旋钮来控制电路。它通常由一个旋转编码器和一个按键组成。旋转编码器通常由两个部分组成:旋转轴和编码器。旋转轴是一个旋转旋钮,可以通过旋转来控制电路。编码器是一个由两个感应器组成的环形装置,可以检测旋转轴的旋转方向和旋转步数。每次旋转时,编码器会输出一个二进制码来表示旋转方向和步数,从而实现精确的控制。 旋转编码开关通常用于在多个离散状态之间进行选择,如控制音量、调节屏幕亮度等功能。通过旋转编码开关,可以改变电路的连接状态,从而控制设备的功能。 常用的旋转编码开关旋转―周输出 20 个脉冲,每个脉冲代表编码开关旋转了一定的角度,旋转编码开关一般有 3 个或 5 个引脚的,5 脚的比 3 脚的仅多 2 个按键引脚,另外 3 个引脚的功能与只有 3 个引脚的旋转编码开关功能相同,分别实现旋转时输出脉冲,在对编码器进行左旋和右旋时,其输出波形如图1(a)和图1(b)所示。 判断左右旋转有多个方法,比如,A上升沿时B为低电平就表示右旋,B为高电平就表示左旋。要注意处理管脚信号的抖动。 应用电路...
MDK-ARM(Keil)使用 GCC 编译器
MDK 自带的编译器是 ARMCC 或 ARMCLANG(Arm Compiler 6),有时需要使用 GCC 编译器(例如需要使用 GCC 编译的静态库)。当然,用 GCC 不一定非要用 MDK IDE。 先去 ARM 官网下载 GNU 工具链(Arm GNU Toolchain) Arm GNU Toolchain is a community supported pre-built GNU compiler toolchain for Arm based CPUs. Arm GNU Toolchain releases consists of cross toolchains for the following host operating systems: GNU/Linux Available for x86_64 and AArch64 host architectures Available for bare-metal and Linux targets Windows Available for x86 host architecture only (compatible with x86_64) Available for bare-metal and Linux targets macOS Available for x86_64 host architecture only Available for bare-metal targets onl...
新唐单片机调试工具 NuConsole
常用调试信息交互方法是使用串口。除此之外还有 Semihosting(半主机)方式,但需要调试接口外连接其他接口(例如 SWD 调试时接 SWO 接口)。 新唐的 NuConsole 则是通过在 RAM 中开辟一块信息块的方式实现通过调试接口(不需要 SWO 等额外接口)交互。也算是一种比较好的调试思路和手段了,不过依然需要试用调试器才能用,虽然不影响单片机的实时性,但也不如串口打印这么简单和通用,只适合开发时使用。 使用时需要将: NuConsole.h/.c、NuConsole_Config.h、NuConsole_Retarget.c 加入工程。此外还要做一些配置工作,详见说明文档 NuConsole_HowTo.pdf(在 C:\Program Files (x86)\Nuvoton Tools\NuConsole 可以找到说明文档和例程)...
ARM 开发板使用 NFS 挂载 Ubuntu 文件夹
采用 NFS 实现远程挂载,ARM 开发板可以直接运行主机上的程序,而不需要下载到开发板上。 1、查看开发板 Linux 内核是否支持 NFS 执行 cat /proc/filesystems, 若有一行为 nodev nfs 则开发板 Linux 内核支持 NFS,反之需要配置内核;也可以使用动态模块的形式编译。 2、主机安装 nfs 服务 sudo apt-get install nfs-kernel-server 配置 nfs 输出目录: vim /etc/exports 在该文件中添加一行: /home/user *(rw,sync,no_root_squash) # 根据实际情况修改 /home/user 为想要的路径就行了 * 表示任意 IP 地址的主机,如果是 192.168.1.100,就表示只允许 192.168.1.100 挂载。 rw: 可擦写的权限 ,ro: 只读的权限。 sync: 资料同步写入到内存与硬盘当中 ;async: 资料会先暂存于内存当中,而非直接写入硬盘。 no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。 主机启动NFS服务: sudo service nfs start # 或者 sudo service nfs-kernel-server restart 3、在开发板上挂载主机上的文件夹 mkdir /mnt/nfs mount -t nfs -o nolock 172.16.9.93:/home/matt /mnt/nfs 172.16.9.93 是主机 IP,/home/user/test 是主机共享目录,/mnt 表示将该共享目录挂载到 ARM 开发板 /mnt 目录下。 错误: mount: wrong fs type, bad option, bad superblock on... 解决方法: sudo apt-get install nfs-commo...