關於STM32通用定時器更新事件中斷
//定時器3中斷服務程式
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001) //產生更新事件
{
LED1=!LED1;
LED0=!LED0;
}
TIM3->SR&=~(1<<0);//清除中斷標誌位
}
//通用定時器中斷初始化
//這裡時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重灌值。
//psc:時鐘預分頻數
//這裡使用的是定時器3!
void Timerx_Init(u16 arr,u16 psc)
{
TIM3->SMCR&=0xfffffff8; //從模式控制暫存器設定預分頻時鐘由內部時鐘提供
RCC->APB1ENR|=1<<1; //TIM3時鐘使能
TIM3->ARR=arr; //設定計數器自動重灌值
TIM3->PSC=psc; //預分頻器7200,得到10Khz的計數時鐘,//CK_CNT=Fck_psc/([15:0]+1)
TIM3->CR1|=1<<4; //計數器向下計數
TIM3->CR1|=1<<7; //每一次更新事件(UEV)時,才把預裝在暫存器的內容送到影子暫存器
TIM3->CR1&=0xfffffffd; //設定UDIS允許更新事件(UEV)
TIM3->CR1&=0xfffffffb; //設定更新請求源
TIM3->CR1|=0x01; //使能計數器
TIM3->DIER|=1<<0; //允許更新中斷
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//搶佔1,子優先順序3,組2
}
int main(void)
{
Stm32_Clock_Init(9); //系統時鐘設定72MHZ
delay_init(72); //延時初始化
uart_init(72,9600); //串列埠初始化
LED_Init(); //初始化與LED連線的硬體介面
Timerx_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms
while(1)
{
delay_ms(200);
TIM3->EGR|=0x0001;
}
}
這樣設定以後,個人做了測試,可以在計數器在計數到2000時,設定了TIM3->EGR|=0x0001;更新事件發生,併產生了更新事件中斷,同時,對計數器重新初始化