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

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

 

首先是安裝軟件html

這一節用Kei來實現,須要安裝MDK4.7這個軟件,怎麼安裝,本身百度哈.都學習32的人了,不會連個軟件都不會安裝吧....仍是那句話函數

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

 

建個文件夾學習

 

 

 

 

 

 

 

 

我用的是STM32F103C8t6  你們根據本身的選擇url

 建一個主函數的 .c文件spa

 

 

 

 

 

 

 

 編譯一下htm

 

 

 

啓動文件裏面有個執行 SystemInit函數的調用,由於咱沒有這個函數,因此報錯了,其實寄存器開發用不到,實際上這是官方提供的庫開發的時候須要的blog

能夠看一下官方提供的庫開發裏面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)

相關文章
相關標籤/搜索