|
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的 I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。 第一次这么干感觉心里没底,所以针对USART1在STM32F103RBT6的板子上实现了一把,以下是相关的测试代码: - /*****************************************************************************
+ }( w% g0 q& o( G. C7 A9 k- m( X - 2 m8 m5 s5 y7 O3 s. R B
- //函数名:void Uart1_Init(void)4 b4 f0 G# x: l0 ]( m6 l* i+ M/ ]2 B
0 Y6 R0 k& j5 Q5 U, ` W: k0 n7 s. k- //功能:串口(USART1)重映射初始化配置函数,由TX PA9~PB6 RX PA10~~PB7
, d7 v2 D! H, W$ E+ D4 w - ! X7 D+ Z0 P8 L! _3 i
- *****************************************************************************/2 B3 F3 P! W b8 Z, p8 n$ p1 ]
9 V6 q. j' s0 ?- void Uart1_Init(void)
5 g2 J4 g" x+ y0 J9 q" u - 9 g, v: z2 o2 ^, z& h
- {0 D. v3 E8 S: I) g& |
- 5 {# S3 I/ q- |7 b- f
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |5 \8 y3 [* k+ l& u
- RCC_APB2Periph_AFIO,ENABLE);//开启端口B和复用功能时钟, o/ C" s: d6 L% m5 E4 L2 R
- GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能端口重映射, E* ]( @. x9 p
- GPIO_InitTypeDef GPIO_InitStructure;
6 L$ f* m1 C( k" e: f+ p/ Q - - G9 l9 D: ?; P- T6 F5 [
- //uart 的GPIO重映射管脚初始化 PB6 usart1_TX PB7 USART_RX
. s1 K& n& g2 p, y1 Q o: ] - + S$ Y* w! h/ F+ H
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;! A2 A2 C4 V' A7 [
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出/ Y( Y5 e4 C* C2 z0 G8 _* @- M
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;# }% _' M s5 E3 s9 \: t- y
- GPIO_Init(GPIOB,&GPIO_InitStructure);$ B3 _; E+ D& w5 ^+ A
$ O: G1 F K, [/ S8 y# h" t A- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;4 F" }4 R8 Y$ e% y" K& J
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空输入
* ^, C6 m' b% O' m - GPIO_Init(GPIOB,&GPIO_InitStructure);
* D7 ?' ^' }+ r# F* ~. Z
5 H' J0 H9 q5 q9 l* S) B6 M- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
. F3 X; d6 X: @+ Y+ B- o9 x' j8 k6 q3 i - USART_InitTypeDef USART_InitStructure;3 P: L1 q# C% P! }2 x
- //串口参数配置:9600,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收
- }: |9 y9 j3 p - ( g8 f- d1 }2 n b \/ C" g' h" u+ Z
- USART_InitStructure.USART_BaudRate = 9600;
a+ s4 a0 m% o5 R" y! G" j) J - USART_InitStructure.USART_WordLength = USART_WordLength_8b;& |' M7 Y+ c/ f" ~. X
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
" c! A% j0 k& g( H4 ? - USART_InitStructure.USART_Parity = USART_Parity_No ;/ K w% C+ ]' a+ ?1 R- c
- USART_InitStructure.USART_HardwareFlowControl =
$ O" ]; ~+ ]6 y0 A! W2 Y - USART_HardwareFlowControl_None;9 `9 I9 I: d; N% Q5 _5 u: W
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
' a7 v6 i" t* t- R r - USART_Init(USART1, &USART_InitStructure);
9 T, P% ?8 |0 d: C( |9 a - USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//串口接收中断; X" U$ i& P/ P8 D+ S# K! D; x* b
- USART_Cmd(USART1, ENABLE);
: e h8 ]( q# N6 k8 M0 @( b - }
; |0 A6 ? ~$ |+ |/ T( E1 O
复制代码
( O6 `5 v8 b) M: E2 v" `6 e' Y$ Y简要分析重映射步骤为: 1.打开重映射时钟和USART重映射后的I/O口引脚时钟, - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RC C_APB2Periph_AFIO,ENABLE);
复制代码 , p- L ^3 ?3 `& |' F
2.I/O口重映射开启. - GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
复制代码 4 l! I0 r! ~" Y3 Y$ J$ ~4 n. X8 R
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置. - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
* o; f" I$ d$ i3 F$ o6 u - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;. w1 Z+ k; {& {- R
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& H/ ]! }) i% k( d- e5 P - GPIO_Init(GPIOB, &GPIO_InitStructure);<br>
2 F4 f) y* H C1 i - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
# R# L: [% |5 t - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/ x( B4 x2 E, z2 J
- GPIO_Init(GPIOB, &GPIO_InitStructure);
复制代码 0 Q: |8 q. h6 ~; ^- l
只需要简单的以上三步就能轻松搞定。
: W0 z! t& [/ a3 j3 y3 j( f |