最近在做的一個項目中要使用SWD方式下載程序,使用的CPU是STM32F103CBT6,下載器是ULink2,固件版本為V1.40,編譯軟件是Keil uVision 4.10。
硬件工程師在設(shè)計PCB板時將PB3、PB4及PA15幾個引腳用上了,而這幾個IO口是用于JTAG的,而且這幾個IO口在上電復位后默認就是使用的JTAG功能,所以我就使用重映射功能將這幾個IO口改為普通的IO口來用。
我先是寫了如下代碼:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//時鐘使能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//禁用SWJ
IO口是正常使用了,但是當我重新用ULink下載程序時,卻提示SWD Communication Failure,我用ULink試了其他的板子,都是好的,證明ULink是沒有問題的,真是莫名其妙的問題,后來我就仔細查看GPIO_PinRemapConfig函數(shù)中幾個參數(shù)的含義,下面是庫函數(shù)中的定義和說明:
#defineGPIO_Remap_SWJ_NoJTRST((uint32_t)0x00300100)/*! #defineGPIO_Remap_SWJ_JTAGDisable((uint32_t)0x00300200)/*! #defineGPIO_Remap_SWJ_Disable((uint32_t)0x00300400)/*! 主要看后面兩個宏定義,GPIO_Remap_SWJ_JTAGDisable是禁止了JTAG功能,而SWD功能還是有的。 而GPIO_Remap_SWJ_Disable則是完全禁止SWJ功能,JTAG和SWD都禁止了。 后來又查看工程的Debug設(shè)置,明顯勾選了SWJ功能,而我選擇了GPIO_Remap_SWJ_Disable,則證明完全禁止了SWJ功能,會不會是因為這樣導致識別不了硬件,從而用不了SWD功能了呢?因為我設(shè)置的是一上電就開始運行軟件(從Flash啟動),很明顯,軟件運行后,就設(shè)定了SWJ不能使用。 于是,我想,能不能讓MCU上電時不運行軟件呢?就是不讓它從Flash啟動,于是我就試著將控制啟動方式的撥碼開關(guān)上的B0和B1都設(shè)置為1,重新上電,然后再在Keil的Debug選項中看是否檢測到SWD,一看,正常了,太開心了,于是改軟件,將參數(shù)改為GPIO_Remap_SWJ_JTAGDisable,只禁止JTAG功能,重新下載軟件后,將撥碼開關(guān)的B0改為0,軟件正常啟動后,斷電后再上電,然后再確認能否識別到SWD,這下完全正常了!