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

posted @ 2024-03-18 22:47  FBshark  阅读(15)  评论(0编辑  收藏  举报