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