首先,
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
} GPIO_TypeDef;
BSRR和BRR寄存器是32位的。
比較:
1)置GPIOA->BSRR低16位的某位爲'1',則對應的I/O端口管腳置'1';
置GPIOA->BSRR低16位的某位爲'0',則對應的I/O端口管腳保持不變。
2)置GPIOA->BSRR高16位的某位爲'1',則對應的I/O端口管腳置'0';
置GPIOA->BSRR高16位的某位爲'0',則對應的I/O端口管腳保持不變。
3)置GPIOA->BRR低16位的某位爲'1',則對應的I/O端口管腳置'0';
置GPIOA->BRR低16位的某位爲'0',則對應的I/O端口管腳保持不變。
例如:
1)要設置端口A的D0、D5、D10、D11爲高,而保持其它I/O口不變,則
GPIOA->BSRR = 0x0C21(0000 1100 0010 0001);
反過頭來再好好消化上述第1條特徵!!!
2)要設置端口A的D1、D3、D14、D15爲低,而保持其它I/O口不變,則
GPIOA->BRR = 0xC00A;
假設有16位data需要寫入高8位的數據,則
GPIO_SetBits(GPIOA, data & 0xff00);
GPIO_ResetBits(GPIOA, (~data & 0xff00));
也可以直接操作這兩個寄存器:
GPIOA->BSRR = data & 0xff00;
GPIOA->BRR = ~data & 0xff00;