在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的 I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。 第一次这么干感觉心里没底,所以针对USART1在STM32F103RBT6的板子上实现了一把,以下是相关的测试代码: - /*****************************************************************************
7 Z. Z8 n1 [ ]( y g- L
' K" J/ {* j0 P: B- ?- //函数名:void Uart1_Init(void)
. a. y8 f4 C. k- H
2 ?/ }- I9 s6 K: Z% I/ C" X- //功能:串口(USART1)重映射初始化配置函数,由TX PA9~PB6 RX PA10~~PB7, X5 Y" z! f P. _6 a3 n
! \/ z6 M( R: E* E- t7 u( a% H- *****************************************************************************/7 {8 Z$ p/ M% @1 I; |4 X1 `
( Q, p0 R$ o( @' j* c$ W$ n- void Uart1_Init(void)
- B5 m7 c& @6 {0 ^9 m- m - / o- m. z1 W& c7 W8 `
- {
% I0 V+ Q& t! F1 q3 P. L
8 h6 g& J# r" h5 X- c) r- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |. B9 Y- @! z J3 S
- RCC_APB2Periph_AFIO,ENABLE);//开启端口B和复用功能时钟
# M4 b& l' s6 D - GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能端口重映射- Y$ @7 W) h w. b) A0 [: B2 D
- GPIO_InitTypeDef GPIO_InitStructure;
4 S4 d. V; X, j. w/ s4 B - , |! `/ Q$ `* C) ~: M
- //uart 的GPIO重映射管脚初始化 PB6 usart1_TX PB7 USART_RX
7 ^9 W$ V# L1 R% y2 b - ! k" C1 l' W7 y) ?* g4 u
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;4 @; @( u. h* Z7 Q0 E J6 O& V
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出7 o5 ^6 H- G- p$ P. n. a9 }9 w/ ]
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
) i p# L( f( b( y6 I - GPIO_Init(GPIOB,&GPIO_InitStructure);% u0 `7 v: c: W F" |2 Z3 X
" y8 W& Y% z- D- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;( y( o+ f J; V6 D' E5 ~; K
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空输入; D5 R C7 Q2 @) ~
- GPIO_Init(GPIOB,&GPIO_InitStructure);
$ I0 X7 m+ h' U" m( H+ Q- f* G - ' E: @# E$ q; T3 z
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/ r. G8 d$ a- o1 ^% x; B( Q4 L - USART_InitTypeDef USART_InitStructure;
8 A* v" b. ]) b4 Q( T) X5 z - //串口参数配置:9600,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收; P8 m* V; ~5 x8 H/ C" Q% l; v* o
- ) s& ?7 ]+ f9 e( Z
- USART_InitStructure.USART_BaudRate = 9600;
& p+ ~/ A% q7 t \1 U9 f1 G* L$ G - USART_InitStructure.USART_WordLength = USART_WordLength_8b;' _. j' M* ^! {, }0 t. E
- USART_InitStructure.USART_StopBits = USART_StopBits_1;) N0 q2 m0 `) M$ |$ }
- USART_InitStructure.USART_Parity = USART_Parity_No ;. Z% o8 d& x% i; }7 q/ K! a& F
- USART_InitStructure.USART_HardwareFlowControl =
3 { p# {$ K7 j5 J0 ^$ n/ ^ - USART_HardwareFlowControl_None;% R( Y W4 i7 s
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;1 ~# J+ v" p! U& O
- USART_Init(USART1, &USART_InitStructure);6 F2 l' Z) A, q, O
- USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//串口接收中断) v6 Q1 s8 x) U9 h3 U& x- T) {. l
- USART_Cmd(USART1, ENABLE);
& b7 d5 [7 D3 x - }6 P& }2 |9 n+ J1 e. j6 d; h
复制代码 + n; h& u' [3 R& e4 ?9 b3 Y% g
简要分析重映射步骤为: 1.打开重映射时钟和USART重映射后的I/O口引脚时钟, - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RC C_APB2Periph_AFIO,ENABLE);
复制代码 ; h3 L2 s& s( F& i- a; u _
2.I/O口重映射开启. - GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
复制代码
* y2 h! T( _& v3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置. - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
, f% u1 ?0 C, q, \, u" x" M s - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;5 ^' Z+ W9 d! ^' C8 ]# ^ ^. y2 j+ k
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;3 o- `! m" i% k
- GPIO_Init(GPIOB, &GPIO_InitStructure);<br>, u- d7 y$ q6 _, j- h& X( }
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
% y! p# [* a" N$ U+ v W `/ t+ n - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
! z! \ w- l6 b/ q, c/ _! k5 I1 e - GPIO_Init(GPIOB, &GPIO_InitStructure);
复制代码 8 W! e1 B; `9 j, l' z4 R
只需要简单的以上三步就能轻松搞定。 4 n7 }) K3 F) @/ Z6 u+ _$ p
|