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();
    }
}

//一直在路上,加油

``` int stm32_G0_pwm_init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; // 使能时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); // 配置GPIO复用功能 // PA6(TIM3_CH1), PA7(TIM3_CH2) GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // PB0(TIM3_CH3), PB1(TIM3_CH4) GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 基础定时器配置 htim3.Instance = TIM3; htim3.Init.Prescaler = 64 - 1; // 64MHz/64 = 1MHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 1000 - 1; // 1kHz PWM频率 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim3); // 时钟源配置 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig); // 主输出配置 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); // PWM通道配置 sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比0% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4); // 启动PWM输出 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); return 0; }```分析代码,给出详细的解释
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值