呼叫批次設定函式,一次執行所有旗標群以及暫存器的蓋寫是最方便使用的設定方式。
為了維持設定值的設定彈性,各個旗標群及暫存器的預設設定值可以預存在初值巨集,此初值巨集可由使用者自行決定要用預設值或重新編修。
C4M-OS針對批次設定函式提供了佈局巨集,佈局巨集中會定義出硬體設定值結構體,定義中會同時以初值巨集來初始化結構體。
呼叫批次設定函式執行時會讀取硬體設定值結構體取得參數及設定值,再逐一蓋寫旗標群及暫存器即可完成設定。
TIMER硬體設定值結構體的初值巨集
ASA_M128單板上有4個計時計數器,其中Timer0,Timer2為相似的8位元計時計數器,它們有相似的暫存器設定結構體型態TIM0_2RegData_t,及初值巨集 TIM0_2_REG_DATA_INT。旗標群方面Timer0因為多了可選擇外部訊號源設定,所以有各自的設定結構體型態,TIM0FgGpData_t,TIM2FgGpData_t,及各自的初值巨集TIM0_FG_DATA_INT, TIM2_FG_DATA_INT。
而Timer1,Timer3,則為完全相似的16位元計時器。因此它們共用相同的設定暫存器結構體型態TIM1_3RegData_t,及設定旗標群結構體型態TIM1_3FgGpData_t。與初值巨集 TIM1_3_FG_DATA_INT, TIM1_3_REG_DATA_INT。
• TIMER設定暫存器初始化巨集TIM0_2_REG_DATA_INT,TIM1_3_REG_DATA_INT
#defineTIM0_2_REG_DATA_INT{\
.OCRn =17,/*38400Hz */\
.Total =1}
#defineTIM1_3_REG_DATA_INT{\
.OCRn =17,/*38400Hz */\
.Total =2}
• TIMER設定旗標群初始化巨集:TIM0_FG_DATA_INT,TIM2_FG_DATA_INT, TIM1_3_FG_DATA_INT
#defineTIM0_FG_DATA_INT{\
.ASn =TIM_CLKS_SYSCLK,\
.WGMn0_1 =SQUARE_WAVE,\
.CSn0_2 =TIM0_CLK_DIV_BY8,\
.COMn0_1=DISABLE,\
.DDx = OUTPUT,\
.Total=5}
#defineTIM2_FG_DATA_INT{\
.WGMn0_1 =SQUARE_WAVE,\
.CSn0_2 =TIM0_CLK_DIV_BY8,\
.COMn0_1= DISABLE,\
.DDx = OUTPUT,\
.Total=4}
#defineTIM1_3_FG_DATA_INT{\
.WGMn0_1 =SQUARE_WAVE_A,\
.WGMn2_3 =SQUARE_WAVE_B,\
.CSn0_2 =TIM0_CLK_DIV_BY8,\
.COMnA0_1=DISABLE,\
.DDx = OUTPUT,\
.Total=5}
硬體設定佈局巨集
有了硬體設定結構體型態HardWareSet_t,以及前述硬體設定值結構體初值巨集之後,使用者只要呼叫硬體布局巨集TIMn_HW_LAY(),即可完成編號n的計時計數硬體設定用結構體定義及以初始化。
本單元外部中斷硬體設定佈局巨集為例:
TIMn_HW_LAY()
簡述:用以布局(定義並初始化)計時計數器TIMn,即使用結構體內參數批次設定計時計數器的旗標群及暫存器。其中n為外部中斷編號,從0到4。
參數:無
產出新變數:TIMnHWSet_str, TIMnFGParaList[3], TIMnRegParaList[1]
前置動作:引入外部中斷規畫檔TIM0_3HW.cfg,提供預設的參數初始設定值
範例:以TIMER1為例,呼叫外部中斷結構體佈局巨集TIMn_HW_LAY() ,會產生TIM1HWSet_str, TIM1FGParaList[3], TIM1RegParaList[1]。以供呼叫批次函式初始化TIMER1。
通用硬體設定函式HardWare_set():
在利用硬體設定佈局巨集定義並初始了TIMER硬體設定結構體TIMnHWSet_str 後,只要以此結構體的住址為指標,呼叫本通用硬體設定函式,即能整批一次完成TIMER硬體設定。
uint8HardWare_set(HardWareSet_t*Str_p);
簡介:以硬體設定參數結構體指標為傳參,被呼叫時能夠自動依據結構體內容完成硬體設定用暫存器及旗標群蓋寫。
傳址變數:
HardWareSet_t*Str_p:硬體設定結構體指標。
前置動作:
呼叫前需先完成硬體設定參數結構體,中暫存器,旗標群數目,暫存器,及旗標群之預設值確認或更新。
RETURN: 錯誤代碼
0: 無錯誤,1: 旗標群數不吻合,2:暫存器總位元組不吻合。
範例:假設我們要依原定條件,亦即低準位觸發,且直接致能中斷,則設定外部中斷4
#includeTIM0_3HW.cfg, /*引外部中斷初值巨集*/
TIM1_HW_LAY();/*定義並初始化 TIM1HWSet_str */
HardWare_set(&TIM1HWSet_str);/*利用 TIM1HWSet_str 參數欄位完成硬體TIMER1的設定 */
:
sei();/*EnableAll Int */