先說為什么會(huì)不夠用
一般在項(xiàng)目開發(fā)階段需求都是慢慢的添加的,預(yù)計(jì)需要18個(gè)IO結(jié)果20個(gè)還不夠,甚至有的時(shí)候已經(jīng)全部用完了現(xiàn)有的資源,還需要多出一個(gè)或者兩個(gè)IO來做一個(gè)系統(tǒng)運(yùn)行指示燈這樣的功能,就沒必要換一款更高性能的單片機(jī)來做了,這時(shí)候就會(huì)想能不能再“壓榨”一下單片機(jī)把多余的資源釋放出來。其實(shí)STM32F103單片機(jī)JTAG端口重映射可以完成這樣的事情。
STM32F103單片機(jī)JTAG端口重映射
JTAG接口
簡(jiǎn)單理解這是一個(gè)下載程序用的接口使用的工具是Jlink
SWD接口
簡(jiǎn)單理解就是一個(gè)下載程序的接口使用的工具是STlink
IO口
簡(jiǎn)單理解就是一個(gè)可以進(jìn)行輸入輸出的普通接口
STM32的IO口
STM32有很多IO口,IO口占據(jù)了絕大多數(shù)的管腳,但是有的管腳天生就不平凡被安排了更牛逼的工作那就是下載程序用,如果想要它由牛逼變成普通就要對(duì)本事下載接口的管腳進(jìn)行功能重新映射。
映射的關(guān)系由寄存器進(jìn)行控制也可以庫(kù)函數(shù)來實(shí)現(xiàn),但是映射的方式不多,也就三種
§全功能 SWJ,JTAG沒有JTRST。
§禁用JTAG,啟用SWJ。(PB3/PB4/PA15 可重映射為其他功能)
§完全禁用 SWJ和 JTAG。(PB3/PB4/PA13/PA14/PA15 均可重映射為其他功能)
§為什么要這樣搞?
因?yàn)檫@樣設(shè)計(jì)可以允許更多的GPIO被解放出來。
比如
第一種可以解放PB4
第二種可以解放PB3 PB4 PA15
第三種可以解放PB3 PB4 PA13 PA14 PA15
為什么可以這樣搞?
如何解放對(duì)應(yīng)的IO呢?
STM32F103單片機(jī)IO不夠用應(yīng)該這么來
先說為什么會(huì)不夠用
一般在項(xiàng)目開發(fā)階段需求都是慢慢的添加的,預(yù)計(jì)需要18個(gè)IO結(jié)果20個(gè)還不夠,甚至有的時(shí)候已經(jīng)全部用完了現(xiàn)有的資源,還需要多出一個(gè)或者兩個(gè)IO來做一個(gè)系統(tǒng)運(yùn)行指示燈這樣的功能,就沒必要換一款更高性能的單片機(jī)來做了,這時(shí)候就會(huì)想能不能再“壓榨”一下單片機(jī)把多余的資源釋放出來。其實(shí)STM32F103單片機(jī)JTAG端口重映射可以完成這樣的事情。
STM32F103單片機(jī)JTAG端口重映射
JTAG接口
簡(jiǎn)單理解這是一個(gè)下載程序用的接口使用的工具是Jlink
SWD接口
簡(jiǎn)單理解就是一個(gè)下載程序的接口使用的工具是STlink
IO口
簡(jiǎn)單理解就是一個(gè)可以進(jìn)行輸入輸出的普通接口
STM32的IO口
STM32有很多IO口,IO口占據(jù)了絕大多數(shù)的管腳,但是有的管腳天生就不平凡被安排了更牛逼的工作那就是下載程序用,如果想要它由牛逼變成普通就要對(duì)本事下載接口的管腳進(jìn)行功能重新映射。
映射的關(guān)系由寄存器進(jìn)行控制也可以庫(kù)函數(shù)來實(shí)現(xiàn),但是映射的方式不多,也就三種
§
全功能 SWJ,JTAG沒有JTRST。
§
§
禁用JTAG,啟用SWJ。(PB3/PB4/PA15 可重映射為其他功能)
§
§
完全禁用 SWJ和 JTAG。(PB3/PB4/PA13/PA14/PA15 均可重映射為其他功能)
§
§
為什么要這樣搞?
因?yàn)檫@樣設(shè)計(jì)可以允許更多的GPIO被解放出來。
比如
第一種可以解放PB4
第二種可以解放PB3 PB4 PA15
第三種可以解放PB3 PB4 PA13 PA14 PA15
為什么可以這樣搞?
如何解放對(duì)應(yīng)的IO呢?
進(jìn)行端口復(fù)用
·
·
·
·
·
·
·
·
·
·
·
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、關(guān)閉JTAG-DP,關(guān)閉SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、關(guān)閉JTAG-DP,開啟SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用
庫(kù)函數(shù)寫法
·
·
·
·
·
·
·
·
·
·
·
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、關(guān)閉JTAG-DP,關(guān)閉SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、關(guān)閉JTAG-DP,開啟SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用
庫(kù)函數(shù)寫法
·
·
·
·
·
·
·
·
·
·
·
·
·
·
//開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //Full SWJ Disabled (JTAG-DP + SW-DP)GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
//開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//JTAG-DP Disabled and *SW-DP Enabled*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRSTGPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
·
·
·
·
·
·
·
·
·
·
·
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、關(guān)閉JTAG-DP,關(guān)閉SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、關(guān)閉JTAG-DP,開啟SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用
庫(kù)函數(shù)寫法
·
·
·
·
·
·
·
·
·
·
·
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、關(guān)閉JTAG-DP,關(guān)閉SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、關(guān)閉JTAG-DP,開啟SW-DP
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用
庫(kù)函數(shù)寫法
·
·
·
·
·
·
·
·
·
·
·
·
·
·
//開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //Full SWJ Disabled (JTAG-DP + SW-DP)GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
//開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//JTAG-DP Disabled and *SW-DP Enabled*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //開啟AFIO時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRSTGPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);