我們在用單片機開發產品是無可避免的會使用到JTAG或者SWD接口或者是硬件工程師的粗心大意,或者是因為硬件資源的限制,當我們遇到這些問題的時候就需要復用這些IO口
#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */
#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */
這是STM32官方庫的宏定義
#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*SWD使能、JTAG使能但是不包括JNRST引腳 */
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*SWD使能、JTAG失能 */
#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*SWD與JTAG全部失能 */
(1)復用JTAG接口,保留SWD接口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//
(2)復用JTAG接口與SWD接口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//
(3)只復用JNRST引腳
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//
其中有幾個情況比較讓人頭疼
(1)在完全復用了JTAG與SWD接口情況下要是想修改程序怎么辦呢?
答:目前有兩種方案:方案一:一般PCB肯定會引出復位引腳的可以先按keil的下載按鈕,然后迅速按下PCB的復位按鈕,一般可以下載成功
方案二:改變BOOT0接到3.3V用串口下載程序,要是串口沒有引出來或者BOOT0直接接地了建議方案一
(2)在復用JTAG接口PB4的時候貼主遇到了一些問題
就是PB4作為輸出引腳的時候有些模式不能完全輸出高電平或者低電平,要切換電平狀態有時候還得切換一下輸出模式,可能是STM32的一些設計BUG