一、定時器中斷
定時器溢出中斷是定時器最基礎功能,進入中斷的時間周期可由相關寄存器配置。
1、 定時器計數器值 TMRx_CVAL
2、 定時器預分頻寄存器 TMRx_DIV
3、定時器周期寄存器(TMRx_PR)
配置流程
1 編寫定時器溢出中斷函數的應用程序
2 開啟定時器外設時鐘
3 配置定時器 TMRx_DIV 寄存器和 TMRx_PR 寄存器
4 配置定時器為向上計數方向
5 開啟定時器溢出中斷
6 開啟 NVIC 溢出中斷
7 開啟定時器計數
int main(void)
{
/* 系統時鐘配置 */
system_clock_config();
/* LED 延時函數等初始化 */
at32_board_init();
/* 獲取系統時鐘 */
crm_clocks_freq_get(&crm_clocks_freq_struct);
/* 點亮 LED2/LED3/LED4 */
at32_led_on(LED2);
at32_led_on(LED3);
at32_led_on(LED4);
/* 開啟 TMR1 時鐘 */
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
/* 配置定時器 TMRx_DIV 寄存器和 TMRx_PR 寄存器 */
/* systemclock/24000/10000 = 1hz */
tmr_base_init(TMR1, 9999, (crm_clocks_freq_struct.ahb_freq / 10000) - 1);
/*配置定時器為向上計數方向,如果選擇向上計數也可以不配置該語句,
因為 TMR 默認就是向上計數模式 */
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
/* 開啟定時器溢出中斷 */
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
/* 開啟 NVIC 溢出中斷 */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 0, 0);
/* 開啟定時器計數 */
tmr_counter_enable(TMR1, TRUE);
clkout_config();
while(1)
{
}
}
中斷函數
void TMR1_OVF_TMR10_IRQHandler(void)
{
/* 判斷溢出標志位是否置起 */
if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET)
{
/* 增加應用程序 */
at32_led_toggle(LED3);
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
}
實驗效果LED3 每 1 秒翻轉一次
|