ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

STM32中断与DMA通信编程

2021-11-06 12:58:00  阅读:211  来源: 互联网

标签:DMA HAL 中断 编程 STM32 设置 GPIO EXTI


目录

一. STM32使用中断方式读取按键控制LED灯的亮灭

建立STM32CubeMX工程

编写代码

实验结果

二. DMA方式向上位机连续发送数据

建立STM32CubeMX工程

编写代码

实验结果

三. 总结

四. 参考链接


一. STM32使用中断方式读取按键控制LED灯的亮灭

学习任务:用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。

建立STM32CubeMX工程

1.建立工程

打开STM32CubeMX建立工程,选择芯片,我使用的是STM32F103C8。

2.引脚配置
PA5设置为GPIO_Output,然后将PB15设置为GPIO_EXTI13

GPIO模式设置为推免模式,触发模式为下降沿触发。PA5设置名字为LD,PB15设置为B1_EXTI

 4.NVIC设置
将外部中断线EXTI_Line[15:10]使能

5.配置中断优先级
优先级分组为第4组,16级抢占优先级;修改外部中断线 直接使用由中断编号设置的默认中断优先级EXTI line[15:10]的抢占优先级为15 

6. 在Project Manager中修改项目名称路径和Toolchain并在code generator中勾选生成c文件后生成代码

编写代码

生成工程之后,需要在main.c文件当中添加代码

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == B1_EXTI_Pin )
{
HAL_GPIO_TogglePin(LD_GPIO_Port, LD_Pin);
}
}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitStruct.Pin = B1_EXTI_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_EXTI_GPIO_Port, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 15, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}


添加外部中断回调函数
static void MX_GPIO_Init(void):外部中断的初始化函数当中

GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING:为将外部中断的触发方式设置为下降沿触发, 

HAL_NVIC_SetPriority(EXTI15_10_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn):为设置外部中断的优先级为15,并将这个外部中断使能。

编译无误后生成HEX文件

实验结果

连接电路后,将BOOT0置为1,BOOT1置为1通过mcuisp软件烧录.hex程序

 烧录程序后断电BOOT0,1复位,BOOT0置为1,BOOT1置为1,接电

PB15引脚接入3V时,LED为亮,然后接入GND,一个下降沿到来,收到中断请求,LED灭。

二. DMA方式向上位机连续发送数据

建立STM32CubeMX工程

设置RCC

设置串口:点击USATR1
设置MODE为异步通信(`Asynchronous`)

基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能

 NVIC Settings 一栏使能接收中断

 GPIO引脚自动设置 USART1_RX/USART_TX

 DMA基础设置

时钟设置
外部晶振为8MHz
1选择外部时钟HSE 8MHz
2PLL锁相环倍频9倍
3系统时钟来源选择为PLL
4设置APB1分频器为 /2
5使能CSS监视时钟

 项目文件配置
1 设置项目名称
2 设置存储路径
3 选择所用IDE

 勾选仅复制必要文件和生成c/h文件选项后生成代码

编写代码

main.c文件添加代码

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组
  HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
  HAL_Delay(1000);

 编译无误后生成HEX文件

实验结果

boot置1进行烧录

打开串口调试助手查看基础设置无误

 核心板boot0接0,打开串口即可接收信号

三. 总结

       通过此次实验,我了解了中断是如何进行的,以及在STM32当中中断的使用方法。DMA传输过程不占用CPU资源,可以边传输边运行其他任务,更加高效。通过本实验的学习,我对中断的概念以及串口调试有了更加深刻的理解。随着学的东西越高级,我就越能体会到基础的重要,不能害怕BUG,因为错,才会有经验。

四. 参考链接

【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)_Z小旋-CSDN博客

stm32hal库串口DMA收发 - Breezy-ye - 博客园 

标签:DMA,HAL,中断,编程,STM32,设置,GPIO,EXTI
来源: https://blog.csdn.net/QIFEIDEFEI/article/details/121177109

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有