(书接上文。。。)
2. 官方例程
此次评测的“GD32L233C-START开发板”提供6个例程:
(图片来源:..\GD32L23x_Demo_Suites_V1.1.0\GD32L233C_START_Demo_Suites\Docs\User Guide\《GD32L233C-START评估板使用指南_Rev1.0》)
(图片来源:..\GD32L23x_Demo_Suites_V1.1.0\GD32L233C_START_Demo_Suites\Projects\)
例程每个都可以编译后下载到开发板查看效果。
3. “04_串口中断收发”例程简介
其它例程实现的功能都比较简单,本次仅挑“04_串口中断收发”例程来调试、赏析。
介绍:此例程实现功能较为简单,就不贴代码了。简述一下实现过程(只说关键点):
(main.c中)
1. 定义一个存放 00-FF 的数组 tx_buffer[] ;
2. 宏定义计算数组元素个数;
3. 串口0中断使能,中断触发条件:接收缓冲区非空;
4. 串口0中断使能,中断触发条件:发送缓冲区空;
(以上两个顺序不能弄反,为啥呢。。。)
5. while 死等,while条件:发送计数 < 数组元素个数;(没发完就死等)
6. while 死等,while条件:接收计数 < 数组元素个数;(没收完就死等)
7. 判断接收到的数据与数组元素是否相等;
8. 如果结果相同,LED1,LED2,LED3,LED4轮流闪烁;如果结果不相同,LED1,LED2,LED3,LED4一起闪烁。
(gd32l23x_it.c中)
9. 接收中断处理:接收数组元素个数据后关闭串口0接收中断;
10. 发送中断处理:发送完整个数组元素后关闭串口0发送中断;
4. “04_串口中断收发”例程下载、调试
4.1 打开工程
1. 将开发板的GD-Link与电脑连接;(只能连接GD-Link,因开发板的3个USB,只有GD-Link的USB口可以供电)
2. 打开“Keil”,点击“Project”,点击“Open Project...”;
3. 选择 ..\GD32L23x_Demo_Suites_V1.1.0\GD32L233C_START_Demo_Suites\Projects\04_USART_HyperTerminal_Interrupt\MDK-ARM\GD32L233C_START.uvprojx ,此路径为本次选中例程的路径,此 .uvprojx 文件为Keil的工程文件;
4. 打开后的界面如下图所示;
4.2 初步设置
1. 点击“Edit”,点击“Configuration...”;
2. 将“Encoding”改为图中所示的“Chinese GB2312 (Simplified)”,这样就可以写正常的中文注释,不会出现乱码了;
将“Tab size”改为“2”;(此项设置为.c文件缩进设置,设置为2表示缩进2格)
3. 点击“魔术棒”;
4. 弹出的窗口中选择“Debug”,点击“Settings”;
(此“Debug”选项卡为配置调试的选项,使用开发板的GD-Link则保持默认不要做改动)
5. 弹出的窗口中出现下图标志处ID,表示调试器成功读到芯片;
6. 点击“Flash Download”,查看“RAM for Algorithm”处的“Size”大小,我们查阅手册知道该MCU的RAM大小为32Kb,此处的Size为16进制,则应改为 0x8000 ;
(我工程里默认是0x2000,可以正常下载;改为正确的0x8000也可正常使用;但不要改成0x1000,否则就无法下载代码了,此处有一个帖子就是这种情况GD32L233C- START使用J- Link SWD下载报错!!!求解)
7. 点击“1”处的任意一个按钮,编译工程;无报错的话点击“2”处按钮下载程序;
“3”处的按钮为调试,也即常说的仿真;(此处仿真与“步骤4”中的选择有关,如“步骤4”中选择调试器即为硬件仿真;若选择左侧“Use Simulator”则为Keil软件仿真)
(考虑到主题为评测,就不写调试的详细步骤了。我懒~)
5. “04_串口中断收发”例程赏析
5.1 计算数组元素个数
在上述标题3中“2. 宏定义计算数组元素个数;”实现,此处的代码贴出来如下:
// main.c
38. #define BUFFER_SIZE (COUNTOF(tx_buffer))
39. #define COUNTOF(a) (sizeof(a)/sizeof(*(a)))
可以合并为如下一句:
#define BUFFER_SIZE (sizeof(tx_buffer)/sizeof(*(tx_buffer)))
此处 sizeof() 为C标准库函数,作用简单说就是:返回一个对象或者类型所占用的内存字节数。
而我们又知道 数组名 也可表示该数组首个元素地址, *数组名 的格式表示的是该数组首元素的值。
sizeof(tx_buffer) //表示该数组所占用的字节数
sizeof(*(tx_buffer)) //表示该数组首元素所占用的字节数
所以:数组的大小 / 数组首元素大小 = 数组元素个数
(此处的代码我自己看完后有种恍然大明白的感觉,所以专门记录一遍既是加深印象也是供大家赏析,大佬不要嘲笑)
5.2 判断接收到的数据与数组元素是否相等
在上述标题3中“7. 判断接收到的数据与数组元素是否相等;”实现,此处的代码贴出来如下:
//main.c
106. transfer_status = memory_compare(tx_buffer, rx_buffer, BUFFER_SIZE);
187. ErrStatus memory_compare(uint8_t *src, uint8_t *dst, uint16_t length)
188. {
189. while(length--) {
190. if(*src++ != *dst++) {
191. return ERROR;
192. }
193. }
194. return SUCCESS;
195. }
此处将 tx_buffer 、 rx_buffer 和 数组大小 传入 memory_compare()函数 ,我们知道 *数组名 的格式表示的是该数组首元素的值,此处在依次判断 tx_buffer 元素和 rx_buffer 元素是否相同,相同则返回 SUCCESS ,不同则返回 ERROR 。
(此处的代码没有太奇妙的地方,但是我觉得很精干,且是该例程的关键代码,所以贴出来)
结语
评测的搭建开发环境写到这里,以上内容若有错误,请不吝赐教。
下节给MCU来个跑分和移植操作系统(为后续实践项目做做准备工作)。
【注:本文首发于EEWORLD。】
本帖最后由 wadeRen 于 2022-1-19 21:45 编辑
引用: Jacktang 发表于 2022-1-20 07:25 详细 等着楼主的MCU的跑分和移植操作系统,,,
已发了跑分的贴啦GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)