一個使用定時器的跑馬燈
?
有了上片“一個簡單的跑馬燈”后,已經(jīng)可以對IO口進行操作,但實際使用中經(jīng)常要定時的去執(zhí)行某一些動作,這就需要使用到定時器和中斷,在一定的時間去觸發(fā)執(zhí)行要求的動作。
CH563 有4個定時器,功能挺多,這里只用最簡單的定時功能;這里選用TIM0,TIM0相關(guān)寄存器如下:
都是資料中有詳細注解,這里就不一一描述了。初始化在資料中介紹如下:
對應代碼如下:
void Timer3_Init( UINT32 count_end)
{??????????????????????? ????????????????????????????
??? R8_TMR3_CTRL_MOD = 0;
?????? ??
??? R32_TMR3_CNT_END = count_end;????????????? /* 捕獲的最大超時時間 */
??? R8_TMR3_CTRL_MOD |= RB_TMR_COUNT_EN ;?? /* 允許計數(shù),啟動定時器 */
}
到這里就完成了TIM0 定時功能的初始化;
CH563 中斷系統(tǒng)分為 IRQ ,FIQ 兩大類, FIQ 優(yōu)先級比IRQ 高,響應速度更快。
這里使用IRQ 模式;IRQ 中斷初始化如下:
void IRQ_Init( void )
{???
??? R8_TMR0_INT_FLAG?? = RB_TMR_IF_DATA_ACT|RB_TMR_IE_CYC_END|RB_TMR_IF_FIFO_HF|
???????????????????????? RB_TMR_IF_DMA_END|RB_TMR_IF_FIFO_OV|RB_TMR_IF_DMA_ERR; /* 清除所有的中斷標志 */???
??? R8_TMR3_INTER_EN?? = RB_TMR_IE_CYC_END;???????????????????????????????????? /* 計數(shù)到達終值中斷使能 */
??? R8_INT_EN_IRQ_0??? = RB_IE_IRQ_TMR3;??????????????????????????????????????? /* 允許定時器3相關(guān)中斷產(chǎn)生 */
??? R8_INT_EN_IRQ_GLOB = RB_IE_IRQ_GLOB;??????????????????????????????????????? /* 只開啟IRQ全局中斷 */
}
?
?
初始化了中斷,還得要中斷子程序來響應中斷,中斷子程序的代碼參照上篇操作LED代碼更改后如下:
__irq void IRQ_Handler( void )
{
??? UINT8 i;
?
?? PRINT( "irq#? " );
?? if(R8_INT_FLAG_0&RB_IF_TMR3){
?????? i= R8_TMR3_INT_FLAG;
?????? if(i&RB_TMR_IF_CYC_END){????????????????????????????? ??????????????????/* 捕獲超時中斷 */
??????????? if(ss == 1)
???????????????????? {???? LED2_OUT_ACT( );
??????????????????????????? LED4_OUT_INACT( );
??????????????????????????? ss = 2;
???????????????????? }
???????????????????? else if(ss == 2)
???????????????????? {
??????????????????????????? LED2_OUT_INACT( );
??????????????????????????? LED3_OUT_ACT( );
??????????????????????????? ss = 3;
???????????????????? }
???????????????????? else
???????????????????? {
??????????????????????????? LED3_OUT_INACT( );
??????????????????????????? LED4_OUT_ACT( );
??????????????????????????? ss = 1;
???????????????????? }
?
???????????????????? R8_TMR3_INT_FLAG=0xff;???????????????????????????????????????????? /* 清除相應中斷標志 */
??????????? R8_INT_FLAG_0 |= RB_IF_TMR3;?????????????????????????????????????? /* 清除相應中斷標志 */
??????????? R32_TMR3_FIFO;
??????? }
??? }
}
?
完整代碼參考附件
?
?
?