2-STM32帶你入坑系列(點亮一個燈--Keil)


1-STM32帶你入坑系列(STM32介紹)

 

首先是安裝軟件

這一節用Kei來實現,需要安裝MDK4.7這個軟件,怎么安裝,自己百度哈.都學習32的人了,不會連個軟件都不會安裝吧....還是那句話

沒有百度一下解決不了的事情,如果有那就是百度兩下(除了科研和探索人類未知領域)

 

建個文件夾

 

 

 

 

 

 

 

 

我用的是STM32F103C8t6  大家根據自己的選擇

 建一個主函數的 .c文件

 

 

 

 

 

 

 

 編譯一下

 

 

 

啟動文件里面有個執行 SystemInit函數的調用,因為咱沒有這個函數,所以報錯了,其實寄存器開發用不到,實際上這是官方提供的庫開發的時候需要的

可以看一下官方提供的庫開發里面SystemInit實現的什么功能

 

 主要的是配置了一開始的時鍾,因為是初學者,所以先不用管哈,以后咱也會去配置外設時鍾,,不對,這一節就會去配置時鍾

咱就寫一個這個函數,然后內部什么都不寫

 

 

 

 還有個警告,實說最后的代碼要多加一個空行

我也不知道為什么有這個規則

 

我的開發板有個燈是PC13  

 

 咱就讓PC13輸出高電平,然后控制燈亮

 

 然后咱就找控制PC13的寄存器,看看往寄存器里面寫幾然后控制PC13輸出高電平

 

 

 

 

 

 首先需要明確一件事情哈

每個IO都有  CRL,CRH,IDR,ODR,BSRR,BRR,LCKR 這些寄存器,而這些寄存器都是32位的,占四個字節,(大家可以看圖哈),

 

假設咱的單片機哈有PA口和PB口

然后假設PA的地址是  0x40010800  PB的地址是 0x40010C00 實際上內部的寄存器呢,是這樣的

然后再說一下引腳的模式

 

 模擬輸入:該引腳就會連接內部的模擬輸入模塊(使用ADC或者DAC的時候需要設置)

浮空輸入模式:引腳狀態完全由外部決定(一般串口的RX引腳設置成這種模式)

上拉/下拉:就是內部實現上下拉

通用推挽輸出:就是直接輸出高低電平,推挽輸出還有個速率問題

這樣理解:假設SPI傳輸的速率是9M的,假設我設置了引腳的輸出最大是2M,引腳的反轉速度根本跟不上哈,所以會傳輸不正常,所以可以設置輸出速率為10M

當然速率越高,功耗越大

通用開漏輸出:和51單片機的P0口似的,沒有輸出能力,需要外部接上拉電阻才可以(可以用來做通信時候的電壓匹配,因為咱的32是3,3V供電,假設和5V的芯片通信,咱可以設置為這個模式,然后上拉一個電阻,然后電阻另一邊接的是5V)

 

后面還有復用功能推挽/開漏輸出:其實哈所謂復用,就是指引腳的第二功能,就是除了正常的輸入輸出的其它功能,列如:

   PA2還有個功能是串口2的輸出,如果要用這個功能,就需要配置PA2為:復用推挽輸出

好啦好啦,請清空自己的腦子,這些東西哈,等用到了再說.... 記住哈,用到什么學什么,知識的海洋永遠沒有盡頭的,千萬別像學校里面似的先統統學學學,最后來個考試,  咱是學一個知識點,用一個知識點,然后再學一個知識點,再用一個知識點.......

 

現在假設配置 PA0 輸出 高電平  輸出速率咱選擇 50M   注意:設置輸出高電平,那么IO口就是一直是高電平,和輸出速率沒有關系,唯一的關系就是速率越高響應的越快

舉個栗子:

假設哈:  速率是1HZ   那么執行輸出高電平操作可能會延時 1S后才執行,然后一直輸出高電平

假設用這個速率執行9M  SPI通信肯定是不行的,因為這個速率根本跟不上哈.....

 

 

 配置端口0為推挽輸出 50M  

 

那么這個寄存器的值   0x4444 444 3   前面的4444444是用的默認的值, 后面的3就是配置0端口  (0011)

 

00的意思

 

  

 

 

 11的意思

 

 看一下PA口的地址

 

 起始地址是0x4001 0800

 

 

 偏移是00h就是說,要配置PA口的CRL這個寄存器,(配置端口0為推挽輸出 50M)直接

往0x4001 0800這個地址寫入  0x4444 444 3  就可以了

 

 有沒有這樣想的

0x40010800 = 0x44444443

 

 

 要告訴編譯器0x40010800是一個地址才好,然后我要往這個地址里面寫東西

(int *)0x40010800  這樣就能告訴編譯器0x40010800是一個地址

然后讀取這個地址里面的值   aa =  *((int *)0x40010800)  

給這個地址賦值   *((int *)0x40010800)  = XXXXX

所以 就是 *((int *)0x40010800)  = 0x44444443;

 

 

這個只是配置了PA0的模式,咱還要讓他輸出高電平(配置了引腳,那個該引腳應該會有變化)  仿真下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 控制0端口輸出高電平就是讓ODR寄存器的值是    0x0000 0001

 因為這個寄存器說有個偏移是0c   其實,額,還記得這張圖不

 

 說白了就是前面的地址被其它寄存器占了而已,注意這里所說的偏移,都是在0x40010800的基礎上需要增加多少才能到那個寄存器

 所以要配置PA口 的ODR寄存器   就是需要在原來地址的基礎上加上 0x0C

所以控制PA0輸出高電平就是

*((int*)(0x40010800+0x0c))  = 0x0000 0001

 

 

 咱先下載到開發板試一試

 

生成hex文件然后下載到開發板里面

 

 

 

 

 

 

 

 

 

 

 

 

一,下載STM32程序

 

1,方式一,串口下載(其他下載方式在最后補充)

 

①調整撥動開關位置 → 短接BOOT0和3.3V → 復位STM32

 

 

 

 

 

 

 

 

②打開下載軟件,下載程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

會發現......不可以,,,哈哈哈哈    肯定還有沒有配置的地方

 

 需要打開時鍾,有人就會想,這么麻煩呀......

嘿嘿,想一個場景,現在很多項目都需要低功耗,STM32呢之所以這些地方需要自己選擇性的打開,就是為了低功耗

您想想哈,不打開,不用它,肯定省電

好了,咱就去打開時鍾去

感覺到繁瑣了沒,注意這樣寄存器開發哈,以后用庫函數就方便的多,很多都封裝好了,直接調用就可以

我個人感覺要想學好一個東西,其實最重要的是過程,我要讓大家知道一切的一切都是怎么來的,為什么ST的官方要弄庫函數,庫函數是怎么寫的.很少人會講的這么深,總結起來有幾個原因(嫌麻煩,懶的具體研究;怕講不好,反倒讓別人不喜歡自己的教程).

我呢從來不嫌麻煩,而且知識儲備和自學能力還可以,所以呢....額,我也不知道該說什么,反正還是那句話:我說講的東西不會讓大家感覺到難,只是會感覺繁瑣而已

現在市面上倒賣魚的太多了,真正教給捕魚的少之又少,我所希望的是前期自己捕魚自己吃,后期從賣魚的那里直接買魚吃.等到哪一天賣魚的不再了,你不是還可以自己捕魚.當然你學會了捕魚,當然也可以賣魚,我現在就開始賣魚了,也賣捕魚的方法

扯了這么多.........

 

 就是往這個寄存器里面的這個位寫1就可以了

然后就是找地址

 

 

 

 

 

 所以RCC_APB2ENR這個寄存器的地址是

0x4002 1000  + 0x18

 

*((int*)(0x40021000+0x18))  = 0x00000004    

這個4    0100

 

 

 

 

 

 

 

 

 好了好了咱修改修改,去點亮小燈   PC13

 

首先是打開時鍾   

 

所以是  *((int*)(0x40021000+0x18)) = 0x00000010; 

 

 

 

配置為輸出50M

 

 

 

 說一下哈 CRL是配置0-7引腳號   CRH是配置8-15引腳號   所以選擇CRH

 

 

 *((int *)(0x40011000 + 0x04)) = 0x44344444;  默認的咱就默認是4

 

 

配置輸出高電平

 

 *((int *)(0x40011000 + 0x0C)) = 0x00002000;

 

 

 下載進去

 

 

 

 現在熄滅

 

 

 

 

補充:下載STM32程序的其他方式

ST-LINK下載

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 如果是用Jlink (我沒有引出來JATG下載端口,只引出來了SW下載模式的端口)

 

 

   

 

對應接上

然后

 

 

 

 

 

 

 好了這一節就說到這里,自己去消化消化

如果這樣開發哈,是最直接了當的,而且是執行速度最快的,但是呢,就是麻煩....

 

3-STM32帶你入坑系列(自己封裝點亮一個燈的庫--Keil)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM