STM32中断与DMA通信编程

2021/11/6 14:12:45

本文主要是介绍STM32中断与DMA通信编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

一. 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 - 博客园 



这篇关于STM32中断与DMA通信编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程