下面是一个使用定时器、预定标记、外部和内部中断的示例代码,满足按下按钮后内置 LED 闪烁1.5秒,再次按下按钮则熄灭。
”`c #include “stm32f4xx.h”
volatile uint8_t buttonPressed = 0; // 按钮状态标志位
void TIM2_Init(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef timInitStruct;
timInitStruct.TIM_Period = 1000 - 1; // 计数周期为1000个单位(1ms)
timInitStruct.TIM_Prescaler = 8400 - 1; // 预分频器为8400,使得计数频率为10kHz
timInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &timInitStruct);
NVIC_InitTypeDef nvicInitStruct;
nvicInitStruct.NVIC_IRQChannel = TIM2_IRQn;
nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
nvicInitStruct.NVIC_IRQChannelSubPriority = 0;
nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
void EXTI0_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
buttonPressed ^= 1; // 取反按钮状态
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if (buttonPressed)
{
GPIO_ToggleBits(GPIOA, GPIO_Pin_5); // LED 翻转状态
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 关闭 LED
TIM_Cmd(TIM2, DISABLE); // 停止定时器
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
int main(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioInitStruct;
gpioInitStruct.GPIO_Mode = GPIO_Mode_OUT;
gpioInitStruct.GPIO_OType = GPIO_OType_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_5;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitTypeDef extiInitStruct;
extiInitStruct.EXTI_Line = EXTI_Line0;
extiInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
extiInitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
extiInitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti_InitStruct);
NVIC_InitTypeDef nvicExtiInitStruct;
nvicExtiInitStruct.NVIC_IRQChannel = EXTI0_IRQn;
nvicExtiInitStruct.NVIC_IRQChannelPreemptionPriority= 0x01;
nvicExtiInitSt<br/><br/><br/><font size=1 color=#CCCCCC>内容由零声教学AI助手提供,问题来源于学员提问</font>




