赞
踩
我用的是正点的
STM32F103
来进行学习,板子和教程是野火的指南者
。
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。
可以看到在未按下时,引脚是低电平,按下之后变成高电平。
void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)
第一个参数为设置何处时钟,第二个参数为ENABLE或者DISABLE
GPIO_InitTypeDef GPIO_InitStructure;
成员分别包括 引脚、时钟速率、模式
GPIO_InitStructure.GPIO_Pin = macKEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = macKEY1_GPIO_Mode;
因为在按下按键后会有一个电压上升沿,所以GPIO模式应该设置为 浮空输入(FLOATING)
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
GPIOx: 指向要配置的 GPIO 端口(如 GPIOA, GPIOB 等)。
GPIO_InitStruct: 指向包含引脚配置的结构体的指针。
如:
GPIO_Init ( macKEY1_GPIO_PORT, & GPIO_InitStructure );
uint8_t Key_Scan ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, uint8_t ucPushState, uint8_t * pKeyPress )
static void EXTI_NVIC_Config(void)
这个 EXTI_NVIC_Config
函数用于配置嵌套向量中断控制器(NVIC),以便为外部中断(EXTI)设置适当的中断优先级和使能。具体来说,它配置了 EXTI0 线路的中断。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
配置 NVIC 的优先级分组。NVIC_PriorityGroup_1
表示中断优先级分组 1,该分组将优先级划分为两部分:抢占优先级和子优先级。
NVIC_PriorityGroup_1
通常将 4 位优先级分为 1 位抢占优先级和 3 位子优先级。抢占优先级用于打断其他中断,子优先级用于决定同级别抢占优先级中断的处理顺序。NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
配置中断通道为 EXTI0_IRQn
,即外部中断线 0 对应的中断通道。
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
设置抢占优先级为 1。抢占优先级越低,优先级越高。
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
设置子优先级为 1。在抢占优先级相同的情况下,子优先级越低,优先级越高。
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
使能 EXTI0 中断通道。
NVIC_Init(&NVIC_InitStruct);
调用 NVIC_Init
函数,使用配置好的 NVIC_InitStruct
结构体初始化 NVIC。
这样,当 EXTI0 中断发生时,NVIC 会根据配置的优先级正确处理中断。
这段代码用于初始化外部中断/事件控制器(EXTI),使能 GPIOA 的第 0 引脚(PA0)触发的外部中断。下面是详细解释每一行代码的作用:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd
函数用来配置外设时钟,RCC_APB2Periph_AFIO
表示 AFIO 模块。GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
GPIO_EXTILineConfig
函数将指定的 GPIO 引脚连接到对应的 EXTI 线。
GPIO_PortSourceGPIOA
: 指定 GPIOA 端口。GPIO_PinSource0
: 指定端口的第 0 引脚。EXTI_InitStruct.EXTI_Line = EXTI_Line0;
配置 EXTI 线 0(对应 PA0)。
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
配置 EXTI 模式为中断模式。
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
配置 EXTI 触发方式为上升沿触发(即信号从低电平变为高电平时触发中断)。
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
使能 EXTI 线。
EXTI_Init(&EXTI_InitStruct);
EXTI_Init
函数,使用配置好的 EXTI_InitStruct
结构体初始化 EXTI。这样,当 PA0 引脚的电平从低变高时,会触发 EXTI 线 0 的中断。
在启动文件startup_stm32f10x_hd.s
中找到中断函数名为EXTI0_IRQHandler
在中断源文件stm32f10x_it.c
中添加中断函数
当EXTI0被触发时,开关绿灯
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
使用此函数检测到中断时,返回1或0。
macLED1_TOGGLE();
利用bsp_led.h
里的函数翻转绿灯
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
利用此函数来清除中断位,防止一直在中断内。
添加按键、中断 和 LED 的初始化函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。