STm32 使用 stm32cube GPIO 点亮 led 的
有关软件的使用以及其它准备工作请参考:使用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 的相关推荐
- 配置STM32寄存器控制GPIO点亮LED
STM32点亮LED 寄存器方式 IO简介 1.每个IO可以自由编程,但是IO口寄存器必须按照32位字被访问. 2.每个IO端口都有7个寄存器来控制. CRL [0-7]端口配置寄存器 32位 CR ...
- 用c语言编程点亮7个二极管,树莓派4B C语言编程实现GPIO点亮LED发光二极管(LED灯)...
树莓派4B C语言点亮LED发光二极管(LED灯) 1.树莓派 40Pin 引脚GPIO对照表 2.wiringPi库更新 开启一个终端输入:gpio readall 如果发生错误信息,那么请执行下面 ...
- GPIO点亮led灯(使用HAL库),proteus电源设置,proteus仿真
使用CubeMX点亮(闪烁)LED灯 首先.使用CubeMX创建工程文件 打开uvprojx文件,找到Application/User/Core 双击打开main.c,在int main中输入以下程序 ...
- 基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录
Jetson Nano(含2GB).Xavier NX 等开发套件的引脚也兼容于树莓派的定义时,就表示上面列表中的周边设备,都能直接适用于现在主流的 Jetson 开发套件,不仅无需依赖中间的转换器, ...
- android客户端控制树莓派GPIO点亮LED灯
首先需要android客户端与树莓派进行连接,树莓派与android客户端利用wifi连接并进行socket通信请参考我的另一片文章:https://mp.csdn.net/postedit/7991 ...
- STM32固件库编程-----点亮led小灯
使用STM32固件库编程驱动led灯 第一步:打开keil5,创建工程文件 第二步:选择自己想要的路径(温馨提示,最好不要创建在C盘里面)然后点击保存 第三步:因为我们是使用STM32单片机所以选择S ...
- 香橙派 orangepi 点灯大法,操作gpio 点亮LED灯
本次型号M11.安装WiringNP git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./ ...
- 【STM32】HAL库——点亮LED灯
前期准备: STM32CubeMX Proteus 8 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 新建工程 直接搜索芯片型号,出现了就选中开始工程.也可以根据下方的资源来确 ...
- 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)
嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...
最新文章
- hdu4291 暴力循环节+矩阵快速幂
- linux扫描hba卡命令,如何在redhat中查看HBA卡的信息
- NYOJ455 - 黑色帽子
- 鸿蒙空间最高级,洪荒:我能进化万物
- 夜晚较为活跃之物种对照图
- ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台
- HTML5网页设计基础——表单样式
- 一文彻底搞懂激光雷达原理!
- 小特工具箱新增功能:文档转换、代码转换和AI写诗词
- 解决控制面板卸载不了程序的问题
- 搜狗输入法中文状态下,打出来还是英文按住键盘Ctrl+shift+E就可以了
- 五个强盗分金币的问题分析(博弈论)
- android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
- watch的使用方法
- 2021-04-29 微信登录简易版
- 线性回归的损失函数与逻辑回归的损失函数
- 程序员必须学会的《软技能》
- 安河桥间奏为什么火_什么样的人会喜欢安和桥的间奏,初见的时,没想过后来会那么喜欢...
- 请编写一个程序,使用字典存储学生信息,学生信息包含学号和姓名,请根据学生学号从小到大输出学生信息
- 微信小程序实现横向滚动文字