GD32 示波器项目软件部分重难点及相关疑问解决
0. 序言
嘉立创 GD32 示波器项目
主要元器件
1. 下载环境搭建
1.1 两种下载方式对比
- DAP下载器下载:不需要反复插拔 BOOT,在Keil中直接烧录;但需要额外的调试器
(笔者注:其实用一般的ST-Link也行,可以代替DAP下载器) - DFU下载模式:只需要一根串口线即可,但需要反复插拔BOOT+生成hex文件+专用下载程序烧录。
1.2 Keil 5报错:One or more Devices Family Pack Devices are not present.
这是因为需要用到的库没有安装好
解决办法:去keil官网下载所需要类型的库即可。
链接:https://www.keil.arm.com/devices/
比如我这里缺少的是GD32E23x的库,点击官网链接,搜索GD32E23x,然后点击CMSIS Pack的下载链接即可:
1.3 问题 Error #543: Device () not found, pack '' is not installed
*** Using Compiler 'V5.06 update 1 (build 61)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'GD32E231C_START'
Error instantiating RTE components
Error #543: Device () not found, pack '' is not installed
Error #540: 'ARM::CMSIS:CORE:5.0.2' component is not available for target 'GD32E231C_START'
Target not created.
Build Time Elapsed: 00:00:00
即使安装包已经正确下载,还是出现这个错误,可以尝试升级 Keil。(可以查看自己的Keil版本,我的是5.15版本,出现了这个问题)一网友回答Keil 5.27就没这个问题了,笔者升级到了最新版:5.38
2. GPIO 输入实验:独立按键
独立按键有两种接法:
- GPIO口上拉(此时按键下拉接地);
- GPIO口下拉(此时按键上拉接VCC);
按键一侧接电源,GPIO需要设置为下拉,也就是默认为低电平,通过判断对应GPIO引脚为高电平,从而判断按键是否按下。
按键一侧接GND,GPIO需要设置为上拉,也就是默认为高电平,通过判断对应GPIO引脚为低电平,从而判断按键是否按下。
底板都是接地的,因此GPIO应该配置为上拉。
3. USART实验:实现串口发送
3-1 串口通信协议复习
串口在进行通信的时候会按照数据包的形式进行发送,帧格式如下所示。
串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由7位数据位组成,接着是一位校验位,最后是停止位。停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
3-1 串口GPIO配置
主要关注其端口模式的设置:
//端口模式设置(设置为复用模式,空闲状态为高电平,因此设置为上拉)
gpio_mode_set(GPIOA, GPIO_MODE_AF/*复用模式*/, GPIO_PUPD_PULLUP/*默认上拉*/, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF/*复用模式*/, GPIO_PUPD_PULLUP/*默认上拉*/, GPIO_PIN_10);
初始化整体程序:
/*
*@func:初始化串口0
* USART0_TX--->PA9
* USART0_RX--->PA10
*/
void Init_usart0(void)
{
//使能时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
//复用功能设置
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
//端口模式设置(设置为复用模式,空闲状态为高电平,因此设置为上拉)
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
//输出参数设置(输出设置为推挽输出)
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);
//RX//gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);
//复位USART0
usart_deinit(USART0);
usart_word_length_set(USART0, USART_WL_8BIT); //8位数据位宽
usart_stop_bit_set(USART0, USART_STB_1BIT); //1位停止位
usart_parity_config(USART0, USART_PM_NONE); //无校验位
usart_baudrate_set(USART0, 115200); //波特率
usart_receive_config(USART0, USART_RECEIVE_ENABLE); //接收使能
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); //发送使能
//使能串口0
usart_enable(USART0);
}
3-2 感触:
GD32在复用方面做的挺方便,有专门设置复用功能的函数和表:
GPIO引脚默认是作为普通IO使用,当需要使用外设功能时,需要打开对应的复用模式,在gd32e23x_gpio.h中可以查找到设置复用功能的函数。也可通过附件资料中的《GD32固件库使用指南》与《GD32E230数据手册》查看该函数与复用功能的详细说明。
//复用功能设置
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
该函数有三个参数:
第一个参数是配置引脚端口;
第二个参数是复用功能,此处选择选择复用功能1,对应是串口0的USART0_TX,USART0_RX;
第三个参数是实际的引脚号;
GD32复用功能表
4-EC11的中断实验——NVIC&EXTI
请参考我的文章:《EC11的中断实验——NVIC&EXTI》
5-ADC配置
关于ADC的前端输入和信号调理电路,请看文章 《示波器基础知识 & GD32示波器项目ADC输入电路分析》,
从该文章可以得出结论:即单片机ADC的GPIO的输入电压Vo与测量电压 Vi的关系(Vin未缩小50倍时):
参考文章:
1. 《202:简易数字示波器项目文档》:https://www.yuque.com/wldz/jlceda/dso
2. 缺乏GD32E23x库问题解决:原文链接:https://blog.csdn.net/ITach666/article/details/135972094
3. 《Error #543: Device () not found, pack '' is not installed》:https://club.szlcsc.com/article/details_39590_1.html
4. 关于旋转编码器(EC11)的使用(判断旋转方向,按键处理):https://blog.csdn.net/Simon13_11/article/details/136049719
5. 一篇文章带你了解——EC11编码器:https://blog.csdn.net/Xhw3f586/article/details/131183406
6. EC11编码器高效驱动方法: https://bbs.21ic.com/icview-3325360-1-1.html