關於JTAG引腳設定為普通IO口

2021-10-23 09:55:38 字數 1601 閱讀 4140

**

stm32微控制器中的jtdo與jntrst是jtag引腳復用,一般最好不用jtag-dp除錯埠,而是用sw-dp,只需要jtms/swdio與jtck/swclk。這樣可以省下有限的io資源。

但是stm32復位後,jtag與sw預設同時開啟的,即所有的jtag埠均被系統保留,軟體設定gpio是不起作用的,所以導致jntrst一直為高電平,jtdo一直為低電平,st的文件裡說明,如果要釋放多餘的jtag埠,需設定swj_cfg[2:0]為010,關閉jtag-dp,啟用sw-dp

實際測量pa3,pa4都在2.7v左右,為高電平

//開啟復用的時鐘

rcc_apb2periphclockcmd(rcc_apb2periph_afio,enable);

//完全失能(jtag+sw-dp)

gpio_pinremapconfig(gpio_remap_swj_jtagdisable, enable);

/ 改變指定管腳的對映 gpio_remap_swj_jtagdisable ,jtag-dp 禁用 + sw-dp 使能

gpio_pinremapconfig(gpio_remap_swj_jtagdisable , enable);

// 然後配置使用的 gpio 口

用普中的6806l按鍵實驗測試

void

led_init()

while(1

) i++;

led1=0;

//這裡必須給低電平,跟板子設計有關,

led2=0;

led3=0;

delay_ms(10);}

注意程式裡要把pc0,pc1,pc2置0 ,因為板子設計的原因,如果為1,則燈無法控制一直全滅

在程式中,通常禁止jtag的函式如下所示:

//改變指定管腳的對映 gpio_remap_swj_disable swj 完全失能(jtag+sw-dp)

gpio_pinremapconfig

(gpio_remap_swj_disable, enable)

;//改變指定管腳的對映 gpio_remap_swj_jtagdisable jtag-dp 失能 + sw-dp使能

gpio_pinremapconfig

(gpio_remap_swj_jtagdisable , enable)

;

當設定了以上語句後,當執行了這兩個語句後,jtag**就與目標失去去聯絡。

解決辦法有:

1、設定啟動模式為isp模式(boot0=1、boot1=0)或設定啟動模式為ram執行模式(boot0=1、boot1=1)。

將開發板斷電後重新上電,此時就因不是在使用者程式模式,因此就不會執行禁用jtag的語句,jtag功能也就可以正常使用。

2、設定啟動模式為isp模式(boot0=1、boot1=0),用isp程式將stm32的flash擦除,之後就可恢復jtag功能。

3、如果你的**器支援swd**模式,如iar下用jlink、mdk下用ulink2。

直接將**器的模式設為swd模,就可以不受這個禁止jtag功能的影響了。

STM32 中JTAG 引腳作為普通IO口設定方法

第一次畫stm32 的pcb 因為採用了swd 除錯,認為jtag的引腳pb3,pb4,沒有用到就做了普通io口,麻煩從此引起了。設定pb3,pb4均為輸出口,且輸出高電平,用萬用表測量,pb4為高,pb3不是高電平,在看mdk 中的暫存器值,pb3,pb4都是高啊?暫存器的值怎麼和實際的值不一樣了...

STM32 中JTAG 引腳作為普通IO口設定方法

看上面的資料手冊,可以知道一般的io口,其預設功能就是io口。可是pb3 pb4 pa13 pa14 pa15這幾個io口的預設功能是jtag功能,io口功能反而是他們的重對映功能。因此要把他們作為普通io口使用,要把他們的重對映功能開啟。只需要把pb3,pb4,pa15當成io使用,設定 rcc ...

STM32 中JTAG 引腳作為普通IO口設定方法

第一次畫stm32 的pcb 因為採用了swd 除錯,認為jtag的引腳pb3,pb4,沒有用到就做了普通io口,麻煩從此引起了。設定pb3,pb4均為輸出口,且輸出高電平,用萬用表測量,pb4為高,pb3不是高電平,在看mdk 中的暫存器值,pb3,pb4都是高啊?暫存器的值怎麼和實際的值不一樣了...