MM32F3273G8P火龙果开发板MindSDK开发教程7 - 基本定时器的使用

MM32F3273G8P火龙果开发板MindSDK开发教程6 - 基本定时器的使用

1、基本定时器的初始化

MM32F3273G8P有2两高级定时器,TIM1/8,四个个通用定时器TIM3/4,TIM2/5,以及两个基本定时器TIM6/7。
现在我们将TIM6设置为100ms一次触发中断,中断函数中翻转LED的状态,实现LED的闪烁功能。
TIM6是挂在APB1上的外设,APB1的时钟为60M,但是APB1的Prescaler为2,所以TIM6的时钟为120M。
假设TIM6的prescaler=1200-1,即120M/1200 = 100K的计数频率,即10us计数一次。那么100ms需要计数10000次,即TIM6的预装值period = 10000-1。
而MM32的stepFreqHZ = 120M/(prescaler + 1) = 120000000/1200 = 100K。

初始化代码如下:

void BOARD_TIM6_Init(void)
{
    uint32_t prioritygroup = 0;
    /* Set the counter counting step. */
    TIM_Init_Type tim_init;
    tim_init.ClockFreqHz = 120000000;
    tim_init.StepFreqHz = 100000; /* 100ms. */
    tim_init.Period = 10000-1;
    tim_init.EnablePreloadPeriod = false;
    tim_init.PeriodMode = TIM_PeriodMode_Continuous;
    tim_init.CountMode = TIM_CountMode_Increasing;
    TIM_Init(TIM6, &tim_init);

    // prioritygroup = NVIC_GetPriorityGrouping();
    // NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(prioritygroup, 0, 1));
    /* Enable interrupt. */
    NVIC_EnableIRQ(TIM6_IRQn);
    TIM_EnableInterrupts(TIM6, TIM_INT_UPDATE_PERIOD, true);

    /* Start the counter. */
    TIM_Start(TIM6);
}

RCC初始化代码:

/* TIM6. */
RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_TIM6, true);
RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_TIM6);

2、TIM6的中断函数

/* TIM_BASIC Period timeout ISR. */
void TIM6_IRQHandler(void)
{
    uint32_t flags = TIM_GetInterruptStatus(TIM6);
    if ( 0u != (flags & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */
    {
        LED_Toggle();
    }
    TIM_ClearInterruptStatus(TIM6, flags);
}

其中

void LED_Toggle(void)
{
    uint32_t odr;
    /* get current Output Data Register value */
    odr = USER_LED_PORT->ODR;

    /* Set selected pins that were at low level, and reset ones that were high */
    USER_LED_PORT->BSRR = ((odr & USER_LED_PIN) << 16U) | (~odr & USER_LED_PIN);
}

3、现象

main.c中调用BOARD_TIM6_Init(),执行完make命令后,即可看到开发版蓝灯闪烁。

4、代码

代码路径

你可能感兴趣的:(火龙果MM32F3273G8P,单片机,嵌入式硬件,mm,mm32F3273G8p)