接著上一周的學習,開始暫存器控制跑馬燈程式的編寫。
(1)呼叫函式rcc_apb2periphcolckcmd();控制使能io口是時鐘
(上圖是stm32mini版的原理圖,上一周學習的是stm32 m4,和mini版的io口有很多區別,所有重新附圖。)
如圖可知led0對應io口為pd2,led1所對io口為pa8。在中文參考手冊找出rcc_apb2的介紹,找到這兩個io口對應的位數。
rcc->apb2enr|=1<<2;
這裡用到了c語言的位或運算「|=」,類似於c++中的「+=」。這裡的意思是rcc->apb2enr=它本身的位數或rcc->apb2enr=1。然後將1左移5位,如圖
當1左移5位後來到了 5 的位置,此時無論第五位為何值,與1做或運算結果都為1,此io就是開啟狀態,初始化成功。pa8同理。
(2)對gpio_init初始化
crl控制0~7位
crh控制8~15位
crl暫存器每個io口由四位控制,所以pd2對應位置如圖中畫圈處。led的配置模式和庫函式中相同,分別是推完輸出和50hz,對應的編碼為0011,換算成16進製為3。再賦值進行初始化前要將對應位置清零,就用到了「與運算」,它的特點是在16進製制中,與運算乘以f不改變值,所以將他的第三位清零
gpiod->crl&=0xfffff0ff;
再運用或運算對第三位進行賦值
gpiod->crl|=0x00000300;
odr暫存器的每個io口由一位控制,它不需要清零,直接用或運算將其初始化為高電平
gpiod->odr|=1<<2;
pa8的初始化原理同上。
(3)操作io口,輸出高低電平
在主函式通過while迴圈和延時函式實現小燈的閃爍,其中會用到c語言的非運算:
~(111011)=000100
具體如下
while(1)
隨後學習了用位帶操作編寫跑馬燈的程式。
相比於之前的兩種方法,位帶操作大大簡化了主函式中輸出高低電平的**數量,只需要呼叫對odr暫存器的巨集定義,便可實現高低電平的初始化。
學習了三種跑馬燈的編譯方法,趁熱打鐵,把理論運用到實踐上,學習了mini板的第乙個實驗——按鍵實驗與跑馬燈相比,按鍵實驗需要再初始化乙個與按鍵io口連線有關的函式。如圖
wk up對應pa0 key0對應pc5 key1對應pa15 低電平為按下 高電平為鬆開
巨集定義以上三個按鍵
#define key0 gpio_readinputdatabit(gpioc,gpio_pin_5)
#define key1 gpio_readinputdatabit(gpioa,gpio_pin_15)
#define wk_up gpio_readinputdatabit(gpioa,gpio_pin_0)
#define key0_pres 1
#define key1_pres 2
#define wkup_pres 3
之後編寫按鍵io初始化函式和按鍵掃瞄函式按鍵初始化和led的初始化編譯方法類似,也是通過「右鍵→go to definition」選擇引數的範圍,完成初始化。
按鍵掃瞄函式用到了 static 關鍵字,由於第一周對常用c語言的學習,這一部分的理解沒有費太大力氣。
u8 key_scan(u8 mode)
else if(key0 == 1&&key1 == 1&&wk_up == 0) key_up=1;
return 0;//無按鍵按下
}主函式運用了switch語句,使每次按鍵led燈都能改變狀態(按一次亮,再按一次滅)
switch(t)
以上就是本週的學習內容,對stm32程式的編寫有了大致的邏輯:
STM32筆記記錄
串列埠記錄 stm32有好幾個串列埠。比如說stm32f103zet6有5個串列埠,串列埠1的引腳對應的io為pa9,pa10.pa9,pa10預設功能是gpio,所以當pa9,pa10引腳作為串列埠1的tx,rx引腳使用的時候,那就是埠復用。復用埠初始化有幾個步驟 1 gpio埠時鐘使能。要使用到...
Python自學周記(二)
接著上週的學習熱情,這周原定計畫是學完本書的第一部分,但是隨著習題的深入,新知識的增加,需要花時間理解和記憶的東西也隨之增加,只完成了計畫的三分之二。這周學到了python的乙個很有趣的命令 input input函式的作用簡單來說就是接收或者改變輸入的內容,那為什麼說他有趣呢,因為你可以通過inp...
STM32自學筆記 復用重對映
什麼事埠復用 stm32有很多的內建外設,這些外設的外部引腳都是與gpio復用的。也就是說,乙個gpio如果可以復用為內建外設的功能引腳,那麼當這個gpio作為內建外設使用的時候,就叫做復用。如何使用 1.使能gpio時鐘 2.使能復用功能的時鐘 3.依據資料手冊設定gpio口資料 eg.rcc a...