學習STM32F1的小夥伴,經常需要控制IO口輸出高低電平,但是有時候會出現這樣一種情況,就是無論你開好了時鐘,配置好了引腳屬性,該IO口依舊不能如你所願輸出高低電平。
排除開發板損壞的情況,出現這種情況是屬於正常的,因爲該IO口很有可能被複用了,所以用不了通用模式。
以STM32F1爲例,查看手冊可知:
PA13、PA14、PA15、PB3、PB4這五個IO口從一開始就被默認了複用功能,被用在了JYAG調試功能上了,所以纔沒法使用通用功能來輸出高低電平。
如果真的要用到其中的某一些管腳,那就要先把他們從複用功能中解放出來,解決辦法就是開啓重映射覆用時鐘,根據上圖的手冊提示,將控制調試端口的寄存器AFIO->MAPR配置成四種模式中的一種,就能對應解放紅色框框中的IO口。
假如我要解放PA15,用庫函數的方法如下:
//重映射需要先使能AFIO時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);
//只關閉JTAG而保留SWD GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); |
關閉JTAG,保留SWD,該模式下,PA15、PB3、PB4就釋放出來了。
用寄存器操作的辦法如下:
RCC->APB2ENR |= 1<<0; //打開重映射時鐘
//關閉JTAG,啓動SW-DP,因爲PA15默認是複用JTAG功能,所以要關掉才能使用通用功能輸出高低電平
AFIO->MAPR &= 0X00FFFFFF;
AFIO->MAPR |= 1<<25;
根據MAPR寄存器手冊,將其[24,26]位配置成010,該模式下,PA15、PB3、PB4就釋放出來了。