小記-STM8S003F3端口復用和端口開漏
1.軟件方面:
STM8S003F3端口可以設置重映射,如pin12的PC5管腳,默認是SPI_SCK功能,可以重映射為TIM2_CH1,也就是timer2的1通道。映射方式并不像STM32那樣有個AFR寄存器來配置,而是配置Option bytes字節(jié),如下圖(芯片手冊的45頁):
也就是OPT2寄存器,注意是STM8S003F3系列的,其它的芯片配置字節(jié)是不一樣的。
比如要使用PC5的TIM2_CH2來做PWM輸出或PWM信號捕獲,按上圖中的AFR0那一欄所示,
AFR0 Alternate function remapping option 0
0:AFR0 remapping option inactive: Default alternate functions
1:Port C5 alternate function = TIM2_CH1;port C6 alternate function =
TIM1_CH1; port C7 alternate function = TIM1_CH2.
將AFR0設置為1時PC5將復用為TIM_CH1。
配置方法:
OPT2是個8位的寄存器,配置的方式比較特別,類似FLASH操作,有兩種方法配置,一種是通過STVP進行配置,也就是通過ST的燒錄軟件界面那里配置;另一種是通過軟件配置方式,說明下軟件配置,共4步:
#defineFLASH_EOP0X04//標志位#defineFLASH_DUL0X08//標志位voidFLASH_Init(void)//端口重映射初始化函數(shù),在此將PC5映射為TIM2_CH1{unsignedchar*flash_OPT2;unsignedchar*flash_NOPT2;flash_OPT2=(unsignedchar*)0x4803;//OPT2寄存器的ADDRflash_NOPT2=(unsignedchar*)0x4804;//NOPT2寄存器的ADDR,此寄存器的值是OPT2的取反值//-------------------------------------------------------------//第一步初始化FLASHwhile((FLASH_IAPSR&FLASH_DUL)==0X00){FLASH_DUKR=0XAE;FLASH_DUKR=0X56;}//一旦配置失敗,此處將陷入死循環(huán)。實際使用請加入超時機制,在此省略//-------------------------------------------------------------//第二步對OPT進行編程,首先需要如下操作:開啟opt編程FLASH_CR2"=0X80;//OPT=1FLASH_NCR2&=0X7F;//NOPT=0//-------------------------------------------------------------//第三步修改內(nèi)存1.修改參數(shù),啟用復用功能2.OPT2和NOPT2要相反//修改OPT2*flash_OPT2=0X01;//00000001AFR0=1,PC5復用為TIM2_CH1其它默認清0while((FLASH_IAPSR&FLASH_EOP)==0);//等待操作完成//修改NOPT2*flash_NOPT2=~*flash_OPT2;while((FLASH_IAPSR&FLASH_EOP)==0);//等待操作完成//一旦配置失敗,此處將陷入死循環(huán)。實際使用請加入超時機制,在此省略//-------------------------------------------------------------//第四步對OPT進行編程,最后需要如下操作:禁用opt編程FLASH_CR2&=~0X80;//OPT=1FLASH_NCR2|=0X80;//NOPT=0}
以上是配置函數(shù),經(jīng)過驗證過可用,但使用過程中建議不要每次都進行配置,因為是對配置字節(jié)的操作,如果單片機上電不穩(wěn)定會造成配置操作出現(xiàn)中斷而導致單片機鎖住問題。解決方法是第一次運行時,配置完畢后將配置狀態(tài)寫入FLASH某個地址,下次每次啟動時讀取該FLASH地址狀態(tài)值,如果是已經(jīng)配置過,則不需要再次配置。被鎖住后通過燒錄工具STVP進行復位刷默認配置即可。
以上是純軟件方式操作配置字節(jié)寄存器,另一種是通過STVP配置,如下圖:
通過修改紅色框中的參數(shù)進行刷寫修改。
2.硬件方面可能很容易疏忽的問題就是STM8S003F3的PB4和PB5端口,這兩個端口分別是I2C通信的SCL和SDA端口,手冊明確說明為:true open-drain I/O,也就是真正的開漏輸出(手冊里端口說明中帶‘T’),P-BUFFER和那個保護二極管是沒有使用的。這種情況下,如果沒接上拉電阻的話,是不能輸出高電平的。