#include "stm32f10x.h" // Device header
void TimerInit(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InternalClockConfig(TIM2);
/**********
初始化配置時基單元
TIM_Period TIM_Prescaler 描述
10000 - 1 7200 - 1; 這樣就變成了1S執行一次
1000 - 1 7200 - 1; 這樣就變成了100ms執行一次
10000 - 1 720 - 1; 這樣就變成了100ms執行一次
********/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStructrue;
TIM_TimeBaseInitTypeStructrue.TIM_ClockDivision = TIM_CKD_DIV1; // 是否分頻
TIM_TimeBaseInitTypeStructrue.TIM_CounterMode = TIM_CounterMode_Up; // 中心對齊模式1
TIM_TimeBaseInitTypeStructrue.TIM_Period = 10000 - 1; // 更新週期值
TIM_TimeBaseInitTypeStructrue.TIM_Prescaler = 7200 - 1; // 預分頻器值
TIM_TimeBaseInitTypeStructrue.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeStructrue);
// 使能中斷 更新中斷到NVIC的路
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// NVIC優先順序分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 初始化NVIC
NVIC_InitTypeDef NVIC_InitStructrue;
NVIC_InitStructrue.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=2; // 配置搶斷優先順序
NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1; // 配置響應優先順序
NVIC_Init(&NVIC_InitStructrue);
// 啟動定時器
TIM_Cmd(TIM2, ENABLE);
}
// 定時器2的中斷函式
void TIM2_IRQHandler(void)
{
// 檢查一下中斷是否真的觸發了
// 如果中斷2的更新中斷變成set了,就可以執行中斷函式了
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
// 可以在這裡執行中斷事件
// 清除中斷標誌位
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
這樣之後就可以再任何地方使用中斷函式 “TIM2_IRQHandler”了。
有個小問題是,裝置一上電就會執行一次中斷,並沒有滿足條件,為了防止這件事出現可以用下面的程式碼來解決這個問題
// TIM初始化完成之後
TIM_ClearFlag(TIM2, TIM_IT_Update); // 加上這句話是可以防止一上電就執行了一次中斷