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

本文详细介绍了STM32的中断原理,包括概念、作用和响应全过程,并通过CubeMX配置中断控制LED灯,展示了HAL库如何实现中断串口通信。此外,还讲解了利用DMA以特定速率连续发送数据的原理,给出了创建项目和代码修改的步骤,最后进行了总结和提供了参考资料。
摘要由CSDN通过智能技术生成

目录

一、中断原理

1.概念

 2. 作用

 3. 响应全过程

 二、 CubeMX中断控制LED灯

1. 生成项目

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

 (2)选择芯片

 (3)设置芯片

 (4)开启中断

 (5)时钟树设置

 (6)创建项目

 三、HAL库中断串口通信

1. 新建项目

 2.代码修改

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

1.原理

2.创建项目

 3.代码修改

 五. 总结

六 参考链接



一、中断原理

1.概念

 

 2. 作用

 

 3. 响应全过程

 二、 CubeMX中断控制LED灯

1. 生成项目

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

 (2)选择芯片

STM32F103C8

 

 (3)设置芯片

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

 

 PB9GPIO mode

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

 RCC配置时钟和SYS配置

 

 (4)开启中断

 (5)时钟树设置

 (6)创建项目

 

 

 在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
     */
}

 烧录:

 查看结果:

 三、HAL库中断串口通信

1. 新建项目

选择USART1为异步通信模式:

 RCC配置时钟和SYS配置

 

 配置串口

 使能中断:

 生成项目后,打开:

 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); // 使能接收中断
	}
}

编译烧录:

 

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

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

1.原理

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

2.创建项目

芯片依然选择STM32F03c8

 RCC配置时钟和SYS配置

 

 时钟树配置

 选择USART1为异步通信模式:

 

 配置串口:

 DMA Setting中,ADD

 

 项目命名位置选择

 

 用keil5打开:

 3.代码修改

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

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

 

 

 编译并烧录:

 

 

 查看结果:

 

 五. 总结

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

六 参考链接

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

STM32之DMA实现串口通信

stm32中断


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值