赞
踩
目录
MDK5的安装包网上教程很多,可以去野火或者正点原子官网下载。注意安装的路径不能带有中文,否则可能会影响后续使用。
芯片包根据所使用的开发板型号,在MDK5官网下载https://www.keil.com/dd2/pack/#!/%23eula-container。本次使用的开发板型号为:GD32C103CBT6,需要下载GD32F10x(如图1-1)与STM32F1(如图1-2)的芯片包,下载完成后安装在MDK5对应文件夹内,安装路径分别为:keil\Keil_V5\ARM\PACK\GigaDevice,keil\Keil_V5\ARM\PACK\Keil
图1-1
图1-2
在官网下载STM32CubeMX安装包https://www.st.com/zh/development-tools/stm32cubemx.html,进入官网,点击获取软件跳转至下载页面,如图1-3所示,点击下载后需要填写邮箱,按照邮件指示进行下载。注意安装的路径不能带有中文,否则可能影响后续使用。
图1-3
本次需要用到的硬件有:USART转USB串口工具(三线接口)、下载调试工具STLink(四线接口),其中USART转USB串口工具需要下载对应驱动,一般win10系统自带,如果没有的话可以去我的网盘下载。
网盘链接:https://pan.baidu.com/s/1G-NNH8_FyCKeVn5BFr2TRw?pwd=2222
提取码:2222
按照:软件\CH340驱动(USB串口驱动)_XP_WIN7共用 路径找到CH340驱动下载,并按照文档指示进行安装,安装完成后查看设备管理器,出现端口且没有问号跟感叹号表示驱动安装成功,如图1-4所示。
图1-4
串口助手随便下载一个即可,可以去野火的官网下载https://doc.embedfire.com/products/link/zh/latest/index.html,进入网盘挑选一个合适的版本下载如图1-5所示。
图1-5
点击File/New Project创建一个新项目如图2-1所示,
图2-1
根据开发板使用的CPU来选择具体型号,本次使用的开发板CPU为GD32C103CBT6,所以对应选择stm32f103xb,如图2-2所示双击红框位置进入配置页面。
图2-2
进入工程后在System Core目录下打开 RCC 选项,选择 Crystal/Ceramic Resonator,即使用外部晶振作为时钟源,如图2-3所示。
图2-3
这个工程只需简单点亮一个LED灯,用于检验程序能否顺利执行,因此只需要配置一个IO口即可,这里选择控制蓝色LED的引脚PB15(结合开发板原理图来选择引脚),通过搜索框搜索可以定位 IO 口的引脚位置,图中会闪烁显示,配置 PB15 的属性为 GPIO_Output,如图2-4所示。
图2-4
进一步配置IO口的具体属性,在 System Core目录下的GPIO进行配置,如图2-5所示出现小勾代表GPIO口使能。
图2-5
由于笔者使用的板子没有外部晶振,只能选择内部高速时钟HSI,只是实现一个串口功能,所以频率选择的8MHz,如图2-6所示,实际上就是系统默认状态,可以不用修改。
有兴趣的可以去学习一下时钟树的配置,选择想要的时钟。
图2-6
为了防止出现,烧录以后仿真器无法连接的情况,在 System Core目录下将 SYS 里面的 Debug 设置成Serial Wire, 如图2-7所示,这样问题得到解决。
图2-7
接着选择 Project Manager 选项,配置工程的名称,路径,使用的 IDE 工具,堆栈大小,如图2-8所示。注意不要使用中文路径和工程名称。
图2-8
在Code Generator目录下勾选如图2-9所示的选项,第一个选项是只创建需要的库函数,勾选后可以加快函数执行效率;第二个选项是分别创建.c/.h文件,使得函数可读性更高。
图2-9
点击右上角 GENERATE CODE, 在设定的路径成功生成代码,选择Open Project打开工程。
点击魔术棒按钮进入Device设置界面,选择对应的芯片包,如图3-1所示。
图3-1
进入Target界面,勾选使用微库,点击OK确定选项并编译程序,观察是否能够成功运行,如图3-2所示。
图3-2
再次点击魔术棒按钮进入Debug设置界面,选择对应的下载调试工具,点击Settings进入设置界面,如图3-3所示。
图3-3
点击进入Flash Download设置界面,勾选Reset and Run,点击Add添加芯片对应的内存,点击确定保存设置,如图3-4所示。
图3-4
如图3-5所示连接好硬件,注意三线接口中,黑线是GND,绿色是TX,白线是RX。连接好硬件后编译,下载,LED灯被点亮表明程序执行无问题。
图3-5
通过观察GD32C103CB原理图可知,该开发板的三针串口引脚由USART1引出,如图4-1,图4-2所示。
图4-1
图4-2
通过对比两款芯片USART的状态寄存器、数据寄存器、波特率寄存器、控制寄存器可以发现两者的USART寄存器控制逻辑数完全一样,所以只要基地址能够对应,就能实现库函数上的兼容。查询数据手册发现GD32C103CB的USART1寄存器地址,对应的是stm32f103cb的USART2寄存器地址,如图4-3、4-4所示,因此需要配置stm32F103CB的USART2。
图4-3 GD32C103CB串口USART1地址范围
图4-4 STM32F103CB串口USART2地址范围
返回STM32CubeMX,如图4-5所示,在Pinout界面的Connectivity配置USART2。:
步骤3,Mode模式中选择Asynchronous异步通信。
步骤4,GPIO Settings会默认配置引脚,选择对应的引脚即可,若无问题无需修改。
Parameter Settings会默认配置USART结构体参数,可以不进行改动,需要注意的是在进行串口调试时,串口调试助手的参数需要与之一一对应,如图4-6所示。
图4-5
图4-6
由于串口数据回显功能需要使用到中断,因此需要将中断功能勾选上,如图4-7所示。其中Preemption Priority为抢占优先级,Sub Priority为子优先级(也叫响应优先级)。
图4-7
设置完毕后点击右上角 GENERATE CODE, 在设定的路径成功生成代码,此时MDK5会弹框显示是否需要加载新模块,点击是;接着会弹出找不到对应芯片,按照3.1、3.2再手动选择一遍芯片,配置下载调试工具即可。
此时生成的usart.c文件会出现雪花的标志,右击选择Option选项如图4-8,点击Defaults,再点击OK即可,如图4-9所示。
图4-8
图4-9
在main函数中调用发送函数,测试串口是否配置成功,能否成功发送数据。HAL库中发送数据共有三种模式:阻塞式、中断、DMA转运,此处采用最简单的阻塞式进行测试,如图4-10所示。需要注意的是由于使用了strlen函数,需要在主函数中#include “string.h”。
图4-10
HAL_UART_Transmit ( UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout )函数可以在stm32f1xx_hal_uart.c中找到,属于HAL库封装好的函数,直接调用即可。
第一个参数为USART的地址,USART的地址可以在usart.c中找到,结构体创建的句柄为huart2,这个结构体中包含了USART的波特率、数据位、停止位、校验位等信息,如图4-11所示,MX_USART2_UART_Init()函数对次结构体进行了初始化;
第二个参数为想要发送的数据;
第三个参数为发送数据的大小;
第四个数据为发送数据的时间,单位为ms。
图4-11
打开串口调试助手,设置好波特率等参数,对程序进行编译下载,可以看到数据被发送过去,表明USART的配置没问题,如图4-12所示。
图4-12
数据回显功能需要使用到RXNE中断功能,如图4-13所示,当DR寄存器收到数据时,RXNEIE被置1,进入中断函数。编写中断函数,将DR寄存器收到的数据读出来,RXNEIE恢复为0,再将读出的数据重新写回DR寄存器,便实现了数据的回显。
图4-13
在USART初始化函数中对中断函数进行使能,如果DR寄存器中有数据,进入中断函数,如图4-14所示。
图4-14
中断函数如图4-15所示,该中断函数生成在stm32f1xx_it.c中,将原本的HAL_UART_IRQHandler(&huart2)注释掉,编写自己的函数。
如果串口有数据就会进入中断函数,函数会获取RXNE判断是否为设定值,如果不为设定值,表示DR寄存器有数据,于是调用READ_REG函数读DR寄存器,最后将读到的数据利用WRITE_REG写回DR寄存器,于是实现了串口的数据回显。
图4-15
最后下载编译程序,在串口调试助手输入框输入:数据回显测试,接收区域回显数据,发送字节12,接收字节由21增长为33,功能实现,如图4-16所示。
图4-16
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。