stm32中断和DMA实现串口通信【嵌入式】

目录

一、中断原理

1.概念

 2. 作用

 3. 响应全过程

 二、 CubeMX中断控制LED灯

1. 生成项目

(1)新2建项目File-New Project

 (2)选择芯片

 (3)设置芯片

 (4)开启中断

 (5)时钟树设置

 (6)创建项目

 三、HAL库中断串口通信

1. 新建项目

 2.代码修改

 四 DMA发送用特定速率向上位机连续发送数据

1.原理

2.创建项目

 3.代码修改

 五. 总结

六 参考链接



一、中断原理

1.概念

stm32中断和DMA实现串口通信【嵌入式】_第1张图片

 stm32中断和DMA实现串口通信【嵌入式】_第2张图片

 2. 作用

stm32中断和DMA实现串口通信【嵌入式】_第3张图片

 stm32中断和DMA实现串口通信【嵌入式】_第4张图片

 3. 响应全过程

stm32中断和DMA实现串口通信【嵌入式】_第5张图片

 二、 CubeMX中断控制LED灯

1. 生成项目

(1)新2建项目File-New Project

stm32中断和DMA实现串口通信【嵌入式】_第6张图片

 (2)选择芯片

STM32F103C8

 stm32中断和DMA实现串口通信【嵌入式】_第7张图片

 (3)设置芯片

PA4设置为GPIO_Output输出模式,PB9设置为GPIO_EXTI9中断模式

stm32中断和DMA实现串口通信【嵌入式】_第8张图片

 stm32中断和DMA实现串口通信【嵌入式】_第9张图片

 PB9GPIO mode

stm32中断和DMA实现串口通信【嵌入式】_第10张图片

 PA4引脚配置,默认设置为High,处于熄灭状态

stm32中断和DMA实现串口通信【嵌入式】_第11张图片

 RCC配置时钟和SYS配置

stm32中断和DMA实现串口通信【嵌入式】_第12张图片

 stm32中断和DMA实现串口通信【嵌入式】_第13张图片

 (4)开启中断

stm32中断和DMA实现串口通信【嵌入式】_第14张图片

 (5)时钟树设置

stm32中断和DMA实现串口通信【嵌入式】_第15张图片

 (6)创建项目

stm32中断和DMA实现串口通信【嵌入式】_第16张图片

 stm32中断和DMA实现串口通信【嵌入式】_第17张图片

 stm32中断和DMA实现串口通信【嵌入式】_第18张图片

 在main.c中加入以下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* Prevent unused argument(s) compilation warning */
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);  //翻转电平
    /* NOTE: This function Should not be modified, when the callback is needed,
             the HAL_GPIO_EXTI_Callback could be implemented in the user file
     */
}

 烧录:

stm32中断和DMA实现串口通信【嵌入式】_第19张图片

 查看结果:

 三、HAL库中断串口通信

1. 新建项目

选择USART1为异步通信模式:

stm32中断和DMA实现串口通信【嵌入式】_第20张图片

 RCC配置时钟和SYS配置

stm32中断和DMA实现串口通信【嵌入式】_第21张图片

 stm32中断和DMA实现串口通信【嵌入式】_第22张图片

 配置串口

stm32中断和DMA实现串口通信【嵌入式】_第23张图片

 使能中断:

stm32中断和DMA实现串口通信【嵌入式】_第24张图片

 生成项目后,打开:

stm32中断和DMA实现串口通信【嵌入式】_第25张图片

 2.代码修改

定义缓冲区大小:

#define LENGTH 10   // 接收缓冲区大小

定义缓冲区和标志位

uint8_t RxBuffer[LENGTH];   // 接收缓冲区
uint8_t Rxflag = 0;    // 标志位,0为接收未完成,1为接

在while循环中发送成功信息和接收到的信息:

if (Rxflag == 1){ // 若数据接收完成
	Rxflag = 0;  // 清除标志位
	HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF);  // 接收成功信息
	// 发送接收到的字符
	HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}

在main.c中定义回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	if (huart->Instance == USART1){
		Rxflag = 1;  // 设置标志位为1
		HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
	}
}

编译烧录:

stm32中断和DMA实现串口通信【嵌入式】_第26张图片

 stm32中断和DMA实现串口通信【嵌入式】_第27张图片

 打开串口,输入sunlingbo并发送,成功接收

stm32中断和DMA实现串口通信【嵌入式】_第28张图片

 四 DMA发送用特定速率向上位机连续发送数据

1.原理

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

2.创建项目

芯片依然选择STM32F03c8

stm32中断和DMA实现串口通信【嵌入式】_第29张图片

 RCC配置时钟和SYS配置

stm32中断和DMA实现串口通信【嵌入式】_第30张图片

 stm32中断和DMA实现串口通信【嵌入式】_第31张图片

 时钟树配置

stm32中断和DMA实现串口通信【嵌入式】_第32张图片

 选择USART1为异步通信模式:

 stm32中断和DMA实现串口通信【嵌入式】_第33张图片

 配置串口:

stm32中断和DMA实现串口通信【嵌入式】_第34张图片

 DMA Setting中,ADD

stm32中断和DMA实现串口通信【嵌入式】_第35张图片

 stm32中断和DMA实现串口通信【嵌入式】_第36张图片

 项目命名位置选择

stm32中断和DMA实现串口通信【嵌入式】_第37张图片

 stm32中断和DMA实现串口通信【嵌入式】_第38张图片

 用keil5打开:

stm32中断和DMA实现串口通信【嵌入式】_第39张图片

 3.代码修改

在main函数while循环中加入以下内容

  uint8_t data[] = "Congratulation,you did it!\r\n";
    HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,30);
    HAL_Delay(1000);   //

 stm32中断和DMA实现串口通信【嵌入式】_第40张图片

 

 编译并烧录:

stm32中断和DMA实现串口通信【嵌入式】_第41张图片

 

 stm32中断和DMA实现串口通信【嵌入式】_第42张图片

 查看结果:

 

 五. 总结

中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。如果有低响应优先级中断正在执行,那么高响应优先级的中断要等待已被响应的低响应优先级的中断执行结束后才能得到响应。当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。

六 参考链接

STM32之中断方式实现串口通信

STM32之DMA实现串口通信

stm32中断


 

你可能感兴趣的:(stm32,arm,嵌入式硬件)