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