STM32學習心得筆記_第1頁
STM32學習心得筆記_第2頁
STM32學習心得筆記_第3頁
STM32學習心得筆記_第4頁
STM32學習心得筆記_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、窗體頂端窗體底端STM32學習心得筆記 時鐘篇在STM32中,有五個時鐘源,為HSI、HSE、LSI、LSE、PLL。、HSI是高速內部時鐘,RC振蕩器,頻率為8MHz。、HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率范圍為4MHz16MHz。、LSI是低速內部時鐘,RC振蕩器,頻率為40kHz。、LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。、PLL為鎖相環(huán)倍頻 輸出 ,其時鐘 輸入 源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為216倍,但是其輸出頻率最大不得超過72MHz。其中40kHz的LSI供獨立看門狗IWDG使用,另外它還可以被選擇為實時

2、時鐘RTC的時鐘源。另外,實時時鐘RTC的時鐘源還可以選擇LSE,或者是HSE的128分頻。RTC的時鐘源通過RTCSEL1:0來選擇。STM32中有一個全速 功能 的 USB 模塊 ,其串行 接口 引擎需要一個頻率為48MHz的時鐘源。該時鐘源只能從PLL輸出端獲取,可以選擇為1.5分頻或者1分頻,也就是,當需要使用USB模塊時,PLL必須使能,并且時鐘頻率配置為48MHz或72MHz。另外,STM32還可以選擇一個時鐘 信號 輸出到MCO腳(PA8)上,可以選擇為PLL輸出的2分頻、HSI、HSE、或者 系統(tǒng) 時鐘。系統(tǒng)時鐘SYSCLK,它是供STM32中絕大部分部件工作的時鐘源。系統(tǒng)時鐘

3、可選擇為PLL輸出、HSI或者HSE。系統(tǒng)時鐘最大頻率為72MHz,它通過AHB分頻器分頻后送給各模塊使用,AHB分頻器可選擇1、2、4、8、16、64、128、256、512分頻。其中AHB分頻器輸出的時鐘送給5大模塊使用:、送給AHB 總線 、內核、內存和DMA使用的HCLK時鐘。、通過8分頻后送給Cortex的系統(tǒng) 定時器 時鐘。、直接送給Cortex的空閑運行時鐘FCLK。、送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設使用(PCLK1,最大頻率36MHz),另一路送給定時器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘

4、輸出供定時器2、3、4使用。、送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設使用(PCLK2,最大頻率72MHz),另一路送給定時器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。在以上的時鐘輸出中,有很多是帶使能控制的,例如AHB總線時鐘、內核時鐘、各種APB1外設、APB2外設等等。當需要使用某模塊時,記得一定要先使能對應的時鐘。需要注意的是定時器的倍頻器,當APB的分頻為1時,它的倍頻值為1,否則

5、它的倍頻值就為2。連接在APB1(低速外設)上的 設備 有: 電源 接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門狗、Timer2、Timer3、Timer4。注意USB模塊雖然需要一個單獨的48MHz時鐘信號,但它應該不是供USB模塊工作的時鐘,而只是提供給串行接口引擎(SIE)使用的時鐘。USB模塊工作的時鐘應該是由APB1提供的。 連接在APB2(高速外設)上的設備有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PAPE)、第二功能IO口。 下圖是STM32用戶手冊中的時鐘系統(tǒng)結構圖,通過該圖可以從總體上掌握ST

6、M32的時鐘系統(tǒng)。 管腳篇我們操作STM32過程中對管腳的操作是比較頻繁的工作之一,我們一般用提供的封裝庫來進行操作,因為它直觀方便。我們常用的有:GPIO_SetBits();GPIO_Writebit();GPIO_ResetBits();GPIO_ReadInputBit();GPIO_ReadOutputBit();等等它們具體怎么操作的我們是不用管的給我們一個接口就足夠了,但是想學好STM32下一步最好使用它的原子操作,下面我們先學習一下關于管腳端口的一些寄存器。由于上述命令操作是調用的一些函數(shù)故可能在調用的過程中可能被中斷所打斷產和想不到的后果但是如果調用寄存器函可以在一個時鐘周期

7、內完成,所以在一些關鍵的場合要使用對原子的直接訪問。要用到的寄存器有置位復位寄存器GPIOx_BSRR和復位寄存器GPIOx_BRR,后者是前者的一個子功能,GPIOx_BSRR包括置和復位二功功能高16位是復位功能低16位是置位功能,高16位中對應位置1表示要復位這一管腳其它寫入0的位不改變原有的電平,而低16位置1是真的要使其位輸出置1。對于GPIOxBRR寄存器寫入對應位1時表示要復位輸出這一管腳,復位時用哪個寄存器隨你便好了,但是要使其置1時只能使用GPIOx_BSRR了。說到這里你可能要說了:GPIOx_ODR不可以嘛?是真的可以,但是這里的輸出0和1都是要反映到管腳是的,對于我們僅

8、需要操作1個管腳時還要兼顧其它不需要改變的PIN,所以我們最好不要用這個寄存器來進行直接的操作。常用的幾個寄存器:上面的二個寄存器是設置寄存器的是輸入還是輸出,輸入中包括模擬輸入、上拉/下拉輸入、還是懸空輸入。輸出包括:推挽輸出、開漏輸出、復用推挽輸出、復用開漏輸出。這個一個在程序初始化時要做的工作,利用封裝的函數(shù)還是挺好的這點要是利用寄存器操作就劃不來了。讀取端口管腳就是讀取 ch=GPIOx->IDR; 就是這么簡單。就是把一個16位的管腳值送給這個寄存器如:GPIOx->ODRch,如果中改變其中一管腳原來的不變,置1時沒有問題可以這樣做GPIOx->ODR |=1&l

9、t;<n但是使某一位清0時怎么辦呢?可以這樣來做 GPIOx->ODR &= (1<<n);當然還可以用另外的二個寄存器來達到目的。用GPIOx->BRR=0x00008000方便些。前面的0x00008000只第15腳而已。下面貼出復位/置位寄存器和復位寄存器來不說了。下面通過宏定方,使控制GPIO來的更加方便#define BITBAND(addr bitnum) (addr & 0xF0000000)+0x2000000+(addr&0xFFFFF)<<5)+(bitnum<<2) #define MEM_AD

10、DR(addr) *(volatile unsigned long *)(addr) #define BIT_ADDR(addr bitnum) MEM_ADDR(BITBAND(addr bitnum) /IO #define GPIOA_ODR_Addr (GPIOA_BASE+12) /0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) /0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) /0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) /

11、0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) /0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) /0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) /0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) /0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) /0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8

12、) /0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) /0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) /0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) /0x40011A08 54#define GPIOG_IDR_Addr (GPIOG_BASE+8) /0x40011E08/IO IO!/n 16!#define PAout(n) BIT_ADDR(GPIOA_ODR_Addrn) /#define PAin(n) BIT_ADDR(GPI

13、OA_IDR_Addrn) /#define PBout(n) BIT_ADDR(GPIOB_ODR_Addrn) /#define PBin(n) BIT_ADDR(GPIOB_IDR_Addrn) /#define PCout(n) BIT_ADDR(GPIOC_ODR_Addrn) /#define PCin(n) BIT_ADDR(GPIOC_IDR_Addrn) /#define PDout(n) BIT_ADDR(GPIOD_ODR_Addrn) /#define PDin(n) BIT_ADDR(GPIOD_IDR_Addrn) /#define PEout(n) BIT_ADD

14、R(GPIOE_ODR_Addrn) /#define PEin(n) BIT_ADDR(GPIOE_IDR_Addrn) /#define PFout(n) BIT_ADDR(GPIOF_ODR_Addrn) /#define PFin(n) BIT_ADDR(GPIOF_IDR_Addrn) /#define PGout(n) BIT_ADDR(GPIOG_ODR_Addrn) /#define PGin(n) BIT_ADDR(GPIOG_IDR_Addrn) /#define led0=PAout(8)使用時可以led0=0; 或者led01;像不像51中的控制。這樣led0就可以像5

15、1系統(tǒng)中那樣控制某一管腳的高低了,是不是很方便。這是比前面的應用的方便性上更加進了一步,只是前面要做一些提前的預備工作了。中斷和核心的系統(tǒng)控制部分typedef structvuc32 CPUID; /CM3vu32 ICSR; /vu32 VTOR; /vu32 AIRCR; /vu32 SCR; /vu32 CCR; /vu32 SHPR3; /vu32 SHCSR; / Handlervu32 CFSR; /MFSR+BFSR+UFSRvu32 HFSR; / faultvu32 DFSR; / faultvu32 MMFAR; /vu32 BFAR; / faultvu32 AFSR;

16、 / fault SCB_TypeDef;全局中斷禁止和允許在51系統(tǒng)中都有全局中斷允許/禁止位,那在Cortex-M3中這個位在哪呢?這的水很深,請看在Core_m3.h中有static _INLINE void _enable_irq() _ASM volatile ("cpsie i"); static _INLINE void _disable_irq() _ASM volatile ("cpsid i"); static _INLINE void _enable_fault_irq() _ASM volatile ("cpsie f&

17、quot;); static _INLINE void _disable_fault_irq() _ASM volatile ("cpsid f"); static _INLINE void _NOP() _ASM volatile ("nop"); static _INLINE void _WFI() _ASM volatile ("wfi"); static _INLINE void _WFE() _ASM volatile ("wfe"); static _INLINE void _SEV() _ASM volatile ("sev"); static _INLINE void _ISB() _ASM volatile ("isb"); static _INLINE void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論