概述
文章目录
- 一、实验内容
- 二、DMA简介
- 三、点亮LED灯中断实验
- (1)工程创建
- (2)编译
- (3)烧录
- (4)运行结果
- 四、串口中断通信实验
- (1)工程创建
- (2)编译
- (3)器材连接与烧录
- (4)运行效果
- 五、串口DMA发送数据实验
- (1)工程创建
- (2)编译
- (3)烧录
- (4)运行效果
- 五、个人总结
- 六、参考文献
一、实验内容
-
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
-
采用串口中断方式重做上周的串口通信作业。
-
STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。
二、DMA简介
DMA全称Direct Memory Access,即直接存储器访问。
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和回复现场过程,通过硬件为RAM和IO设备开辟一条直线传输数据的通道,使得CPU的效率大大提高。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。
STM32F1最多有2个DMA控制器,DMA2仅存在于大容量产品中,DMA1有7个通道,DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个DMA请求的优先权。在STM32中文参考手册第144页中给出了DMA的框图。
在STM32中文参考手册第142页比较详细的介绍了DMA的主要特性
三、点亮LED灯中断实验
(1)工程创建
1、打开STM32CUBEMX,新建一个工程
2、芯片选择STM32F103C8,直接双击芯片型号。
3、点击SYS,Debug选择Serial Wire
4、点击RCC,High speed选择Crystal
5、点击GPIO,选择管脚,这里LED连PA6管脚,按键连PB1管脚
连接LED的管脚选择GPIO_Output
按键所连的管脚选择GPIO_EXIT1
6、PA6,PB1命名
给中断设置下降沿触发,并且上拉电阻。
7、配置中断优先级,因为此处只有一个中断,因此它的优先级为0,为最高,如果有多个中断则可设为0,1,2,3。
8、配置时钟,设时钟频率为72MHZ
9、工程命名,设置保存目录,之后点击GENERATE CODE生成
(2)编译
1、打开keil文件,在main.c中修改callback程序,用到的库函数是HAL_GPIO_TogglePin()
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
{HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin);
}
}
2、运行成功,生成.hex文件
(3)烧录
(4)运行结果
四、串口中断通信实验
(1)工程创建
1、RCC和SYS和CLOCK设置同上,引脚不需要。
2、点击Connectivity的USART1,MODE选择Asynchronous(异步通信模式),并且点击NVIC Settings,勾选Enabled。
3、工程命名,然后生成工程文件。
(2)编译
1、打开keil文件
2、在main添加存放数据的数组代码
uint8_t a[]="Hello windows!n";
3、在main添加回转函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}
4、在main添加中断函数
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
5、编译成功,生成.hex文件。
(3)器材连接与烧录
核心板连接方式和我上篇博客连接方式一样
参考链接:https://blog.csdn.net/qq_45930985/article/details/121024027
烧录
(4)运行效果
这里需要BOOT0由1置0,然后点击RESET,打开野火调试助手。
五、串口DMA发送数据实验
(1)工程创建
1、RCC和CLOCK设置同上
2、点击USART1,MODE选择Asynchronous(异步通信模式),并且使得USART1中断使能
波特率设置为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能。
3、点击NVIC Settings,勾选Enabied。
4、点击DMASettings ,再点击 Add 添加两个通道,传输速率设置为medium
5、模式设置为Normal,勾选Memory
6、点击System view,选择DMA,点击ADD的添加
7、命名工程,然后点击GENERATE CODE生成工程文件
(2)编译
1、打开keil文件,在main.c中添加如下代码
uint8_t Senbuff[] = "Hello windows!n"; //定义数据发送数组
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
2、编译成功。
(3)烧录
打开mcuisp软件
(4)运行效果
打开野火调试助手,这里同样需要BOOT0由1置0,点击RESET
五、个人总结
这一次实验是在上一次的基础上增加中断的过程,实验难度就没有那么大了,基本对于软件的操作在上一次都熟悉了,但是中断的过程还是需要去借鉴别人的实验过程来丰富自己的实际动手操作经验。
六、参考文献
1、https://blog.csdn.net/as480133937/article/details/104827639/
2、https://www.cnblogs.com/breezy-ye/articles/12157442.html
最后
以上就是迷路海燕为你收集整理的STM32中断与DMA通信编程的全部内容,希望文章能够帮你解决STM32中断与DMA通信编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复