PA3管脚复用映射TIM5_Ch4配置PWM输出

本文深入探讨STM32中PA3管脚的复用问题,分析了将PA3同时配置为TIM5_CH4和普通IO引脚时出现的功能冲突。详细解释了管脚复用的概念,并通过具体代码示例,展示了如何避免此类错误,确保硬件资源的正确配置。

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

错误原因:将PA3复用为TIM5_Ch4,然后又将PA3初始化普通IO管脚,导致PA3管脚复用失败。

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

注:管脚功能只能使用一种。

上代码:

#####################################################################

//LED.c

void LedColor_Init(u32 arr,u32 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    //  错误原因,RCC_APB1,用RCC_APB2PeriphClockCmd,导致错误
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);      
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM5);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //GPIOA0
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //ËÙ¶È100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //ÉÏÀ­
    GPIO_Init(GPIOA,&GPIO_InitStructure); 
    TIM_DeInit(TIM5);
    TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶¯ÖØ×°ÔØÖµ
    TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷5
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1????????,PWM2??????
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //????
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //High???????,??????20%;Low?????,????80%
    TIM_OC4Init(TIM5, &TIM_OCInitStructure);
    TIM_OCStructInit(&TIM_OCInitStructure);      //在程序中这行代码放在了初始化前面。导致初始化异常。
    TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
    
    TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPEʹÄÜ 
    TIM_Cmd(TIM5, ENABLE);  //ʹÄÜTIM5
}

void LED_Init(void)
{
    GPIO_InitTypeDef   GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //KEY0 KEY1 KEY2¶ÔÓ¦Òý½Å
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOE2,3,4
}

void LedColor(void)
{
    static  u16 LED_CNT=0;
    if(1)
    {
        if(Flag)
        {
            LED_CNT++;
            if(LED_CNT>=1800)
            {
                Flag = false;
            }
        }
        else
        {
            LED_CNT--;
            if(LED_CNT<=0)
            {
                Flag = true;
            }
        }
        TIM_SetCompare4(TIM5,LED_CNT);
        delay_ms(1);
//        printf("LED_CNT=%d\r\n",LED_CNT);
    }
    else
    {
        TIM_SetCompare4(TIM5,0);
    }
}

#####################################################################

//mian.c

int main(void)
{    
    delay_init(168);            
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    LedColor_Init(1799,800-1);
   // -->LED_Init();  //因为将PA3重新初始化为普通IO将PA3重映射覆盖,所以导致定时器功能无法使用。

    while(1)
    {
        LedColor();
    }
}

//一直在路上,加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值