相比於普通單片機,STM32 擁有複雜的時鐘系統,相應的控制器稱為 RCC(Reset Clock Controller,複位與時鐘控制器)。每個外設都配備了外設時鐘的開關,當我們不使用某個外設時,可以把這個外設時鐘關閉,從而降低 STM32 的整體功耗。因此,在我們使用外設前,必須要開啟相應外設的 ...
相比於普通單片機,STM32 擁有複雜的時鐘系統,相應的控制器稱為 RCC(Reset Clock Controller,複位與時鐘控制器)。每個外設都配備了外設時鐘的開關,當我們不使用某個外設時,可以把這個外設時鐘關閉,從而降低 STM32 的整體功耗。因此,在我們使用外設前,必須要開啟相應外設的時鐘。可以使用的庫函數有:
1 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); 2 3 void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); 4 5 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
顯然,在開啟外設時鐘前,先要知道該外設掛載在哪個匯流排上。以 GPIOC 的 pin4 引腳為例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
STM32 中的大部分 GPIO 都有復用功能,所以對於有復用功能的 I/O 引腳,還要開啟其復用功能時鐘。如 GPIO 的 pin4 可以用作 ADC1 的輸入引腳,當我們把它作為 ADC1 使用時,需要開啟 ADC1 的時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
另外, STM32 的所有 GPIO 都引入到 EXTI 外部中斷線上,使得所有的 GPIO 都能作為外部中斷的輸入源。所以如果把 GPIO 用作 EXTI 外部中斷時,還需要開啟 AFIO 時鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
那麼,問題來了!
AFIO 是什麼?AFIO 時鐘什麼時候需要開啟?
我們從《STM32中文參考手冊_V10》中找到:對寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 進行讀寫操作前,應當首先打開 AFIO 的時鐘(設置 APB2 外設時鐘使能寄存器 RCC_APB2ENR)。
也就是說:當你需要配置 AFIO 這些寄存器的時候,就需要把 RCC_APB2ENR 寄存器的 AFIO 位置‘1’打開 AFIO 時鐘。
跟 AFIO 相關的寄存器有:
1、 事件控制寄存器(AFIO_EVCR)
2、 復用重映射和調試I/O 配置寄存器(AFIO_MAPR)
3、 外部中斷配置寄存器1(AFIO_EXTICR1)
4、 外部中斷配置寄存器2(AFIO_EXTICR2)
5、 外部中斷配置寄存器3(AFIO_EXTICR3)
6、 外部中斷配置寄存器4(AFIO_EXTICR4)
看看這些寄存器的定義,我們就明白,這些寄存器是用於“事件控制”、“重映射”、“調試IO配置”、“外部中斷”的。例如 AFIO_EXTICRX 用於選擇 EXTIx 外部中斷的輸入源。
總結:當我們需要配置這些 AFIO 寄存器的時候,就需要打開 RCC_APB2ENR 寄存器的 AFIO 時鐘,而不是用到引腳復用功能的時候打開。
(文章非原創)