C4M-OS除了提供完整暫存器讀寫的巨集以外,也提供暫存器部份位元旗標群讀寫巨集。其中旗標群蓋寫巨集REGFPT()可供硬體設定旗標群設定,以及硬體控制旗標群操作。執行旗標群蓋寫入時,為了要避免改變同一暫存器上的其他位元,需要先讀回暫存器現存內容,以遮罩選擇性保留不變內容並改寫目標位元,最後再寫回原暫存器。由於程序繁複且固定,最適合整合成巨集。以下便是用於蓋寫暫存器內部份內容的巨集。
REGFPT(HWREG_p,Mask,Shift,Data)
簡介:配合參數快查表協助使用者完成,平移資料,遮罩資料並蓋寫暫存器工作。取用Data提供的資料,經過左移Shift後以Mask選寫性蓋寫 HWREG_p的暫存器相應位元。
參數說明:
HWREG_p:位元組暫存器住址。
Mask: 遮罩,以涉及的位元為1,不涉及的位元為0的一位元組遮罩內容。
Shift:平移,即旗標位元群中最低位元所在位置。
Data:變數名稱或直接給值。
前置動作:引入巨集定義檔bits_op.h
C4M-OS 也為硬體設定旗標群,以及硬體監測操作旗標群,參考MCU手冊整理出DIO硬體設定旗標群蓋寫參數快查表,DIO硬體控制操作旗標群蓋寫參數快查表提供使用者依據其需求,以欲執行設定或監測動作查詢相關參數。
DIO硬體設定旗標群蓋寫參數快查表(呼叫REGFPT()/DIO_fpt()執行)
表格中,Action行以下為各式設定動作,HWREG_p行以下為同列設定動作應寫入暫存器的指標值,Mask行以下為同列設定動作的遮罩位元組,Shift行以下為同列設定動作的平移位元。Data 行以下為同列設定動作之設定值建構原則說明。Field 行以下則是保留給同列設定動作,設定值結構體的欄位名稱,未來有機會會有詳細說明。
DIO硬體控制操作旗標群蓋寫參數快查表(呼叫REGFPT()/DIO_fpt()執行)
表格中,Action行,HWREG_p行,Mask行,Shift行,Data 行均與設定快查表義意相同,操作動作無需Field 行。
當要採用平行埠的一部份接腳執行輸出,又不確認同一平行埠其他接腳是否具有其它功能的狀況下。在避免影響其它接腳功能,可以呼叫REGFPT()指定平行埠部份接腳設定為輸出,然後再呼叫REGFPT()只對這部份的接腳執行輸出。
例如:想要以平行埠B的b7,b6,b5三位元,輪流輸出0到7的值。可以先執行設定部份位元輸出,再依需求對特定位元輸出值。
• 設定部份位元:查找DIO硬體設定旗標群蓋寫參數快查表,其動作Action為設定PORTn埠部份位元的I/O方向
◦ HWREG_p:由於涉及平行埠B的輸出入方向,因此HWREG_p 參數為 &DDRB。
◦ Mask:因為只想改變b7,b6,b5 的輸出入方向,因此只有b7,b6,b5 為1,其它的均為0,Mask=0b11100000=0xE0
◦ Shift:如表所示Shift=0;
◦ Data: 因為要設定b7,b6,b5 成為輸出方向,因此只有b7,b6,b5必需要是1,其它的位元因為被遮置阻擋所以無所謂,可選擇都是0,亦即Data=0b11100000=0xE0,或則選擇全數都是1,Data= 0b11111111=0xFF。
• 對特定位元輸出值:查DIO硬體控制操作旗標群蓋寫參數快查表,其動作Action為由PORTn輸出部份位元旗標群。。
◦ HWREG_p:由於要由平行埠B輸出,因此HWREG_p 參數為 &PORTB。
◦ Mask:因為只想由b7,b6,b5輸出,因此只有b7,b6,b5為1,其它的均為0,Mask=0b11100000=0xE0
◦ Shift:如表所示應為最低輸出位元b5 的平移,亦即Shift=5;
◦ Data: b7,b6,b5旗標群,可表示的值最小為0,最大為7。 因此Data可以是0,...,7其中的一個值。
範例程式如下:
/*Setting PortB b7,b6,b5 as Output pins*/
REGFPT(&DDRB,0xE0,0,0xFF);
for(uint8_t i=0,i<8,i++){
REGFPT(&PORTB,0xE0,5,i); /* Send Out data through PB b7:b5*/
for(uint8_tj=0,j<8,j++){
printf(“%d,%d”,i,j);
}
}