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