ZBLOG

编写一个使用定时器、预定标器、外部和内部中断的代码,当按一次按钮时,内置led闪烁1.5秒,当再次按下按钮时熄灭。不使用delay函数,使用TIM2_Init()函数

下面是一个使用定时器、预定标记、外部和内部中断的示例代码,满足按下按钮后内置 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>

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8380

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?