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);//清中断 } }