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