EFM32之定时器

设置系统时钟:

CMU_ClockSelectSet(cmuClock_HF,cmuSelect_HFXO);//32MHz

NVIC配置:
EFM32的库函数没有关于NVIC配置的库函数,所以我将stm32lxx中的相关库函数移植了进来,因为都是m3内核,NVIC的配置是一样的,只需要少量的修改即可。
配置时要注意一下几点。
1.stm32的flash起始地址是0x08000000,EFM32的flash起始地址是0x00000000。RAM地址一致。
2.stm32的使能和失能是用枚举类型(ENABLE,DISABLE),EFM32使用的是stdbool.h头文件

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
    NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
    NVIC_PriorityGropConfig(NVIC_PriorityGrop_1);//先占优先级1位,从优先级3位
   NVIC_InitStructure.NVIC_IRQChannel = TIMER0_IRQn;//定时器0中断
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//先占优先级
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//从优先级
   NVIC_InitStructure.NVIC_IRQChannelCmd = true;
    NVIC_Init(&NVIC_InitStructure);
}

定时器0初始化:

void Timer_Config(void)
{
    CMU->HFPERCLKEN0 |= (1<<4);
    TIMER0->CTRL |= (5<<24);//32分频  32/32 = 1M
    TIMER0->CTRL &= ~(3<<6);//timer0的时钟选择为外设高速时钟
    TIMER0->CTRL |= (1<<0);//计数模式为向下

    TIMER0->IEN |= (1<<1);//向下计数溢出中断使能

    TIMER0->TOP = 999;//计数1000次刚好是1ms

    TIMER0->CMD = 0x01;//开启定时器0
}

定时器0中断服务函数:

void TIMER0_IRQHandler(void)
{
    if(TIMER0->IF & 0x02)
    {
        TIMER0->IFC |= (1<<1);//清中断
    }
}

 

posted @ 2013-03-28 22:31  zpehome  阅读(1353)  评论(0编辑  收藏  举报