Stm32
相對于51復(fù)雜了太多,之前自己學(xué)習(xí)方法不對,所以導(dǎo)致花了時間也沒什么效果,現(xiàn)在工作了自己也知道該怎么來更好學(xué)習(xí)了,準(zhǔn)備花兩周左右看一下stm32中文手冊及固件庫手冊,然后再按照正點原子的不完全手冊結(jié)合這開發(fā)板來學(xué)習(xí),也記下學(xué)習(xí)筆記總結(jié)學(xué)習(xí)、加深記憶。
此次的學(xué)習(xí)是以STM32F103RBT6作為核心MCU的,其有128k
flash、20k
sram、2個spi、3個串口、1個usb、1個can、2個12位的adc、rtc以及51個可用的IO口。
筆記一 存儲器及總線架構(gòu)
1.Stm32主系統(tǒng)由以下部分構(gòu)成:
● 四個驅(qū)動單元: ─ Cortex??-M3內(nèi)核DCode總線(D-bus),和系統(tǒng)總線(S-bus) ─ 通用DMA1和通用DMA2
● 四個被動單元 ─ 內(nèi)部SRAM
─ 內(nèi)部閃存存儲器
─ FSMC
─ AHB到APB的橋(AHB2APBx),它連接所有的APB設(shè)備。
2.在每一次復(fù)位以后,所有除SRAM和FLITF以外的外設(shè)都被關(guān)閉,在使用一個外設(shè)之前,必須設(shè)置寄存器RCC_AHBENR來打開該外設(shè)的時鐘。所以以后編程的時候要記住設(shè)置RCC_AHBENR來使能外設(shè)。
3.memory map是很重要的,以前一直沒有引起足夠的重視,程序存儲器、數(shù)據(jù)存儲器、寄存器和輸入輸出端口被組織在同一個4GB的線性地址空間內(nèi)。
4. 兩個位段(bit-band)區(qū),下面的映射公式給出了別名區(qū)中的每個字是如何對應(yīng)位帶區(qū)的相應(yīng)位的(相當(dāng)于51單片機中的P0口操作轉(zhuǎn)換到P0^1的操作):
bit_word_addr = bit_band_base + (byte_offset×32)
+ (bit_number×4)
其中: bit_word_addr是別名存儲器區(qū)中字的地址,它映射到某個目標(biāo)位。
bit_band_base是別名區(qū)的起始地址。
byte_offset是包含目標(biāo)位的字節(jié)在位段里的序號
bit_number是目標(biāo)位所在位置(0-31)
例子: 下面的例子說明如何映射別名區(qū)中SRAM地址為0x20000300的字節(jié)中的位2: 0x22006008
= 0x22000000 + (0x300×32)
+ (2×4). 對0x22006008地址的寫操作與對SRAM中地址0x20000300字節(jié)的位2執(zhí)行讀-改-寫操作有著相同的效果。
5.boot0和boot1可以設(shè)置stm32啟動模式
啟動模式選擇引腳 啟動模式 說明
(BOOT1
BOOT0 )
X 0 主閃存存儲器 主閃存存儲器被選為啟動區(qū)域
0 1 系統(tǒng)存儲器 系統(tǒng)存儲器被選為啟動區(qū)域
1 1 內(nèi)置SRAM 內(nèi)置SRAM被選為啟動區(qū)域
當(dāng)使用ISP下載的時候,選擇第三種啟動方式。
筆記二 CRC計算單元
對于本章,不知道要用到什么地方,不過等以后遇到再說。
CRC用兩個數(shù)據(jù)寄存器和一個控制寄存器,一個數(shù)據(jù)寄存器用來做計算寄存器,對其寫操作作為輸入寄存器,輸入計算數(shù)據(jù);對其讀操作作為輸出寄存器,輸出計算結(jié)果。另一個數(shù)據(jù)寄存器只有低8位有效,可以用來寄存數(shù)據(jù);控制寄存器只有0位有效,作為reset位,只能寫1,硬件自動清零。
筆記三 電源控制及管理
之前學(xué)51什么的,電源啊時鐘呀都只有一個不需要設(shè)置選擇,后來工作接觸了增強型8051后了解了多個時鐘電源后再來學(xué)32已經(jīng)不像之前那樣對這么多的時鐘電源感到畏懼了,呵呵。。Stm32的工作電壓(vdd)在2-3.6v,可以通過內(nèi)置的電壓調(diào)節(jié)器提供所需的1.8v電源。當(dāng)主電源(vdd)掉電后,可以通過VBAT引腳為實時時鐘(RTC)和備份寄存器提供電源,當(dāng)主電路中沒有設(shè)計使用外部電源時,則必須將VBAT連接到VDD引腳上面。還有一點需注意,VDD與VBAT在某些情況下會存在注入電流,所以在外部VBA和電源之間要接一個低壓降二極管。
為了提高轉(zhuǎn)換精度,stm32為adc提供了一個獨立的電源供電,過濾和屏蔽來自印刷電路板上面的毛刺干擾。
電壓調(diào)節(jié)器總是使能的在復(fù)位后,有運轉(zhuǎn)模式、停止模式、待機模式三種工作模式。
Stm32中有一個完整的上電復(fù)位(POR)和掉電復(fù)位電路(PDR),只要供電電壓達到2v則能正常工作。當(dāng)VDD/VDDA低于VPOR和VPDR時則保持為復(fù)位狀態(tài)。對于可編程電壓檢測器(PVD)可以利用PVD對VDD電壓與電源控制寄存器(PWR_CR)中的PLS[2:0]位進行比較來監(jiān)控電源,這幾位選擇監(jiān)控電壓的閥值。
因為之前研究過silab公司出的低功耗無線芯片si100x(增強型8051內(nèi)核的),所以對stm32的低功耗模式就比較容易理解了,32有睡眠模式、停止模式和待機模式三種低功耗模式,可以通過不同的寄存器操作去實現(xiàn),這個就不詳細說了,了解了大概,以后需要用的時候再詳細研究吧。32還提供了一個低功耗模式下的自動喚醒模式,主要依靠rtc(和si100x差不多的,不過si100x還要強大的多)。
對寄存器什么的就等以后用到的時候再查閱相關(guān)資料吧,相信那樣記憶也會更深刻。
筆記四 復(fù)位和時鐘電路
該32芯片支持三種復(fù)位形式,系統(tǒng)復(fù)位、上電復(fù)位和備份區(qū)域復(fù)位。
除了時鐘控制器的RCC_CSR寄存器中的復(fù)位標(biāo)志位和備份區(qū)域中的寄存器以外,系統(tǒng)復(fù)位將復(fù)位所有寄存器至它們的復(fù)位狀態(tài)。
當(dāng)發(fā)生以下任一事件時,產(chǎn)生一個系統(tǒng)復(fù)位:
1. NRST引腳上的低電平(外部復(fù)位)
2. 窗口看門狗計數(shù)終止(WWDG復(fù)位)
3. 獨立看門狗計數(shù)終止(IWDG復(fù)位)
4. 軟件復(fù)位(SW復(fù)位)
5. 低功耗管理復(fù)位
可通過查看RCC_CSR控制狀態(tài)寄存器中的復(fù)位狀態(tài)標(biāo)志位識別復(fù)位事件來源。還存在軟件復(fù)位和低功耗復(fù)位,詳細參考中文手冊吧。
當(dāng)以下事件中之一發(fā)生時,產(chǎn)生電源復(fù)位:
1. 上電/掉電復(fù)位(POR/PDR復(fù)位)
2. 從待機模式中返回
電源復(fù)位將復(fù)位除了備份區(qū)域外的所有寄存器。
備份區(qū)域擁有兩個專門的復(fù)位,它們只影響備份區(qū)域。
當(dāng)以下事件中之一發(fā)生時,產(chǎn)生備份區(qū)域復(fù)位。
1. 軟件復(fù)位,備份區(qū)域復(fù)位可由設(shè)置備份域控制寄存器 (RCC_BDCR)中的BDRST位產(chǎn)生。
2. 在VDD和VBAT兩者掉電的前提下,VDD或VBAT上電將引發(fā)備份區(qū)域復(fù)位。
時鐘 有三種不同的時鐘源可以被用來驅(qū)動系統(tǒng)時鐘(SYSCLK)
● HSI振蕩器時鐘 ● HSE振蕩器時鐘 ● PLL時鐘
這些設(shè)備有以下2種二級時鐘源:
● 40kHz低速內(nèi)部RC,可以用于驅(qū)動獨立看門狗和通過程序選擇驅(qū)動RTC。RTC用于從停機/待機模式下自動喚醒系統(tǒng)。
● 32.768kHz低速外部晶體也可用來通過程序選擇驅(qū)動RTC(RTCCLK)。 當(dāng)不被使用時,任一個時鐘源都可被獨立地啟動或關(guān)閉,由此優(yōu)化系統(tǒng)功耗。
高速外部時鐘由(HSE)以下兩種時鐘源組成:
● HSE外部晶體/陶瓷諧振器 ● HSE用戶外部時鐘
為了減少時鐘輸出的失真和縮短啟動穩(wěn)定時間,晶體/陶瓷諧振器和負(fù)載電容器必須盡可能地靠近振蕩器引腳。負(fù)載電容值必須根據(jù)所選擇的振蕩器來調(diào)整。外部時鐘信號(50%占空比的方波、正弦波或三角波)必須連到SOC_IN引腳,同時保證OSC_OUT引腳懸空。
還有HSI時鐘、PLL時鐘、LSE時鐘、LSI時鐘、時鐘安全選擇、RTC時鐘、看門狗時鐘等等也應(yīng)該理解的這里就不一一做筆記了,反正以后遇到了后再來查閱。
關(guān)于系統(tǒng)時鐘的選擇,當(dāng)系統(tǒng)復(fù)位的時候HIS被默認(rèn)選為系統(tǒng)時鐘,當(dāng)其他時鐘源被選為系統(tǒng)時鐘之前,不能被停止。只有當(dāng)目標(biāo)時鐘源準(zhǔn)備就緒了(經(jīng)過啟動穩(wěn)定階段的延遲或PLL穩(wěn)定),從一個時鐘源到另一個時鐘源的切換才會發(fā)生。在被選擇時鐘源沒有就緒時,系統(tǒng)時鐘的切換不會發(fā)生。直至目標(biāo)時鐘源就緒,才發(fā)生切換。 在時鐘控制寄存器(RCC_CR)里的狀態(tài)位指示哪個時鐘已經(jīng)準(zhǔn)備好了,哪個時鐘目前被用作系統(tǒng)時鐘。
微控制器允許輸出時鐘信號到外部MCO引腳。 相應(yīng)的GPIO端口寄存器必須被配置為相應(yīng)功能。
以下四個時鐘信號可被選作MCO時鐘:
● SYSCLK ● HSI ● HSE ● 除2的PLL時鐘
時鐘的選擇由時鐘配置寄存器(RCC_CFGR)中的MCO[2:0]位控制。
筆記五 GPIO和AFIO(復(fù)用功能I/O)
相當(dāng)于51單片機I/O口來說,stm32的I/O就要復(fù)雜得多了,不僅有多種輸入輸出方式,還需要配置不同的寄存器來達到相應(yīng)的功能。
(一) 每個 GPIO端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器)(GPIOx_IDR,GPIOx_ODR),一個32為置位/復(fù)位寄存器(GPIOx_BSRR),一個16位復(fù)位寄存器(GPIOx_BRR)及一個32為鎖定寄存器(GPIOx_LCKR)�?梢詫⑵渑渲萌缦履J�:
─ 輸入浮空、 輸入上拉
、 輸入下拉
、 模擬輸入
─ 開漏輸出
、 推挽式輸出、 推挽式復(fù)用功能、 開漏復(fù)用功能
可以按照下面的表格對其配置:
表一 端口位配置表

表二
輸出模式位

復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O口被配置為浮空輸入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。復(fù)位后JTAG相關(guān)的引腳被置位上拉或者下拉模式。
所有的端口都可以配置為外部中斷模式,不過首先必須配置為輸入模式。對于復(fù)用功能現(xiàn)在不怎么了解怎么用,可能今天頭腦不清晰的原因,不過先不管吧,等以后碰到再說。對gpio還可以進行重新映射以及鎖定(即使端口位的配置在下一次復(fù)位之前不能改變),關(guān)于對輸入輸出等等功能的配置等以及寄存器以后用的時候一點點的積累吧,現(xiàn)在記住也沒用。