1. 程式人生 > >STM32片上外設時鐘使能、失能和復位的區別

STM32片上外設時鐘使能、失能和復位的區別

640?wx_fmt=jpeg

今天分享的關於時鐘知識,可能很多人沒有在意過。這也是之前有朋友問過的問題,這裡就簡單給大家普及一下吧。


1

RCC時鐘說明

在STM32參考手冊中,都有Reset and Clock Control(RCC)復位和時鐘控制的章節。


在這一章節就可以看到有兩類暫存器:peripheral reset register(RSTR)外設復位暫存器和peripheral clock enable register(ENR)外設時鐘使能暫存器。


我們拿STM32F1參考手冊為例,可以看到如下圖暫存器:

640?wx_fmt=png


一種是控制外設時鐘的暫存器,一種是復位外設

的暫存器。

2

外設時鐘使能和失能

我們都知道,配置STM32外設,會先開啟對應的時鐘(也就是使能外設時鐘)。


比如使能USART1時鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


失能USART1時鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);


我之前分享過一篇文章《關於STM32時鐘配置的那些坑》,裡面有說:為什麼我們要先開啟STM32外設時鐘。


從時鐘使能和失能來說,這裡再簡單總結一下:使能外設時鐘,我們就可以操作(讀寫)對應的外設;失能外設時鐘,則我們無法操作對應的外設


所以說,我們要操作外設,就必須要先開啟(使能)其外設時鐘。


3

復位外設

復位外設相信大部分朋友都能理解,如果使用暫存器開發過的朋友,更應該明白。


簡單來說,復位外設就是恢復外設所有暫存器為上電預設值,也可以說復位了我們的配置


可能有些地方你會也會發現xx外設配置之前有“重新初始化外設的操作,如:

USART_DeInit(USART1);

DMA_DeInit(DMA1_Channel1);


這重新初始化程式碼裡面,其實就是呼叫了復位外設程式碼。


4

失能外設時鐘和復位外設會對外設有何影響

上面說了失能外設時鐘,我們就不能操作外設了。那麼復位外設,我們還能操作外設嗎?外設的時鐘也會被複位嗎?


可能許多人沒有深入分析過,我這裡簡單總結一下:


1.外設時鐘未使能(失能狀態),不能配置(讀寫)外設


2.復位外設,會復位外設的所有暫存器,但外設時鐘不會被複位


3.外設時鐘使能,位外設,再清除復位外設,可以繼續配置(讀寫)外設。如USART1重新初始化:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);

USART_Init(USART1, &USART_InitStructure);


4.復位外設,但不清除復位外設,則不能繼續配置(讀寫)外設

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

USART_Init(USART1, &USART_InitStructure);


在STM32的庫函式中,外設復位清除都是成對的,所以,我們用庫開發的好處,就是相對不容易犯一些錯誤。


因為很多朋友使用暫存器開發,有很多細節問題沒有深入研究過,就不知道問題到底處在哪裡。


所以,建議用暫存器開發的朋友轉向使用(SPL、HAL或CLL)庫開發。如果你非要一步一步理解底層,建議使用SPL標準外設庫。

640?

1.做無線連線MCU開發的嵌友,這篇要看的!

2.魏少軍:發展高階晶片不能自娛自樂!

3.Adobe新增逆天黑科技,90%的設計都看哭了…

4.Arm DesignStart專案加速基於Linux的嵌入式設計!

5.淘汰汽車後視鏡!這項顛覆讓司機真正眼界大開!

6.學習微控制器,其實有一些技巧的!

640?wx_fmt=gif

本文來自個人微信公眾號「ID:strongerHuang」,經原作者授權釋出。原文公眾號由嵌入式工程師「strongerHuang」在精心整理並維護。專注分享的內容包含:Keil、IAR、STM8、STM32、μC/OS、FreeRTOS、CANOpen、ModBus...