今天分享的關于時鐘知識,可能很多人沒有在意過。這也是之前有朋友問過的問題,這里就簡單給大家普及一下吧。
1
RCC時鐘說明
在STM32參考手冊中,都有Reset and Clock Control(RCC)復位和時鐘控制的章節(jié)。
在這一章節(jié)就可以看到有兩類寄存器:peripheral reset register(RSTR)外設復位寄存器和peripheral clock enable register(ENR)外設時鐘使能寄存器。
我們拿STM32F1參考手冊為例,可以看到如下圖寄存器:
一種是控制外設時鐘的寄存器,一種是復位外設的寄存器。
2
外設時鐘使能和失能
我們都知道,配置STM32外設,會先開啟對應的時鐘(也就是使能外設時鐘)。
比如使能USART1時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
失能USART1時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,DISABLE);
我之前分享過一篇文章《關于STM32時鐘配置的那些坑》,里面有說:為什么我們要先開啟STM32外設時鐘。
從時鐘使能和失能來說,這里再簡單總結一下:使能外設時鐘,我們就可以操作(讀寫)對應的外設;失能外設時鐘,則我們無法操作對應的外設。
所以說,我們要操作外設,就必須要先開啟(使能)其外設時鐘。
3
復位外設
復位外設相信大部分朋友都能理解,如果使用寄存器開發(fā)過的朋友,更應該明白。
簡單來說,復位外設就是恢復外設所有寄存器為上電默認值,也可以說復位了我們的配置。
可能有些地方你會也會發(fā)現(xiàn)xx外設配置之前有“重新初始化”外設的操作,如:
USART_DeInit(USART1);
DMA_DeInit(DMA1_Channel1);
這重新初始化代碼里面,其實就是調(diào)用了復位外設代碼。
4
失能外設時鐘和復位外設會對外設有何影響
上面說了失能外設時鐘,我們就不能操作外設了。那么復位外設,我們還能操作外設嗎?外設的時鐘也會被復位嗎?
可能許多人沒有深入分析過,我這里簡單總結一下:
1.外設時鐘未使能(失能狀態(tài)),不能配置(讀寫)外設;
2.復位外設,會復位外設的所有寄存器,但外設時鐘不會被復位;
3.外設時鐘使能,復位外設,再清除復位外設,可以繼續(xù)配置(讀寫)外設。如USART1重新初始化:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
USART_Init(USART1, &USART_InitStructure);
4.復位外設,但不清除復位外設,則不能繼續(xù)配置(讀寫)外設。
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
USART_Init(USART1, &USART_InitStructure);
在STM32的庫函數(shù)中,外設復位和清除都是成對的,所以,我們用庫開發(fā)的好處,就是相對不容易犯一些錯誤。
因為很多朋友使用寄存器開發(fā),有很多細節(jié)問題沒有深入研究過,就不知道問題到底處在哪里。
所以,建議用寄存器開發(fā)的朋友轉(zhuǎn)向使用(SPL、HAL或CLL)庫開發(fā)。如果你非要一步一步理解底層,建議使用SPL標準外設庫。
-
寄存器
+關注
關注
31文章
5357瀏覽量
120659 -
STM32
+關注
關注
2270文章
10910瀏覽量
356580 -
時鐘
+關注
關注
11文章
1736瀏覽量
131582 -
復位
+關注
關注
0文章
172瀏覽量
24226
發(fā)布評論請先 登錄
相關推薦
評論