埠復用和重對映

2021-07-22 07:04:34 字數 4824 閱讀 7856

stm32除核心外還有很多內建外設,如串列埠,adc,與gpio復用

一些gpio可以復用為內建外設的功能引腳,如:

pa9,pa10可復用為功能串列埠1的傳送接收引腳(晶元資料手冊)

gpio埠復用時鐘使能:

rcc_apb2periphclockcmd(rcc_apb2periph_gpio, enable)
復用外設時鐘使能:

rcc_apb2periphcolckcmd(rcc_apb2periph_usart1, enable)
埠模式配置:(詳細配置參考stm32中文參考手冊)

根據文件我們需要配置:

pa9-推挽復用輸出

pa10-浮空或上拉輸入

//①io時鐘使能

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);

//②外設時鐘使能

rcc_apb2periphclockcmd(rcc_apb2periph_usart1, enable);

//③初始化io為對應的模式-配置pa9-復用推挽輸出

gpio_initstructure.gpio_pin = gpio_pin_9; // pa9

gpio_initstructure.gpio_speed = gpio_speed_50mhz; // 50mhz

gpio_initstructure.gpio_mode = gpio_mode_af_pp; // 復用推挽

gpio_init(gpioa, &gpio_initstructure);

//配置pa10-浮空輸入

gpio_initstructure.gpio_pin = gpio_pin_10; // pa10

gpio_initstructure.gpio_mode = gpio_mode_in_floating;// 浮空輸入

通過配置重對映暫存器,將一些復用功能對映到其他引腳,以方便pcb設計佈線,減少訊號的交叉干擾

檢視stm32資料手冊:

部分重對映:功能外設部分引腳重對映

完全重對映:功能外設所有引腳重對映

1,使能gpio時鐘(重對映後的io)

2,使能功能外設時鐘(串列埠1)

3,使能afio時鐘(重對映必須使能afio時鐘)

rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable)
4,開啟重對映

gpio_pinremapconfig(gpio_remap_usart1, enable);
對暫存器afio_mapr,afio_exticrx和afio_evcr進行讀寫操作前,需要先開啟afio時鐘

afio_mapr: 配置復用功能重對映

afio_exticrx:配置外部中斷線對映

afio_evcr: 配置eventout事件輸出

stm32f10x_gpio.h標頭檔案中找到void gpio_pinremapconfig函式宣告:

void gpio_pinremapconfig(uint32_t gpio_remap, functionalstate newstate);
在stm32f10x_gpio.c檔案中找到gpio_pinremapconfig函式原始碼:

void gpio_pinremapconfig(uint32_t gpio_remap, functionalstate newstate)

else

tmpmask = (gpio_remap & dbgafr_position_mask) >> 0x10;

tmp = gpio_remap & lsb_mask;

if ((gpio_remap & (dbgafr_location_mask | dbgafr_numbits_mask)) == (dbgafr_location_mask | dbgafr_numbits_mask))

else

if ((gpio_remap & dbgafr_numbits_mask) == dbgafr_numbits_mask)

else

if (newstate != disable)

if((gpio_remap & 0x80000000) == 0x80000000)

else

}

輸入引數gpio_remap有效性:

#define is_gpio_remap(remap) (((remap) == gpio_remap_spi1) || ((remap) == gpio_remap_i2c1) || \

((remap) == gpio_remap_usart1) || ((remap) == gpio_remap_usart2) || \

((remap) == gpio_partialremap_usart3) || ((remap) == gpio_fullremap_usart3) || \

((remap) == gpio_partialremap_tim1) || ((remap) == gpio_fullremap_tim1) || \

((remap) == gpio_partialremap1_tim2) || ((remap) == gpio_partialremap2_tim2) || \

((remap) == gpio_fullremap_tim2) || ((remap) == gpio_partialremap_tim3) || \

((remap) == gpio_fullremap_tim3) || ((remap) == gpio_remap_tim4) || \

((remap) == gpio_remap1_can1) || ((remap) == gpio_remap2_can1) || \

((remap) == gpio_remap_pd01) || ((remap) == gpio_remap_tim5ch4_lsi) || \

((remap) == gpio_remap_adc1_etrginj) ||((remap) == gpio_remap_adc1_etrgreg) || \

((remap) == gpio_remap_adc2_etrginj) ||((remap) == gpio_remap_adc2_etrgreg) || \

((remap) == gpio_remap_eth) ||((remap) == gpio_remap_can2) || \

((remap) == gpio_remap_swj_nojtrst) || ((remap) == gpio_remap_swj_jtagdisable) || \

((remap) == gpio_remap_swj_disable)|| ((remap) == gpio_remap_spi3) || \

((remap) == gpio_remap_tim2itr1_ptp_sof) || ((remap) == gpio_remap_ptp_pps) || \

((remap) == gpio_remap_tim15) || ((remap) == gpio_remap_tim16) || \

((remap) == gpio_remap_tim17) || ((remap) == gpio_remap_cec) || \

((remap) == gpio_remap_tim1_dma) || ((remap) == gpio_remap_tim9) || \

((remap) == gpio_remap_tim10) || ((remap) == gpio_remap_tim11) || \

((remap) == gpio_remap_tim13) || ((remap) == gpio_remap_tim14) || \

((remap) == gpio_remap_fsmc_nadv) || ((remap) == gpio_remap_tim67_dac_dma) || \

((remap) == gpio_remap_tim12) || ((remap) == gpio_remap_misc))

我們使用gpio_remap_usart1-串列埠1的重對映:

#define gpio_remap_usart1 ((uint32_t)0x00000004)

之前提到的串列埠3包含部分重對映和全部重對映

#define gpio_partialremap_usart3 ((uint32_t)0x00140010)

#define gpio_fullremap_usart3 ((uint32_t)0x00140030)

埠復用和重對映

stm32 有很多的內建外設,這些外設的外部引腳都是與 gpio 復用的。也就是說,乙個 gpio 如果可以復用為內建外設的功能引腳,那麼當這個 gpio 作為內建外設使用的時候,就叫做復用。埠復用配置過程 以pa9,pa10 配置為串列埠1為例 gpio 埠時鐘使能。rcc apb2periphc...

STM32埠復用和重對映

stm32的引腳可設定為可設定為 普通io功能 復用功能 重對映功能。不過普通io功能 復用功能用得比較多。復用 在tsm32裡面,大部分的引腳都是有gpio復用功能,也就是說,乙個 gpio如果可以復用為內建外設的功能引腳,那麼當這個 gpio 作為內建外設使用的時候,就叫做復用。例如圖下方框 串...

STM32埠復用 埠重對映

埠復用功能 stm32有很多的內部外設,這些外設的外部引腳都是與gpio復用的。也就是說,乙個gpio如果可以復用為內部外設的功能引腳,那麼當這個gpio作為內部外設使用的時候,就叫做復用。譬如,mcu都有串列埠,stm32有好幾個串列埠。比如說stm32f103zet6有5個串列埠,我們可以查手冊...