**
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都是高啊?暫存器的值怎麼和實際的值不一樣了...