在使用片內外設時候,有時候會疑惑,什么時候需要編寫打開復用功能AFIO時鍾這一條語句?
即
//打開復用功能時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
AFIO
復用引腳的出現,是因為一方面我們希望單片機面積小,但是引腳數量是有限的,另一方面一個產品中並不會使用單片機的全部功能,所以把片上外設的引腳和GPIO引腳進行了共用,也就是復用(重復使用)。
看下I/O段端口結構
當使用片上外設時,該引腳就是開啟了復用功能AF,此時稱其為復用引腳AFIO,否則就是普通的GPIO。
在參考手冊中就對AF進行了詳盡的描述:
當片上外設輸出時,輸入並沒有與IO端口斷開,我們仍然可以讀取IO端口電平。AF是沒有復用輸入模式的,只有輸入模式。
理論上當需要使用片上外設時候,都需要開啟AFIO時鍾,但是為什么一些就不需要,直接開啟相應外設時鍾就可以了?
何時需要編寫打開AFIO時鍾
如果直接掛載在APB1/2總線下的外設,直接打開外設時鍾就可以了。
需要打開AFIO時鍾語句的情況:
-
APB1的外設引腳需要重映射到APB2,因為AFIO時鍾是在APB2總線下。
-
使用到外部中斷,因為外部中斷使用到了AFIO相應寄存器,所以也需要打開AFIO時鍾這條語句。
在參考手冊AFIO寄存器那里其實就寫明了,詳細的可以看一下。
舉例,將APB1總線下TIM3的CH1、CH2和CH3根據重映射表,進行完全重映射到APB2總線下的PC端口。
//打開要映射到的GPIOC和復用功能時鍾
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE );
//打開定時器3時鍾
RCC_APB1PeriphClockCmd(HALL_TIM_CLK,ENABLE);
//使能引腳完全重映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);