单片机给电脑发送数据
配置USART1配置为异步通信(Asynchronous)字母A开头为1为异步通信,与同步通信区分开
PA9配置为串口1发送(USART1_TX) PA10配置为为串口1接收(USART1_RX)
参数设置(parameter):只需要配置波特率(Baud Rate)为9600 Bits/s,其他值默认(看考试时要求115200还是9600)
使能串口1中断
在系统内核(Systerm Core)里关闭之前配置的PA0外中断EXTI_0并且重新配置PA0为输入模式
将PA9和PA10改为复用开漏输出
中断优先级分组改为组2
把系统时钟的中断优先级改为3,由于HAL_Delay()为系统时钟中断,这样配置可以让我们在延时时被别的中断打断,配置USART中断为1
打开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里并删除多余项进行串口初始化
此时我们编译有很多报错,我们打开source先全局编译一下使usart.h弹出,接着我们需要先定义外部扩展变量huart1在source的usart.h里找到并粘贴
此时还有很多报错,因为我们的底层文件里缺少了下面这四个文件,需要我们手动在魔方块里添加
添加后还是有报错,因为在底层的定义里uart没有打开,
我们找到main.h里的#include "stm32g4xx_hal.h"里的#include "stm32g4xx_hal_conf.h"里的
#define HAL_UART_MODULE_ENABLED和#define HAL_USART_MODULE_ENABLED删去注释即可
在main.c中进行串口的初始化
在test的msp文件里配置中断优先级分组为组2,并使滴答定时器的抢占优先级和子优先级为3,0
将source中it.c的中断函数移植到test里,当usart中断产生后会执行此函数
我们看到有一个报错,因为在it.c里我们没定义这个变量,最方便的方法是把#include "usart\bsp_usart.h"写入it.c里,因为在这个变量里定义了报错的变量huart1
先编写一个减速函数,控制系统500毫秒进入一次Usart_Proc()
最终函数:此函数写在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)
电脑给单片机发送串口信息,让单片机来处理信息
首先找到官方给的历程由IT可见接收函数是一个中断接收函数
HAL_UART_Receive_IT(&huart1, rx, 1) //串口1接收1个字节到rx这个变量里,rx可自定义名字
在单片机从串口收到一个数据后会立马跳转到中断里,所以我们现在开始写中断处理函数
当中断发生时即调用了Callback回调函数
即接收中断发生时it.c里的IRQHandler会调用main.c函数里的Callback函数,内容全部写在Callback函数即可
更粗略的说就是当中断发生时会立马执行Callback回调函数
现在我们来编写中断回调函数,当我们进入到中断时我们让灯点亮一下熄灭一下,
用中断的形式接收串口消息必须保留HAL_UART_Receive_IT(&huart1, &rxbuff, 1);
当我们在中断里采用延时函数时滴答定时器的优先级需要比串口中断的优先级高才能执行延时
所以我们需要手动修改滴答定时器的优先级
main.c里的HAL_Init() goto
原来是15,修改为0
编写回调函数,我们要求每发送一次数据就让LED灯全亮300毫秒后全灭
HAL_UART_Receive_IT(&huart1,&rxbuff,1)
&huart1 :接收的串口
%rxbuff :接收的数据存放在这个参量里
1:我们要接收的数目
要写在回调函数里(牢记就行)
打开官方给的串口调试助手进行配置
当中断发生时跳转到it.c里执行 HAL_UART_IRQHandler(&huart1);,接着这个函数会调用中断回调函数,执行完中断回调函数再回到主函数里