有关软件的使用以及其它准备工作请参考:使用HAL库、STM32CubeMX和Keil 5开发入门教程(一):点亮一盏LED灯(NUCLEO-F411RE)

一、API说明

HAL库一共包含如下6个IO操作函数: 
1、读取某个引脚的电平状态: 
HAL_GPIO_ReadPin() 
2、写入某个引脚的电平状态: 
HAL_GPIO_WritePin() 
3、翻转某个引脚的电平状态: 
HAL_GPIO_TogglePin() 
4、锁定某个引脚的配置状态(直到下次复位): 
HAL_GPIO_LockPin() 
5、外部中断服务函数: 
HAL_GPIO_EXTI_IRQHandler() 
6、外部中断回调函数: 
HAL_GPIO_EXTI_Callback() 
具体使用方法参见STM32F4xx HAL驱动说明书。

二、GPIO使用示例

示例功能:使用按键(PC13)翻转LED(PA5)电平状态。 
1、使用STM32CubeMX配置好引脚功能以及嵌套向量中断控制器: 
配置LED灯引脚为输出模式 

将按键引脚挂接到外部中断13号线上 

点开GPIO配置按钮 

选择GPIO模式为上升沿触发的外部中断模式 
(何谓上升沿触发、何谓外部中断,以及其他模式,请自行百度) 

点开嵌套向量中断控制器配置按钮 

勾选使能外部中断10~15号线,并且生成相应初始化代码 
 

2、在生成的工程中的对应位置定义外部中断回调函数:

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_13)HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}/* USER CODE END 4 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、编译、下载程序至开发板,并且复位开发板。

三、代码分析

1、在开发板的启动文件startup_stm32f411xe.s中将EXTI15_10_IRQHandler函数注册为外部中断10~15号线的中断服务函数,当外部中断10~15号线产生外部中断时由硬件调用EXTI15_10_IRQHandler函数,中断当前运行的程序,CPU开始执行中断服务函数内的程序,执行完之后继续运行中断前的程序;

2、因为STM32F4的硬件结构决定了外部中断10~15号线共用一个中断向量,因此只能注册一个中断服务函数,而HAL框架使用HAL_GPIO_EXTI_IRQHandler()函数和HAL_GPIO_EXTI_Callback()函数使用户看来每个外部中断线都拥有自己的中断服务函数(后面会讲解这两个函数);

3、在stm32f4xx_it.c文件中定义了EXTI15_10_IRQHandler函数,该函数调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);语句;

4、HAL_GPIO_EXTI_IRQHandler()在stm32f4xx_hal_gpio.c文件中定义了,该函数判断外部中断是由哪一号外部中断线产生的,并且清除中断挂起寄存器中的对应位,然后调用外部中断回调函数HAL_GPIO_EXTI_Callback(),并将产生外部中断的中断线作为参数传递给外部中断回调函数HAL_GPIO_EXTI_Callback();

5、而上面的所有工作都由STM32CubeMX帮我们做好了,我们只需要在main.c文件中重定义HAL_GPIO_EXTI_Callback()函数就行了;

6、因为所有外部中断都会调用HAL_GPIO_EXTI_Callback()函数,所以我们需要在HAL_GPIO_EXTI_Callback()函数内部根据输入的GPIO_Pin参数判断是哪一号外部中断线的产生了外部中断,然后根据不同的外部中断执行不同的代码;

7、因此我们使用语句if(GPIO_Pin == GPIO_PIN_13)判断该外部中断是否是由外部中断13号线产生的,然后执行HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);语句翻转LED灯的电平状态;

小贴士:我们不应该在中断服务函数或者中断回调函数内执行过多的代码,这样做是为了最大程度地减少中断嵌套。有关中断嵌套和中断优先级的内容请自行百度,中断优先级(不仅限于外部中断)可以在STM32CubeMX中的NVIC Configuration中设置。

STm32 使用 stm32cube GPIO 点亮 led 的相关推荐

  1. 配置STM32寄存器控制GPIO点亮LED

    STM32点亮LED 寄存器方式 IO简介 1.每个IO可以自由编程,但是IO口寄存器必须按照32位字被访问. 2.每个IO端口都有7个寄存器来控制. CRL [0-7]端口配置寄存器  32位 CR ...

  2. 用c语言编程点亮7个二极管,树莓派4B C语言编程实现GPIO点亮LED发光二极管(LED灯)...

    树莓派4B C语言点亮LED发光二极管(LED灯) 1.树莓派 40Pin 引脚GPIO对照表 2.wiringPi库更新 开启一个终端输入:gpio readall 如果发生错误信息,那么请执行下面 ...

  3. GPIO点亮led灯(使用HAL库),proteus电源设置,proteus仿真

    使用CubeMX点亮(闪烁)LED灯 首先.使用CubeMX创建工程文件 打开uvprojx文件,找到Application/User/Core 双击打开main.c,在int main中输入以下程序 ...

  4. 基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录

    Jetson Nano(含2GB).Xavier NX 等开发套件的引脚也兼容于树莓派的定义时,就表示上面列表中的周边设备,都能直接适用于现在主流的 Jetson 开发套件,不仅无需依赖中间的转换器, ...

  5. android客户端控制树莓派GPIO点亮LED灯

    首先需要android客户端与树莓派进行连接,树莓派与android客户端利用wifi连接并进行socket通信请参考我的另一片文章:https://mp.csdn.net/postedit/7991 ...

  6. STM32固件库编程-----点亮led小灯

    使用STM32固件库编程驱动led灯 第一步:打开keil5,创建工程文件 第二步:选择自己想要的路径(温馨提示,最好不要创建在C盘里面)然后点击保存 第三步:因为我们是使用STM32单片机所以选择S ...

  7. 香橙派 orangepi 点灯大法,操作gpio 点亮LED灯

    本次型号M11.安装WiringNP git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./ ...

  8. 【STM32】HAL库——点亮LED灯

    前期准备: STM32CubeMX Proteus 8 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 新建工程 直接搜索芯片型号,出现了就选中开始工程.也可以根据下方的资源来确 ...

  9. 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)

    嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...

最新文章

  1. hdu4291 暴力循环节+矩阵快速幂
  2. linux扫描hba卡命令,如何在redhat中查看HBA卡的信息
  3. NYOJ455 - 黑色帽子
  4. 鸿蒙空间最高级,洪荒:我能进化万物
  5. 夜晚较为活跃之物种对照图
  6. ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台
  7. HTML5网页设计基础——表单样式
  8. 一文彻底搞懂激光雷达原理!
  9. 小特工具箱新增功能:文档转换、代码转换和AI写诗词
  10. 解决控制面板卸载不了程序的问题
  11. 搜狗输入法中文状态下,打出来还是英文按住键盘Ctrl+shift+E就可以了
  12. 五个强盗分金币的问题分析(博弈论)
  13. android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
  14. watch的使用方法
  15. 2021-04-29 微信登录简易版
  16. 线性回归的损失函数与逻辑回归的损失函数
  17. 程序员必须学会的《软技能》
  18. 安河桥间奏为什么火_什么样的人会喜欢安和桥的间奏,初见的时,没想过后来会那么喜欢...
  19. 请编写一个程序,使用字典存储学生信息,学生信息包含学号和姓名,请根据学生学号从小到大输出学生信息
  20. 微信小程序实现横向滚动文字

热门文章

  1. 8个我希望早点意识到的学生思维
  2. spring boot(一):入门篇
  3. NumberUtils源码分析
  4. CSS的表白:七夕巧克力心
  5. Windows下Eclipse+PyDev安装Python开发环境
  6. 线性代数:第二章 矩阵及其运算:逆矩阵、分块矩阵
  7. 排序算法:希尔、归并、快速、堆排序
  8. Lua 5.1 参考手册
  9. 盘点那些你可能错过的CNCF优秀开源项目
  10. 【函数】02、函数进阶