IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 IO中断 -> 正文阅读

[嵌入式]STM32 IO中断

哈哈,最近搬家加入职没空写笔记,现在还是工作时间写的。

拿出STM32,打算移植下 之前用的库函数,好吧先来个IO中断,纳尼,HAL库没有中断的demo,只有LL库有?好吧试下直接调库函数,好吧失败了。什么鬼居然不给个demo,我怎么知道怎么使用。经过一番资料查找,知道如何使用IO中断了。

IO中断使用方法。

STM32F103RB-Nucleo\Examples\GPIO\GPIO_IOToggle,在这个基础上改。

Nucleo 只有一个按键C13,且外部已经接了上拉,按下短接到地。

代码如下

    main.c中 初始化:
    USER_BUTTON_GPIO_CLK_ENABLE();
    
    GPIO_InitStruct.Mode  = GPIO_MODE_IT_FALLING;
 ?  GPIO_InitStruct.Pull  = GPIO_NOPULL;
 ?  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
?
 ?  GPIO_InitStruct.Pin = USER_BUTTON_PIN;
    
    HAL_GPIO_Init(USER_BUTTON_GPIO_PORT, &GPIO_InitStruct);
    
    HAL_NVIC_SetPriority(USER_BUTTON_EXTI_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USER_BUTTON_EXTI_IRQn);
    
//  EXTI_HandleTypeDef button_exti_type;
//  button_exti_type.Line = USER_BUTTON_EXTI_IRQn;
//  button_exti_type.PendingCallback = NULL;
//  
//  EXTI_ConfigTypeDef button_exti_cfg;
//  button_exti_cfg.GPIOSel = EXTI_GPIOC;//EXTI_GPIOC USER_BUTTON_GPIO_PORT
//  button_exti_cfg.Line = EXTI_LINE_13;
//  button_exti_cfg.Mode = EXTI_MODE_INTERRUPT;
//  button_exti_cfg.Trigger = EXTI_TRIGGER_FALLING;
//  
//  HAL_EXTI_SetConfigLine(&button_exti_type,&button_exti_cfg);
//开始还以为调这个API注册中断,结果是调 NVIC 注册中断。
?
?
?
// 定义中断回调, 在 startup_stm32f103xb.s 中可以看见 所有的中断函数名称。
void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
  //HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);
}
?

理论上按下USER 按键就能翻转LED状态。

实际按下按键,就会发现灯一直亮着,debug一下,会发现,按键按下触发中断后,再在中断函数处打上断点,程序还会进去。想到了之前看到的这段代码:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
 ?  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
 ?  HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}
?
/**
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
 ? ? ? ? ? the HAL_GPIO_EXTI_Callback could be implemented in the user file
 ? */
}

需要清除中断标志位。无语~,我就想开个IO中断,还要整这么多东西,开时钟,使能NVIC,清除中断标志位,库函数能不能默认给我完成这些操作。

所以正确写法是:

在 stm32f1xx_it.c 中实现,

void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); //使用 hal_gpio的库函数,会清除中断标志位。
}
?
?

在 main.c 中重新实现 HAL_GPIO_EXTI_Callback

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
}

然后按下USER 按键就能翻转LED状态,这就实现了想要的功能。在查找过程中发现

BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);

难道这个就是可以简单初始化 IO 中断的API?试一试。

果然将之前的代码屏蔽,替换为BSP_PB_Init,可以使按键中断生效。

//  USER_BUTTON_GPIO_CLK_ENABLE();
//  
//  GPIO_InitStruct.Mode  = GPIO_MODE_IT_FALLING;
//  GPIO_InitStruct.Pull  = GPIO_NOPULL;
//  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
?
//  GPIO_InitStruct.Pin = USER_BUTTON_PIN;
//  
//  HAL_GPIO_Init(USER_BUTTON_GPIO_PORT, &GPIO_InitStruct);
//  
//  HAL_NVIC_SetPriority(USER_BUTTON_EXTI_IRQn, 0, 0);
//  HAL_NVIC_EnableIRQ(USER_BUTTON_EXTI_IRQn);
    
    BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);
?

但是这个BSP只有一个固定的按键,能否输入一个IO,来实现BSP_PB_Init,我写一下。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:17:17  更:2021-08-13 12:18:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:35:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码