| |
|
开发:
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例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |