STM32自學周記(二)

2021-09-13 12:29:41 字數 2765 閱讀 7366

接著上一周的學習,開始暫存器控制跑馬燈程式的編寫。

(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...