[GD32L233C-START 评测] GD32L233C-START评测——02_2.搭建开发环境、简单调试

wadeRen   2022-1-19 21:45 楼主

(书接上文。。。)

 

2. 官方例程

 

此次评测的“GD32L233C-START开发板”提供6个例程:

02.png

(图片来源:..\GD32L23x_Demo_Suites_V1.1.0\GD32L233C_START_Demo_Suites\Docs\User Guide\《GD32L233C-START评估板使用指南_Rev1.0》)

 

01.png (图片来源:..\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...”;

03-1.png

 

3. 选择 ..\GD32L23x_Demo_Suites_V1.1.0\GD32L233C_START_Demo_Suites\Projects\04_USART_HyperTerminal_Interrupt\MDK-ARM\GD32L233C_START.uvprojx ,此路径为本次选中例程的路径,此 .uvprojx 文件为Keil的工程文件;

03-2.png

 

4. 打开后的界面如下图所示;

03-3.png

 

4.2 初步设置

 

1. 点击“Edit”,点击“Configuration...”;

03-4.png

 

2. 将“Encoding”改为图中所示的“Chinese GB2312 (Simplified)”,这样就可以写正常的中文注释,不会出现乱码了;

    将“Tab size”改为“2”;(此项设置为.c文件缩进设置,设置为2表示缩进2格)

03-5.png

 

3. 点击“魔术棒”;

03-6.png

 

4. 弹出的窗口中选择“Debug”,点击“Settings”;

(此“Debug”选项卡为配置调试的选项,使用开发板的GD-Link则保持默认不要做改动)

03-7.png

 

5. 弹出的窗口中出现下图标志处ID,表示调试器成功读到芯片;

03-8.png

 

6. 点击“Flash Download”,查看“RAM for Algorithm”处的“Size”大小,我们查阅手册知道该MCU的RAM大小为32Kb,此处的Size为16进制,则应改为 0x8000

(我工程里默认是0x2000,可以正常下载;改为正确的0x8000也可正常使用;但不要改成0x1000,否则就无法下载代码了,此处有一个帖子就是这种情况GD32L233C- START使用J- Link SWD下载报错!!!求解

03-9.png

 

7. 点击“1”处的任意一个按钮,编译工程;无报错的话点击“2”处按钮下载程序;

    “3”处的按钮为调试,也即常说的仿真;(此处仿真与“步骤4”中的选择有关,如“步骤4”中选择调试器即为硬件仿真;若选择左侧“Use Simulator”则为Keil软件仿真)

03-10.png

考虑到主题为评测,就不写调试的详细步骤了。我懒~

 

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 编辑

回复评论 (2)

详细

等着楼主的MCU的跑分和移植操作系统,,,

点赞  2022-1-20 07:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复