在STM32參考手冊(cè)中,都有Reset and Clock Control(RCC)復(fù)位和時(shí)鐘控制的章節(jié)。
在這一章節(jié)就可以看到有兩類寄存器:
peripheral reset register(RSTR)外設(shè)復(fù)位寄存器。
peripheral clock enable register(ENR)外設(shè)時(shí)鐘使能寄存器。
我們拿STM32F1參考手冊(cè)為例,可以看到如下圖寄存器:
一種是控制外設(shè)時(shí)鐘的寄存器,一種是復(fù)位外設(shè)的寄存器。
外設(shè)時(shí)鐘使能和失能
我們都知道,配置STM32外設(shè),會(huì)先開啟對(duì)應(yīng)的時(shí)鐘(也就是使能外設(shè)時(shí)鐘)。
比如使能USART1時(shí)鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
失能USART1時(shí)鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
前面分享過(guò)一篇文章《STM32為什么要先開啟外設(shè)時(shí)鐘?》,里面有說(shuō):為什么我們要先開啟STM32外設(shè)時(shí)鐘。
從時(shí)鐘使能和失能來(lái)說(shuō),這里再簡(jiǎn)單總結(jié)一下:使能外設(shè)時(shí)鐘,我們就可以操作(讀寫)對(duì)應(yīng)的外設(shè);失能外設(shè)時(shí)鐘,則我們無(wú)法操作對(duì)應(yīng)的外設(shè)。
所以說(shuō),我們要操作外設(shè),就必須要先開啟(使能)其外設(shè)時(shí)鐘。
復(fù)位外設(shè)
復(fù)位外設(shè)相信大部分朋友都能理解,如果使用寄存器開發(fā)過(guò)的朋友,更應(yīng)該明白。
簡(jiǎn)單來(lái)說(shuō),復(fù)位外設(shè)就是恢復(fù)外設(shè)所有寄存器為上電默認(rèn)值,也可以說(shuō)復(fù)位了我們的配置。
可能有些地方你會(huì)也會(huì)發(fā)現(xiàn)xx外設(shè)配置之前有“重新初始化”外設(shè)的操作,如:
USART_DeInit(USART1); DMA_DeInit(DMA1_Channel1);
這重新初始化代碼里面,其實(shí)就是調(diào)用了復(fù)位外設(shè)代碼。
失能外設(shè)時(shí)鐘和復(fù)位外設(shè)區(qū)別
上面說(shuō)了失能外設(shè)時(shí)鐘,我們就不能操作外設(shè)了。那么復(fù)位外設(shè),我們還能操作外設(shè)嗎?外設(shè)的時(shí)鐘也會(huì)被復(fù)位嗎?
可能許多人沒(méi)有深入分析過(guò),我這里簡(jiǎn)單總結(jié)一下:
1、外設(shè)時(shí)鐘未使能(失能狀態(tài)),不能配置(讀寫)外設(shè);
2、復(fù)位外設(shè),會(huì)復(fù)位外設(shè)的所有寄存器,但外設(shè)時(shí)鐘不會(huì)被復(fù)位;
3、外設(shè)時(shí)鐘使能,復(fù)位外設(shè),再清除復(fù)位外設(shè),可以繼續(xù)配置(讀寫)外設(shè)。如USART1重新初始化:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); USART_Init(USART1, USART_InitStructure);
4、復(fù)位外設(shè),但不清除復(fù)位外設(shè),則不能繼續(xù)配置(讀寫)外設(shè)。
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); USART_Init(USART1, USART_InitStructure);
在STM32的庫(kù)函數(shù)中,外設(shè)復(fù)位和清除都是成對(duì)的,所以,我們用庫(kù)開發(fā)的好處,就是相對(duì)不容易犯一些錯(cuò)誤。
因?yàn)檫€有很多朋友使用寄存器開發(fā),有很多細(xì)節(jié)問(wèn)題可能沒(méi)有深入研究過(guò),就不知道問(wèn)題到底處在哪里。
所以,建議用寄存器開發(fā)的朋友轉(zhuǎn)向使用(SPL、HAL或CLL)庫(kù)開發(fā)。如果你非要一步一步理解底層,建議使用SPL標(biāo)準(zhǔn)外設(shè)庫(kù)。
來(lái)源:嵌入式專欄(作者 | strongerHuang)
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5432瀏覽量
124156 -
STM32
+關(guān)注
關(guān)注
2292文章
11029瀏覽量
363994 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1893瀏覽量
133076 -
復(fù)位
+關(guān)注
關(guān)注
0文章
179瀏覽量
24643
發(fā)布評(píng)論請(qǐng)先 登錄
STM32為什么要先開啟外設(shè)時(shí)鐘?

STM32的復(fù)位和時(shí)鐘控制(RCC)
STM32片上外設(shè)時(shí)鐘使能、失能和復(fù)位的區(qū)別
外設(shè)時(shí)鐘使能語(yǔ)句的問(wèn)題
STM32復(fù)位來(lái)源 以及系統(tǒng)和內(nèi)核復(fù)位區(qū)別
STM32片上外設(shè)時(shí)鐘使能 失能和復(fù)位的區(qū)別
CM3(STM32) 內(nèi)核復(fù)位與系統(tǒng)復(fù)位區(qū)別及應(yīng)用

STM32時(shí)鐘基礎(chǔ)內(nèi)容和常見(jiàn)問(wèn)題

【STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)

STM32電源管理、復(fù)位、時(shí)鐘

【STM32學(xué)習(xí)筆記】技巧2 - STM32的復(fù)位類型及區(qū)別

STM32復(fù)位來(lái)源、以及系統(tǒng)和內(nèi)核復(fù)位區(qū)別

評(píng)論