stm32f1的60秒倒计时主函数代码
时间: 2023-08-30 17:11:27 浏览: 83
60s倒计时_STM32倒计时_STM32倒计时_倒计时_complex1wz
5星 · 资源好评率100%
这是一个简单的STM32F1倒计时程序,定时器使用的是TIM2,GPIO口使用的是PA0。
```
#include "stm32f10x.h"
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,
(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)));
}
}
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 59999;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main(void)
{
TIM2_Configuration();
GPIO_Configuration();
while (1)
;
}
```
在`TIM2_Configuration`函数中,我们设置了定时器的时钟频率为72MHz,预分频系数为7199,这样我们就可以得到1毫秒的计时时间。然后我们将计时器的计数模式设置为向上计数,计时器的周期设置为60000,这样我们就可以得到60秒的倒计时。在`TIM_ITConfig`函数中,我们使能了计时器的更新中断。最后,在`NVIC_Init`函数中,我们使能了TIM2的中断,并设置了优先级为0。
在`TIM2_IRQHandler`函数中,我们检查计时器更新中断是否发生,并清除中断标志位。然后我们反转GPIO口的输出状态,这样每次计时器更新中断发生时,LED灯都会闪烁。
在`GPIO_Configuration`函数中,我们将PA0口设置为输出口,并将输出状态初始化为低电平。
在`main`函数中,我们调用了`TIM2_Configuration`和`GPIO_Configuration`函数,并进入了一个死循环,程序将在此处一直循环,直到中断发生。
阅读全文