整理: MilerShao 近日,某工程師用STM32F103C8開發產品,用到TIM3的PWM輸出功能。他發現TIM3_CH2可以實現PWM【此通道對應的GPIO腳是PB5】;而TIM3_CH1卻不能實現PWM【此通道對應的GPIO腳是PB4】。 該工程師在基于ST官方之前提供的標準外設固件庫做應用軟件設計。
從客戶的描述來看,基本可以肯定TIM3的時鐘、GPIOB的時鐘都已正確使能了。關于TIM3_CH1的PWM初始化代碼應該不會有啥問題,除非偶爾的筆誤沒發現。后來一起查看了相關PWM初始化代碼也的確沒發現問題。
PB5腳對應的TIM3_CH2可以實現PWM,而PB4對應的TIM3_CH1卻無法實現PWM。懷疑該腳是否還有其它的復用了?蛻粽f,PB4他只用來做PWM輸出,并無其它功能安排,硬件線路上也無其它連接。
打開芯片數據手冊,查看PB4的管腳說明如下: 
從這里可以看出,PB4腳的復位后的主功能是個特定功能腳,是JTAG口的一個復位腳。如果要用做TIM3_CH1的話得先做REMAP操作才可以。
經與客戶工程師溝通,他的確也做了相關REMAP操作,而且REMAP是沒問題的。因為PB5也是經過同一REMAP操作后才能成為TIM3_CH2通道的。 
既然REMAP沒問題,那應該是別的原因。詢問該工程師是否使用JTAG調試口,答曰用SWD口,只涉及PBA13/PA14,根本沒用到PB4。

查看STM32F1參考手冊可以發現PB4及PA13\PA14\PA15\PB3等5個腳在芯片復位后默認的就是專用的調試口,非通用GPIO,F在客戶工程師雖然用SWD接口,只用到PA13\PA14兩根線,但PB4及PA15、PB3三根線的屬性沒變,還是專用調試口。如果要把不用的PB4等三根線作為GPIO,還得額外做些相關寄存器配置,即操作AFIO_MAPR寄存器中的SWJ_CFG【2:0】三個位。

讓客戶工程師在程序代碼里添加有關AFIO_MAPR寄存器的配置代碼后,測試基于PB4腳的TIM3_CH1的PWM輸出功能,一切正常?磥恚瑔栴}就出在跟調試口復用的GPIO腳釋放問題上。即對于復位后呈現專用調試口的功能腳,欲部分或全部用在GPIO,得額外通過相關軟件代碼配置來修改其屬性,將相關管腳釋放為GPIO。
STM32 MCU芯片管腳復用之靈活而復雜是其一特色,增強了管腳使用與安排的靈活性。也正因為這個靈活,經常有人會因為管腳復用的安排遇到些小麻煩。像類似問題,在數據手冊里各個管腳的復用功能都一一列出了,然后逐一核對有無多重使用問題也不難找到原因。
不過,如果使用ST公司的STM32CubeMx圖形化配置工具來做管腳安排及時鐘初始化等就可以避免很多類似上面談到的繁瑣或麻煩。利用STM32CubeMx配置工具,很多初始化的東西都可以依據你的管腳和時鐘安排、外設功能的使能等而生成出相應的配置代碼,不必手動二次添加配置,讓你去專注你的用戶應用代碼設計與調試。
比方是以上面事例來談,關于TIM3的功能腳的REMAP、JTAG腳的配置以及項目中用到的各外設的時鐘使能、相關GPIO的配置等都可自動生成,不會出現配置代碼方面丟這個少那個的問題,使用起來給開發者帶來了不少方便,節省了不少時間。  
|