复用和重映像的关系

本文深入解析STM32微控制器的复用功能与重映象概念,阐述了如何通过配置引脚模式实现不同外设功能的切换,并详细介绍了TIM3定时器在不同映象模式下的引脚分配变化,以及配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.复用功能(AF)

       复用就是一个引脚有几个功能,1.做普通IO输入输出2.其他外设的输入输出(比如I2C,TIM,SPI等等),这就是复用。

     ● 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。

    ● 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。

    ● 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式

2.重映象

重映象就是将引脚功能重新定义到其他引脚,例如PA9是USART1-TX默认的管脚,但是现在PA9用做它用了,那可以将USART1-TX重新映射到PB6,当然这种映射不是随意的想映射到哪个脚就哪个脚,芯片内部已经固定了只能映射到固定的地方

TIM3的重映像

以TIM3为例,可以看到没有重映象时TIM3的四个通道所对应的引脚为PA6,PA7,PB0和PB1;部分重映象时为PB4,PB5,PB0和PB1,只改变了部分引脚,所以叫部分重映象;设置为完全重映象时为PC6,PC7,PC8和PC9,全部的引脚都改变了,所以叫完全重映象

 

MCU复位后PA8的默认功能是普通IO管脚,我想将它设为TIM1的PWM-CH1复用输出

步骤就是:1、将TIM1初始化好,设成PWM输出,使能定时器。2、将PA8管脚设为复用推挽输出。这样就可以使用PWM了,也就是复用的用法

即要使用某个引脚的复用功能时,在开启了对应引脚的GPIO时钟功能模块时钟的前提下,需要作如下配置:
1)在配置该引脚的GPIO时,选择推挽复用输出(AF_PP)或开漏复用输出(AF_OD)
2)使能对应功能的模块
3)不要使能不用的功能的模块


        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
 
    /*Timer时基设置外设时钟频率*/
    TIM_TimeBaseStructure.TIM_Period = 240;    
    TIM_TimeBaseStructure.TIM_Prescaler = 0;    
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    TIM_OCInitStructure.TIM_Pulse = 10;    
    TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
 
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 
 
    TIM_ARRPreloadConfig(TIM1,ENABLE);
    
    TIM_Cmd(TIM1,ENABLE);
 

      从TIM3的复用功能映象表,可以看到没有重映象时TIM3的四个通道所对应的引脚为PA6、PA7、PB0、PB1;使用部分重映象时为PB4、PB5、PB0、PB1,因为只改变了部分引脚,所以叫部分重映象;使用完全重映象时为PC6、PC7、PC8、PC9,这全部的引脚都改了,所以叫完全重映象。

    我这里要把TIM3_CH1、TIM3_CH1重映象到PC6、PC7。就要用到函数
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); 
    这个函数的参数GPIO_FullRemap_TIM3,是设置TIM3完全映射,当时没注意选了GPIO_PartialRemap_TIM3 ,结果调了半天没有波形输出。一定要注意。
具体配置过程如下:
void TIM3_PWM_Init(u16 arr,u16 psc)

 GPIO_InitTypeDef GPIO_InitStructure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);      //使能定时器3的时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);   //使能外设时钟使能 
 GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);       //TIM选择全复用功能使能 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值