STM32-(14):端口复用与重映射

上一篇:STM32-(13):GPIO的库函数使用下一篇:STM32-(15):如何用ID号保护自己的劳动成果

复用功能(AF)(Alternative Function)

使用默认复用功能前必须对端口位配置寄存器编程。

  • 对于复用的输入功能,端口可以配置成:
    ①:输入模式(浮空、上拉或下拉)(模拟输入不走复用这条线前面内部结构篇幅中提到过)
    ②:复用功能输出模式:输入驱动器被配置成浮空输入模式
  • 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
  • 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱
    动器被配置成浮空输入模式。

如果把一端口配置成复用输出功能,将使引脚和输出寄存器断开,并和片上外设的输出信号
连接。
如果软件把一个 GPIO 脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。

IO配置

在这里插入图片描述

重映射

这里拿串行口映射举例
在这里插入图片描述

优点:
①:可以对硬件电路设计进行优化(比如电路板布线不用绕来绕去,使性能稳定,美观等等)
②:可以额外增加资源(比如一个串口当几个串口使用)

GPIO_PinRemapConfig

关于重映射的库函数,不用直接操作寄存器,通过库函数操作寄存器

在这里插入图片描述

通过对USART的硬件调试来学习重映射的应用

USART的硬件调试

1、理论基础
2、硬件原理
3、编程
4、调试

在这里插入图片描述

数据有两个流向:
①:数据从PC机的3脚输出,从 R1in 输入,从 R1out输出,再到Coretex芯片内
②:数据从Coretex芯片输出,从T1in 输入,从T1out输出,再经由2脚进入PC机

这里用到两个引脚 RXD0、TXD0
在这里插入图片描述

跳转到核心板原理图查看
在这里插入图片描述
可以看出 TXD0、RXD0对应TXD4、RXD4
在这里插入图片描述
进而可以找到 TXD4、RXD4 分别对应芯片的78、79脚,78、79有好几个功能,第一个是普通IO口,即PC10、PC11,还有其他Usart、SD卡,其中我们用到的是Usart3,属于重映射。

查看 重映射IO配置寄存器(AFIO_MAPR)
在这里插入图片描述
在这里插入图片描述
我们这里对应着 PC10、PC11,属于部分映像

查看 函数GPIO_PinRemapConfig

在这里插入图片描述

代码

/*Include---------------------------*/
#include"stm32f10x_lib.h"		//包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART3_Configuration(void);

u8  tab[]="\nHello! everyone,welcome to class!";

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/ 
int main(void)
{
	#ifdef DEBUG
	debug();
	#endif
	
	u8 i;
	//u16  data;

	//------------初始化------------
	RCC_Configuration();
	GPIO_Configuration();
	USART3_Configuration();

	printf("\n Hello, very good,\t %d",0x55);	
	//------------向USART3发送数据------------
	for(i=0;i<33;i++)
	{
		USART_SendData(USART3, tab[i]);
		Delay_MS(2000); 
	}
	
}

/*******************************************************************************
* Function Name  : Delay_Ms
* Description    : delay 1 ms.
* Input          : dly (ms)
* Output         : None
* Return         : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
	u16 i,j;
	for(i=0;i<dly;i++)
		for(j=1000;j>0;j--);
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
	//----------使用外部RC晶振-----------
	RCC_DeInit();			//初始化为缺省值
	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的高速时钟 
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部高速时钟使能就绪
	
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
	FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ
	RCC_PLLCmd(ENABLE);			//Enable PLLCLK

	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
	
	//---------打开相应外设时钟--------------------
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);	//使能APB2外设的GPIOC(端口C)的时钟 + 复用功能(AFIO)的时候		 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);	// 打开USART3的时钟
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : 初始化GPIO外设(PC.10 是输出,设置为推挽输出,PC.11是输入,设置为浮空输入)
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
	GPIO_InitTypeDef	GPIO_InitStructure;		//声明一个结构体变量

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 	//选择PC.10(TXD) 和 PC.11
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //管脚频率为50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	 //输出模式为复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);				 //初始化GPIOC寄存器
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 	//选择PC.10(TXD) 和 PC.11(RXD)
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //管脚频率为50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	 //输出模式为浮空输入
	GPIO_Init(GPIOC,&GPIO_InitStructure);				 //初始化GPIOC寄存器		
	
	//将USART3的TXD和RXD重映射到PC10和pc11
	GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);		
} 

//初始化串口
void USART3_Configuration(void)
{
	USART_InitTypeDef  U3;
	U3.USART_BaudRate =9600;
	U3.USART_WordLength = USART_WordLength_8b;
	U3.USART_StopBits = USART_StopBits_1;
	U3.USART_Parity = USART_Parity_No;
	U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
	U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
	USART_Init(USART3, &U3);

	USART_Cmd(USART3,ENABLE);
}

/*******************************************************************************
* Function Name  : fputc
* Description    : 重定向这个C库(stdio)printf函数  文件流——》串口USART1
* Input          : ch,*f
* Output         : None
* Return         : None
*******************************************************************************/ 
int fputc(int ch,FILE *f)
{
	//ch送给USART1
	USART_SendData(USART3, ch);
	//等待发送完毕
	while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET) ;
	//返回ch
	return(ch);
}

当用串口工具接收时,串口设置应与软件代码中设置一致(如下图) 在这里插入图片描述

上一篇:STM32-(13):GPIO的库函数使用下一篇:STM32-(15):如何用ID号保护自己的劳动成果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值