使用寄存器點亮LED燈
1.配置輸出資料寄存器
找到LED燈的原理圖:
由原理圖可知,紅色燈對應的端口為PB5,綠色對應的端口為PB0,藍色對應的端口為PB1。當端口為低電平的時候,燈被點亮。
查閱手冊可知,GPIOB的存儲器映像為0X40010C00-0X40010FFF;而端口對應的輸出資料寄存器的偏移量為0Ch。
下面代碼使用了位移操作,詳情可看:【C語言知識】關于移位指令的使用。
配置寄存器的代碼為:
*(unsigned int *)0x40010C0C &=~(1<<0);
2.配置低端口寄存器(CRL)
在配置輸出資料寄存器之前,我們還需要配置端口模式和功能。查閱手冊可知,由CNF0和MODE0分别控制功能和模式,我們需要相應地配置,以用于GPIO口的使用。
LED燈需要使用推挽輸出(後面會解釋),這裡的速度我們使用10MHz。是以CNF0應該為00,MODE0應該為01,整體配置應該是0001。
具體代碼如下:
*(unsigned int *)0x40010C00 |=(1<<(4*0));
3.時鐘配置(RCC)
在絕大部分的應用中,都先需要首先啟動RCC時鐘控制,才能正常的運作程式。
由于GPIOB是APB2總線上的外設,是以我們需要打開APB2中GPIOB對應的時鐘。
IOPBEN的定義如下:
我們隻要打開對應端口的第三個寄存器即可。
查閱手冊得知,APB2的RCC的起始位址為0x40021000-0x400213FF。
具體代碼如下:
*(unsigned int *)0x40021018 |=(1<<3);
4.完整代碼如下
int main(void)
{
//配置時鐘
*(unsigned int *)0x40021018 |=(1<<3);
//配置I/O口模式
*(unsigned int *)0x40010C00 |=(1<<(4*0));
//控制ODR寄存器
*(unsigned int *)0x40010C0C &=~(1<<0);
}
這裡沒有使用固件庫,全部是寄存器程式設計,目的是為了強化對于寄存器的了解,以及複習C語言移位指令。