STM8S003F3端口可以設置重映射,如pin16的PC6管腳,默認復用功能是SPI_MOSI功能,可以重映射為TIM1_CH1,也就是timer1的1通道。映射方式並不像STM32那樣有個AFR寄存器來配置,而是配置Option bytes字節,如下圖
也就是OPT2寄存器,注意是STM8S003F3系列的,其它的芯片配置字節是不一樣的。
比如要配置PC6引腳為定時器1PWM輸出比較通道TIM_CH1, 配置方法如下:
OPT2是個8位的寄存器,配置的方式比較特別,類似FLASH操作,有兩種方法配置,一種是通過STVP進行配置,也就是通過ST的燒錄軟件界面那里配置(或者IAR軟件里選項字節配置);
另一種是通過軟件配置方式,說明下軟件配置,共4步:
#define FLASH_EOP 0X04 //標志位 #define FLASH_DUL 0X08 //標志位 void FLASH_Init(void) //端口重映射初始化函數,在此將PC5映射為TIM2_CH1 { unsigned char *flash_OPT2; unsigned char *flash_NOPT2; flash_OPT2=(unsigned char*)0x4803; //OPT2寄存器的ADDR flash_NOPT2=(unsigned char*)0x4804; //NOPT2寄存器的ADDR,此寄存器的值是OPT2的取反值 //------------------------------------------------------------- //第一步 初始化FLASH while( (FLASH_IAPSR & FLASH_DUL) == 0X00 ) { FLASH_DUKR = 0XAE; FLASH_DUKR = 0X56; } //一旦配置失敗,此處將陷入死循環。實際使用請加入超時機制,在此省略 //------------------------------------------------------------- //第二步 對OPT進行編程,首先需要如下操作:開啟opt編程 FLASH_CR2 |= 0X80; //OPT = 1 FLASH_NCR2 &= 0X7F; //NOPT = 0 //------------------------------------------------------------- //第三步 修改內存 1.修改參數,啟用復用功能 2.OPT2 和 NOPT2要相反 //修改OPT2 *flash_OPT2 = 0X01; // 0000 0001 AFR0=1,PC5復用為TIM2_CH1其它默認清0 while( (FLASH_IAPSR & FLASH_EOP) == 0 ); //等待操作完成 //修改NOPT2 *flash_NOPT2 = ~*flash_OPT2; while( (FLASH_IAPSR & FLASH_EOP) == 0 ); //等待操作完成 //一旦配置失敗,此處將陷入死循環。實際使用請加入超時機制,在此省略 //------------------------------------------------------------- //第四步 對OPT進行編程,最后需要如下操作:禁用opt編程 FLASH_CR2 &= ~0X80; //OPT = 1 FLASH_NCR2 |= 0X80; //NOPT = 0 }
以上是配置函數,經過驗證過可用,但使用過程中建議不要每次都進行配置,因為是對選項字節的操作,如果單片機上電不穩定會造成配置操作出現中斷而導致單片機鎖住問題。解決方法是第一次運行時,配置完畢后將配置狀態寫入FLASH某個地址,下次每次啟動時讀取該FLASH地址狀態值,如果是已經配置過,則不需要再次配置。被鎖住后通過燒錄工具STVP進行復位刷默認配置即可。