STM32串口轮询、中断、DMA及重定向使用详解(实战教程)
使用注意事项
本次实验使用的是stm32f407zg芯片,使用平台是正点原子探索者开发板,使用的串口是串口1(PA9,PA10),本次通过stm32cubemx生成代码,使用keil编写代码。
首先是关于串口的底层逻辑,发送的话涉及到两个寄存器,一个是串口发送寄存器TDR,一个是移位寄存器(发出高低电平),比如说我们发送hello,那这个数据会被先拿到TDR寄存器,然后转移到移位寄存器发出。
1.串口轮询收发代码
一.
首先我们需要一个stm32cubemx(可以去ST的官网下载),然后生成工程
二.
配置串口,设置波特率,这个波特率要记住,等下与串口助手配合使用
三.
设置工程名,并且创建位keil工程
框框中是把点c和.h文件放开,然后创建工程
四.
打开文件并且,编写代码,一下是我的事例,发送字符串,并且把收到的字符串发送回来
注意,这里的huart1是在usart.c中就可以找到的,是设备的句柄,大家不理解也没关系,直接使用既可,反正你只需要知道huart1对应的是串口1.
在设备管理器找到串口号
打开串口助手,可以看到接收到串口发送来的数据。
测试接收程序
发送A,接收后发回A,程序成功
2.串口中断模式
对比轮询模式,串口中断解决了需要一直等待的问题。接下来我们在上文的基础上开始配置
一.
双击打开
二.
打开NVIC(如果不知道什么是中断建议去补一下这方面的知识)
创建后我们可以在usart.c中看到关于NVIC的配置
三.
书写发送代码,并且打开串口助手测试
发送函数为 HAL_UART_Transmit_IT();
四.
关于接收,接收比较复杂,他多了一个回调函数(弱定义,通常我们要自己重写)。
这个回调函数就是中断接收完成,就进入这个函数
下面是实例
开启中断接收,接收完就把数据发回来
所以我们把开启放在回调里面,这样就可以一直使用
测试成功
3.关于串口DMA接收不定长数据
一.
首先在cubemx配置
二、
关于函数
接收的函数是HAL_UARTEx_ReceiveToIdle_DMA,HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buff,5);Idle是空闲中断的意思,5表示接受最大的长度而不是希望接收的长度。并且同有一个接收函数。
讲一下这里的size,其实就是接收到的长度。
三
这里是测试程序
说明: __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);因为发送到最大接收的一半的话也会触发回到函数,所以这个宏就关闭接收过半就触发回调
本程序同样是把发送的发回来,发什么就返回什么
四.
串口现象
四.串口重定向即使用printf发送串口数据
一.
首先添加头文件并且重写fputc,这个函数就是printf时调用的函数
二.
开启这个库
三.
编写测试程序
四.
查看串口助手
总结
以上是串口常用方法,若有疑问,欢迎留言。
作者:凸巴鸽