C4M-OS硬體監測旗標群讀取巨集REGFGT()
C4M-OS除了提供完整暫存器讀寫的巨集以外,暫存器部份位元旗標群蓋寫巨集REGFPT()。也提供了暫存器部份位元旗標群讀回巨集REGFGT()。
REGFGT(HWREG_p,Mask,Shift,Data_p)
簡介:配合參數快查表協助使用者完成,讀取暫存器,遮罩提取旗標並平移成回應用資料。取用HWREG_p住址暫存器的資料,後以Mask擷取位元內容再經右移Shift後存入具Data_p住址的變數。
參數說明:
HWREG_p:同旗標蓋寫參數快查表。
Mask: 同旗標蓋寫參數快查表。
Shift:同旗標蓋寫參數快查表。
Data_p:待存入旗標值的記憶體指標住址。
前置動作:引入巨集定義檔bits_op.h
搭配REGFGT() C4M-OS也提供了DIO硬體設定及控制操作旗標群監測參數快查表,依據不同的動作ACTION提供了呼叫時需用的傳參及讀回值解讀說明。
DIO硬體設定及操作旗標群監測參數快查表(呼叫REGFGT()/DIO_fgt()執行)
表格中,Action行,HWREG_p行,Mask行,Shift行,Data 行均與設定快查表義意相同,操作動作無需Field 行。
範例:
想要以平行埠C的高四位元讀取指撥開關的設定HI/LO,再以平行埠C的低四位元輸出到LED顯示讀到的設定值。
• 設定portC b7,b6,b5,b4為輸入:查DIO硬體設定旗標群蓋寫參數快查表,其動作Action為設定PORTn埠部份位元的I/O方向
◦ HWREG_p:由於涉及平行埠C的輸出入方向,因此HWREG_p參數為 &DDRC。
◦ Mask:因為只想改變b7,b6,b5,b4的輸出入方向,因此只有b7,b6,b5,b4 為1,其它的均為0,Mask=0b11110000=0xF0
◦ Shift:如表所示不平移Shift=0;
◦ Data: 因為要設定b7,b6,b5,b4成為輸入方向,因此只有b7,b6,b5,b4 必需要是0,其它的位元因為被遮置阻擋所以無所謂,可選擇都是0,亦即Data=0b0000 0000=0x00。
• 設定portC b3,b2,b1,b0為輸出:查DIO硬體設定旗標群蓋寫參數快查表,其動作Action為設定PORTn埠部份位元的I/O方向
◦ HWREG_p:由於涉及平行埠C的輸出入方向,因此HWREG_p參數為 &DDRC。
◦ Mask:因為只想改變b3,b2,b1,b0的輸出入方向,因此只有b3,b2,b1,b0 為1,其它的均為0,Mask=0b00001111=0x0F
◦ Shift:如表所示不平移Shift=0;
◦ Data: 因為要設定b3,b2,b1,b0 成為輸出方向,因此只有b3,b2,b1,b0 必需要是1,其它的位元因為被遮置阻擋所以無所謂,可選擇都是0,亦即Data=0b00001111=0x0F 或全數為1,Data=0b1111 1111=0xFF。
• 由portC b7,b6,b5,b4輸入:查DIO硬體設定及操作旗標群監測參數快查表,其動作Action為由PORTn讀取部份旗標群。
◦ HWREG_p:由於要由平行埠C輸入,因此HWREG_p參數為 &PINC。
◦ Mask:因為只想由b7,b6,b5,b4輸入,因此只有b7,b6,b5,b4為1,其它的均為0,Mask=0b11110000=0xF0
◦ Shift:如表所示應為最低輸出位元b4 的平移,亦即Shift=4;
◦ Data_p: b7,b6,b5,b4旗標群,只要高於4位元的變數都足夠容納讀回結果。可以定義一個八位元整數uint8_tInData,並取用其住址為參數,&InData。
• 由portC b3,b2,b1,b0輸出:查DIO硬體控制操作旗標群蓋寫參數快查表,其動作Action為由PORTn輸出部份旗標群。
◦ HWREG_p:由於要由平行埠C輸出,因此HWREG_p參數為 &PORTC。
◦ Mask:因為只想由b3,b2,b1,b0輸出,因此只有b3,b2,b1,b0為1,其它的均為0,Mask=0b00001111=0x0F;
◦ Shift:如表所示應為最低輸出位元b0 的平移,亦即Shift=0;
◦ Data: b3,b2,b1,b0旗標群,可表示的值最小為0,最大為15。 因此Data可以是0,...,15其中的一個值。
範例程式:
/*Setting PORTE b7,b6,b5,b4 as Input pins*/
REGFPT(&DDRC,0xF0,0,0x00);
/*Setting PORTE b3,b2,b1,b0 as Output pins*/
REGFPT(&DDRC,0x0F,0,0xFF);
:
/*Read PORTC b7,b6,b5,b4*/
uint8_t InData;
REGFGT(&PINC,0xF0,4,&InData);
/*Send the OutData from PORTC b3,b2,b1,b0*/
REGFPT(&PORTC,0x0F,0,InData);