STM32 HAL库串口收发教程详解

        首先配置STM32CubeMX

第一步在系统SYS里的Debug(调试)选项选择Serial Wire(这里使用ST-LINK-V2仿真下载器所以选择该项)。

 第二打开使用外部晶振

 在芯片引脚上点击PC13选择GPIO_Output(即设置GPIO为输出模式)

点击GPIO,点击PC13

在其下方配置引脚:

GPIO out  level 设置成High(高电平)即初始设置成高电平。本处使用的最小系统STM32F103C8T6,其自带LED灯的正极默认接3.3V,负极接PC13引脚,也就是使用这款最小系统则无需接线。当PC13输出低电平时,LED亮起,输出高电平时LED熄灭。

GPIO mode设置成Output Push Pull(推挽输出)

GPIO Pull-upPull down 设置成No pull-up and no pull-down(不上拉也不下拉)

Maximum output speed设置成Low(低速模式)

User Label 名称根据自己喜好命名,也可以不命名这里命名为PC13

串口数据发送有两种方式,一种是阻塞式的,一种是非阻塞式的。阻塞式的顾名思义就是数据发送是一次接一次发送的,也就是上一个数据发送完成才会继续接着发送下一个数据,每次发送数据都按时间顺序排队。而非阻塞式则会立即发送。

首先介绍阻塞式的

在Function中选择

HAL_UART_Transmit (UART_HandleTypeDef *huart, const uint8 t *pData, uint16 t Size, uint32 t Timeout)

这个函数就是阻塞式串口发送数据,第一个参数是UART句柄,指向已初始化的UART外设。指向huart这里使用串口一所以是huart1的地址,第二个参数是需要发送的数据。Txstr1的字节大小使用sizeof来取大小。Timeout是操作超时时间,单位是毫秒。当执行某个操作时,可能会遇到需要等待的情况,比如等待网络响应、等待数据传输完成、等待锁释放等。为了确保程序的执行不会无限期地阻塞在等待状态,我们可以设置一个超时时间(即 timeout),如果在规定的时间内操作未完成,则会触发超时处理。

将这个函数复制粘贴到主程序里,并填入参数。执行完发送数据后反转LED灯以便可以看到执行效果。在函数名HAL_UART_RxCpltCallback中,"RxCplt"表示"Receive Complete",即接收完成的意思。   

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);//LED灯反转函数。

发送的数据字符串数组命名为Txstr1,字符串内容是hello word,\r\n表示将光标移动到行首并换行。

 将串口一的TX(PA9)和RX(PA10)和USB转TTL的TX和RX相连,注意需要交叉相连。即芯片的TX连接USB转TTL的RX,芯片的RX连接USB转TTL的TX。VCC和GND也要相连,并插入电脑。打开串口助手XCOM,波特率9600,停止位1位,数据位8为,无奇偶校验。按下单片机的复位键,此时串口助手收到hello word,并且单片机上的LED灯亮起。至此,阻塞式串口发送数据完成。

其次是非阻塞式的数据发送。非阻塞式的串口数据发送相比阻塞式会复杂一点。在配置STM32CubeMX的时候多了一步操作。就是要勾选NVCI Settings中的USART1 global interrupt(串口一全局中断)让它使能,如果不勾选这项的话就无法成功发送数据。

非阻塞式也称中断式的串口数据发送函数是HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size),与阻塞式不同的是其没有超时时间参数。

将其复制到主程序里填入参数执行。

中断式的发送方式还需要一个回调函数,回调函数用于执行完数据发送后执行什么内容。weak表示这个函数是虚函数,即函数里没有执行任何内容。我们只需要重写这个虚函数即可。

 回调函数编写如下,当数据发送完成时,LED灯电平翻转即亮起,串口数据发送效果跟上面的方法是一样的。

接下来是串口接收教程,接收和中断基本差不多。

使用串口数据接收中断式函数。HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

该函数的*huart指向串口外设。其中,h代表"handle"或者"handler",表示这个结构体是用来处理UART通信相关操作的句柄或者处理器。填写实参时取具体串口的地址即可,如&huart1,表示串口一。*pData即指向所接收的数据的指针,填实参时取对应变量的地址,如&Rxdata。Size是指接收的数据的个数。

将中断式函数写在主函数里。

 另外跟发送一样,中断接收串口数据也有接收完成回调函数。

在主函数前重写串口接收函数即可。

 单片机和电脑使用usb-ttl连接上后打开串口助手。发送01,并勾选以十六进制发送即可。这样单片机上的LED灯也会翻转电平。

非阻塞式串口数据接收函数是HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout),其中Timeout是接收超时时间,每次执行这个函数时都会有一定的超时时间,在超时时间内可以接收数据,在超时时间外不会接收数据无论实际有无收到数据。因此当要重复接收某一数据是建议将此函数放在循环里。

放在循环里之后可以不断接收数据,当接收到01时电平翻转一次。

 

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库串口收发教程详解

发表评论