STM32中断与DMA通信编程

STM32中断与DMA通信编程

一、对中断和DAM的了解

(一)中断

1.何为中断

中断是当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理,CPU暂停当前的工作,转去处理事件B,当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A。
在这里插入图片描述
在这里插入图片描述

2.中断的作用

在这里插入图片描述

3.中断优先级

中断优先级问题,高级中断会打断低级中断
在这里插入图片描述

(二)NVIC介绍

NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M3内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说 STM32的 NVIC是 Cortex-M3 的 NVIC 的一个子集。
在这里插入图片描述

优先级:在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的。
优先级
在这里插入图片描述
在这里插入图片描述

(三)DAM

DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DAM框图
在这里插入图片描述

二、STM32CUBEMX生成中断点灯代码

1.创建工程

首先打开STM32CUBEMX,新建一个工程
选择新片型号,这里我根据我的选择STM32F103C8
在这里插入图片描述
点击SYS选择Serial Wire
在这里插入图片描述
点击RCC中的Crystal
在这里插入图片描述
点击GPIO,选择自己用到的管脚,这里我的LED是连在PA6管脚,按键是连在PB1管脚
连接LED的管脚选择GPIO_Output
在这里插入图片描述
按键所连的管脚选择GPIO_EXIT1
在这里插入图片描述
给PA6,PB1取名,则在程序中可快速引用和查看。
在这里插入图片描述
给中断设置下降沿触发,并且上拉电阻。
如果不设置上拉电阻或下拉电阻,led会不停的闪烁,但也可以实现中断
在这里插入图片描述
配置中断优先级,因为此处只有一个中断,因此它的优先级为0,为最高,如果有多个中断则可设为0,1,2,3。

在这里插入图片描述
配置时钟,设时钟频率为72MHZ
在这里插入图片描述
给工程命名,选择IDE型号
在这里插入图片描述
之后点击GENERATE CODE生成。

2.编译程序

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

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

在这里插入图片描述
运行成功,生成.hex文件
在这里插入图片描述

3.烧录

在这里插入图片描述
烧录成功。

4.实验结果

烧录完成后,要把BOOT0由1置0,然后点击RESET
在这里插入图片描述

三、STM32CUBEMX生成中断通信代码

1.创建工程

芯片选择,RCC和SYS和CLOCK设置如上面一样,不用配置引脚
下面设置串口USART1,在MODE下选择Asynchronous(异步通信模式),并且使得USART1中断使能,NVIC Settings 一栏设置使能接收中断
在这里插入图片描述
给工程命名,选择IDE型号
在这里插入图片描述

接着就可以直接生成工程了。

2.编译程序

打开生成的代码
添加存放数据的数组

uint8_t a[]="Hello windows!\n";

在这里插入图片描述
添加回转函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
		HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}


在这里插入图片描述
在主函数中添加中断调用

HAL_UART_Transmit_IT(&huart1, a, sizeof(a));


在这里插入图片描述

编译
在这里插入图片描述
成功,生成.hex文件。

3.烧录

在这里插入图片描述

4.结果

烧录完成后,要把BOOT0由1置0,然后点击RESET
在这里插入图片描述

四、STM32CUBEMX串口DMA发送数据

1.创建工程

芯片选择,RCC和CLOCK设置如上面一样
设置串口USART1,在MODE下选择Asynchronous(异步通信模式),并且使得USART1中断使能
波特率设置为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能。
在这里插入图片描述
NVIC Settings 一栏设置使能接收中断
在这里插入图片描述
DMA设置
点击DMASettings 下的 Add 添加通道,传输速率设置为中速
在这里插入图片描述
模式设置为Normal,右侧选择Memory
在这里插入图片描述
在System view下选择DMA
在这里插入图片描述
左侧点击ADD的添加
在这里插入图片描述
设置工程名和IDE的版本,然后点击GENERATE CODE生成。
在这里插入图片描述

2.编译程序

在main.c中添加如下代码

uint8_t Senbuff[] = "Hello windows!\n";  //定义数据发送数组

在这里插入图片描述

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	  HAL_Delay(1000);

在这里插入图片描述
编译
在这里插入图片描述
没有错误,成功。

3.烧录

在这里插入图片描述
烧录成功

4.结果

在这里插入图片描述

五、总结

通过本次实验了解了中断的使用方法,也学习了·DAM发送数据。总的来说,实验不难,做的过程也没遇到错误。

六、参考文献

https://blog.csdn.net/m0_58414679/article/details/121060073?spm=1001.2014.3001.5501
https://blog.csdn.net/as480133937/article/details/104827639/

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值