首先是安裝軟件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下載模式的端口)
對應接上
而後
好了這一節就說到這裏,本身去消化消化
若是這樣開發哈,是最直接了當的,並且是執行速度最快的,可是呢,就是麻煩....