基于中断/DMA方式的串口通信

一、理论基础
1、外部中断(EXTI)
外部中断,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

2、串口通信
2.1、HAL库UART函数库介绍
2.1.1、串口发送/接收函数

HAL_UART_Transmit();串口发送数据,使用超时管理机制 
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送  
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收

2.1.2、串口中断函数

HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

3、串口DMA
DMA定义:
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

DMA传输方式:
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
外设到内存 Peripheral To Memory
内存到外设 Memory To Peripheral
内存到内存 Memory To Memory
外设到外设 Peripheral To Peripheral

二、基于外部中断操作LED

1、新建工程

1.1、点击框图内新建工程

1.2、选择芯片

1.3、时钟配置
1.3.1、在Pinout&Configuration–System Core–RCC选择外部晶振,如下图所示

1.3.2、配置时钟,设时钟频率为72MHZ

1.4、设置引脚
PA6引脚和外部中断EXTI1,PB1

1.5、中断设置
1.5.1、给中断设置下降沿触发,并且上拉电阻

1.5.2、 配置中断优先级,因为此处只有一个中断,因此它的优先级为0,为最高,如果有多个中断则可设为0,1,2。

1.6、建立项目
1.6.1、输入项目名称和项目地址,在Toolchain/IDE选择MDK-ARM

1.6.2、保存后打开文件所在地

2、编译与写程序

可以看到生成的中断服务函数 void EXTI1_IRQHandler(void), 该函数又调用了HAL_GPIO_EXTI_IRQHandler(),于是继续跳转到下一函数

可以看到在这之中调用了HAL_GPIO_EXTI_Callback(),接下来的函数可以看到是_weak开头,则需要用户自己写函数

此时到main.c中书写callback程序,用到的库函数是HAL_GPIO_TogglePin(),该函数的作用是翻转电平,即中断一产生,则翻转一次电平。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{  
{HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin);
}
}

环境设置

进行编译

烧录

三、串口中断实现串口通信

1.创建工程

此项目RCC和SYS和CLOCK设置如上面一样

下面设置串口USART1,在MODE下选择Asynchronous(异步通信模式),并且使得USART1中断使能

2、重定向printf和scanf

在 stm32f1xx_hal.c中包含#include <stdio.h>

四、串口DMA接收发数据

1、创建工程

下面我们在CubeMx中配置工程,系统、时钟等跳过,只看串口和DMA设置这一块。

在Pinout&Configuration–Connectivity–USART1–Mode中打开串口1,配置为Asynchronous

点击add,选择USART_RX USART_TX 传输速率设置为中速 ,右侧点击System Core 点击DMA

点击add添加MENTOMEN

然后保存,并打开文件夹

2、测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值