蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)

串口的发送

单片机给电脑发送数据

STM32cubeMX配置

Connectivity连接配置

配置USART1配置为异步通信(Asynchronous)字母A开头为1为异步通信,与同步通信区分开

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第1张图片

PA9配置为串口1发送(USART1_TX)  PA10配置为为串口1接收(USART1_RX)

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第2张图片

参数设置(parameter):只需要配置波特率(Baud Rate)为9600 Bits/s,其他值默认(看考试时要求115200还是9600)

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第3张图片

使能串口1中断

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第4张图片

GPIO配置

在系统内核(Systerm Core)里关闭之前配置的PA0外中断EXTI_0并且重新配置PA0为输入模式

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第5张图片

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第6张图片

将PA9和PA10改为复用开漏输出

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第7张图片

中断NVIC配置

中断优先级分组改为组2

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第8张图片

把系统时钟的中断优先级改为3,由于HAL_Delay()为系统时钟中断,这样配置可以让我们在延时时被别的中断打断,配置USART中断为1

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第9张图片

Keil编写代码

初始化( IO配置,串口通讯配置,中断配置 )

打开HAL_05_USART_TEST里的keil工程,分别在bsp文件夹里的src和inc里创建usart的bsp_usart.c和bsp_usart.h文件,并在工程的魔方块里添加bsp_usart.c文件,接着执行初始化工作

将SOURCE里的usart.c代码复制到test的bsp_usart.c里并删除多余项进行串口初始化

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第10张图片

此时我们编译有很多报错,我们打开source先全局编译一下使usart.h弹出,接着我们需要先定义外部扩展变量huart1在source的usart.h里找到并粘贴

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第11张图片

此时还有很多报错,因为我们的底层文件里缺少了下面这四个文件,需要我们手动在魔方块里添加

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第12张图片

添加后还是有报错,因为在底层的定义里uart没有打开,

我们找到main.h里的#include "stm32g4xx_hal.h"里的#include "stm32g4xx_hal_conf.h"里的

#define HAL_UART_MODULE_ENABLED和#define HAL_USART_MODULE_ENABLED删去注释即可

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第13张图片

在main.c中进行串口的初始化

配置中断优先级分组

在test的msp文件里配置中断优先级分组为组2,并使滴答定时器的抢占优先级和子优先级为3,0

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第14张图片

将source中it.c的中断函数移植到test里,当usart中断产生后会执行此函数

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第15张图片

我们看到有一个报错,因为在it.c里我们没定义这个变量,最方便的方法是把#include "usart\bsp_usart.h"写入it.c里,因为在这个变量里定义了报错的变量huart1

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第16张图片

编写串口发送函数Usart_Proc()

先编写一个减速函数,控制系统500毫秒进入一次Usart_Proc()

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第17张图片

在买开发板送的资料里复制串口发送要用到的代码(如上图)

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第18张图片

定义串口发送专用函数变量

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第19张图片

最终函数:此函数写在while(1)里,每隔500ms在串口调试助手里打印 xxxx:Hello,world.

%04d :四位数的整数,不够四位左边自动填充0

counter:从0开始一直+1

sprintf(str, "%04d:Hello,world.\r\n", counter);    :  把%04d:Hello,world.存入str这个数组

当counter = 1时打印的值为 0001:Hello,world

HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);  :串口发送函数

原函数:

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

&huart1 : 通过串口几来发送(UART_HandleTypeDef *huart)

(unsigned char *)str :要发送的数据内容(uint8_t *pData)

strlen(str) :发送的数据长度  ( strlen() 函数用来求括号里字符串的长度)   (uint16_t Size)

50:多长时间之内发送完  (uint32_t Timeout)

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第20张图片

串口的接收

电脑给单片机发送串口信息,让单片机来处理信息

首先找到官方给的历程由IT可见接收函数是一个中断接收函数

HAL_UART_Receive_IT(&huart1, rx, 1)   //串口1接收1个字节到rx这个变量里,rx可自定义名字

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第21张图片

在单片机从串口收到一个数据后会立马跳转到中断里,所以我们现在开始写中断处理函数

当中断发生时即调用了Callback回调函数

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第22张图片

即接收中断发生时it.c里的IRQHandler会调用main.c函数里的Callback函数,内容全部写在Callback函数即可

更粗略的说就是当中断发生时会立马执行Callback回调函数

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第23张图片

现在我们来编写中断回调函数,当我们进入到中断时我们让灯点亮一下熄灭一下,

用中断的形式接收串口消息必须保留HAL_UART_Receive_IT(&huart1, &rxbuff, 1);

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第24张图片

当我们在中断里采用延时函数时滴答定时器的优先级需要比串口中断的优先级高才能执行延时

所以我们需要手动修改滴答定时器的优先级

main.c里的HAL_Init() goto

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第25张图片

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第26张图片

原来是15,修改为0

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第27张图片

编写回调函数,我们要求每发送一次数据就让LED灯全亮300毫秒后全灭

HAL_UART_Receive_IT(&huart1,&rxbuff,1)

&huart1 :接收的串口

%rxbuff :接收的数据存放在这个参量里

1:我们要接收的数目

要写在回调函数里(牢记就行)

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第28张图片

打开官方给的串口调试助手进行配置

蓝桥杯嵌入式——USART程序设计(发送TX) &(接收RX)_第29张图片

总结:

当中断发生时跳转到it.c里执行 HAL_UART_IRQHandler(&huart1);,接着这个函数会调用中断回调函数,执行完中断回调函数再回到主函数里

你可能感兴趣的:(单片机,嵌入式硬件)