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下載模式的端口)
對應接上
然后
好了這一節就說到這里,自己去消化消化
如果這樣開發哈,是最直接了當的,而且是執行速度最快的,但是呢,就是麻煩....