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时调用的函数

二.

开启这个库

三.

编写测试程序

四.

查看串口助手

总结

以上是串口常用方法,若有疑问,欢迎留言。

作者:凸巴鸽

物联沃分享整理
物联沃-IOTWORD物联网 » STM32串口轮询、中断、DMA及重定向使用详解(实战教程)

发表回复