Timer STM32F051定时器配置
我在STM32F051中遇到计时器配置问题。 我正在使用StdPeriphLibrary,我希望每1ms(freq=1kHz)生成一个中断 这是计时器初始化:Timer STM32F051定时器配置,timer,stm32f0,Timer,Stm32f0,我在STM32F051中遇到计时器配置问题。 我正在使用StdPeriphLibrary,我希望每1ms(freq=1kHz)生成一个中断 这是计时器初始化: void TIMER_initHardware(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitTypeDef gpioInitStruct; gpioInitStruct.GPIO_Mode = GPIO_Mode_OU
void TIMER_initHardware(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioInitStruct;
gpioInitStruct.GPIO_Mode = GPIO_Mode_OUT;
gpioInitStruct.GPIO_OType = GPIO_OType_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_12;
gpioInitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_PCLKConfig(RCC_HCLK_Div1);
SystemCoreClockUpdate();
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //32767;
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000000)-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = TIMER_TIM2_ADD_1MS;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
下面是中断程序:
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
TIM_SetCompare1(TIM2, TIM_GetCapture1(TIM2) + TIMER_TIM2_ADD_1MS);
tick = 1;
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_12))
{
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_12);
}
}
该代码每66毫秒生成一个中断-在示波器上检查
应用程序中没有使用其他中断。尝试使用以下命令更新您的初始代码:
...
TIM_TimeBaseStructure.TIM_Period = 999;
...
TIM_OCInitStructure.TIM_Pulse = 0;
...
您已将计时器时钟设置为1MHz(预分频器),因此需要将其细分1000(周期=1000-1=999)。这里不使用脉冲
此外,在中断处理程序中,我不确定是否需要执行此操作,我认为可以将其删除:
TIM_SetCompare1(TIM2, TIM_GetCapture1(TIM2) + TIMER_TIM2_ADD_1MS);