STM32中断与DMA通信编程

目录

一、STM32中断控制LED灯

(一)中断概念

(二)中断优先级

(三)中断响应过程

(四)新建工程

(五)代码编写

(六)电路连接

(七)运行结果 

二、STM32中断方式实现串口通信 

(一)新建工程

(二)代码编写

(三)运行结果

三、STM32采用串口DMA方式向上位机发送数据

(一)DMA概念

(二)DMA传输数据四个要素

(三)STM32的DMA控制器特点

(四)DMA数据传输方式

(五)新建工程

(六)代码编写

(七)运行结果

四、总结

五、参考资料


一、STM32中断控制LED灯

(一)中断概念

1.中断发生:当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理
2.中断处理:CPU暂停当前的工作,转去处理事件B
3.中断返回:当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A

(二)中断优先级

(三)中断响应过程

步骤 1:中断源发出中断请求

步骤 2:判断外理器是否允许中断,以及该中断源是否被屏蔽

步骤 3:中断优先级排队

步骤 4:处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序

步骤 5:执行中断服务程序

步骤 6:恢复被保护的状态 ,执行中断返回指令,回到被中断的程序  

(四)新建工程

1.进入STM32CubeMX,新建项目

2.搜索STM32F103C8并选择start project

3.点击sys,设置debug为serial wire

4.点击rcc,设置hse为crystal/ceramic resonator

5.点击clock configuration,设置如下图

6.将PA5引脚设置为GPIO_OUTPUT,PB0引脚设置为GPIO_EXTI0

7.点击gpio,设置PB0如下

8.点击nvic,设置如下

9.点击project manager,设置如下

设置完成后点击GENERATE CODE,结束

(五)代码编写

 1.用KEIL打开刚才创建的工程,打开main.c文件,在下图位置添加代码

 2.代码

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);  // 读取b0的状态
	switch (GPIO_Pin){
		case GPIO_PIN_0:
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, b0_pin);  // 将a5写入与b0相同的电位
			break;
	}
	
}

(六)电路连接

(七)运行结果 

 编译,程序烧录后,先断电将boo0置0,运行结果如下

二、STM32中断方式实现串口通信 

(一)新建工程

1.见STM32中断控制LED灯新建工程前五步

2.点击USART1,将mode设置为asynchronous

 3.点击nvic settings,设置使能串口中断

4. 点击project manager,设置与之前相同

(二)代码编写

用KEIL打开刚才创建的工程,打开main.c文件,在下图所示位置添加代码

1.

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

2.

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

3.

HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);  // 使能接收中断
char data[] = "\nReveive Success\n";  // 接收成功信息

4.

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

5.

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

(三)运行结果

编译,程序烧录后,打开串口调试助手,设置波特率等,点击打开串口,输入HelloWorld并不断点击发送数据,运行结果如下

三、STM32采用串口DMA方式向上位机发送数据

(一)DMA概念

直接存储器访问(DMA):用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。

(二)DMA传输数据四个要素

1.传输源 :DMA数据传输的来源
2.传输目标:DMA数据传输的目的
3.传输数量:DMA传输数据的数量
4.触发信号:启动一次DMA数据传输的动作

(三)STM32的DMA控制器特点

1.每个控制器有8个数据流,每个数据流可以映射到8个通道(或请求);
2.每一个DMA控制器用于管理一个或多个外设的存储器访问请求,并通过总线仲裁器来协调各个DMA请求的优先级;
3.数据流(stream)是用于连接传输源和传输目标的数据通路,每个数据流可以配置为不同的传输源和传输目标,这些传输源和传输目标称为通道(Channel);
4.具备16字节的FIFO。使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址。

(四)DMA数据传输方式

1.普通模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。

2.循环模式:可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载,并继续响应DMA请求。

(五)新建工程

1.见STM32中断控制LED灯新建工程前五步

2.点击USART1,将mode设置为asynchronous

3.点击nvic settings,设置使能串口中断

4.点击dma settings,点击add,设置如下

5.点击project manager,设置与之前相同

(六)代码编写

用KEIL打开刚才创建的工程,打开main.c文件,在while循环中添加如下代码

uint8_t data[] = "Hello World\r\n";
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,16);
HAL_Delay(1000);   //延时

(七)运行结果

编译,程序烧录后,打开串口调试助手,设置波特率等,点击打开串口,运行结果如下

四、总结

通过此次作业学习了stm32中断、DMA通信的原理并掌握了用中断方式和DMA方式的编程方法。

五、参考资料

https://blog.csdn.net/junseven164/article/details/121066120?spm=1001.2014.3001.5501

https://blog.csdn.net/weixin_46628481/article/details/121094702

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值