问答

汇集网友智慧,解决技术难题

21ic问答首页 - STM32F103C8T6 PA2无PWM输出

PWM输出 stm32f103c8t6 PA PA0 最小系统 控制

STM32F103C8T6 PA2无PWM输出

yycaisl2025-02-07
STM32F103C8T6最小系统PA0/PA1/PA2/PA3为PWM输出控制舵机,配置相同,PA2始终无输出,PA0/PA1/PA3输出正常;用试验软件对STM32F103C8T6最小系统PA2口验证能输出高/低电平。
回答 +关注 0
759人浏览 13人回答问题 分享 举报
13 个回答
  • #include "stm32f10x.h"

    // 初始化PA2为PWM输出
    void PWM_Init(void)
    {
        // 1. 使能GPIOA和TIM2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟

        // 2. 配置PA2为复用推挽输出模式
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // 只配置PA2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度为50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        // 3. 配置TIM2为内部时钟模式
        TIM_InternalClockConfig(TIM2);

        // 4. 配置定时器基本参数
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频:不分频
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
        TIM_TimeBaseInitStructure.TIM_Period = 2000 - 1; // 自动重装载值,决定PWM周期
        TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; // 预分频值,决定定时器时钟频率
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

        // 5. 配置TIM2通道2(PA2)为PWM输出
        TIM_OCInitTypeDef TIM_OCInitTypeDefStructure2;
        TIM_OCStructInit(&TIM_OCInitTypeDefStructure2);
        TIM_OCInitTypeDefStructure2.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
        TIM_OCInitTypeDefStructure2.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
        TIM_OCInitTypeDefStructure2.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
        TIM_OCInitTypeDefStructure2.TIM_Pulse = 1000; // 设置占空比为50%(1000/2000)
        TIM_OC2Init(TIM2, &TIM_OCInitTypeDefStructure2);

        // 6. 使能TIM2
        TIM_Cmd(TIM2, ENABLE);
    }

    int main(void)
    {
        // 初始化PWM
        PWM_Init();

        // 主循环
        while (1)
        {
            // 这里可以添加其他代码
        }
    }
  • 或者kimi帮写一段PA2输出PWN
  • kimi分析 是不是缺了这个GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
  • yycaisl 发表于 2025-2-8 17:29
    硬件肯定没问题

    你说软件在实验板上运行就是正常的,那说明软件配置至少也没有问题,如果硬件也没有问题,那就奇葩了。
  • static void MX_TIM2_Init(void)
    {

      /* USER CODE BEGIN TIM2_Init 0 */

      /* USER CODE END TIM2_Init 0 */

      TIM_MasterConfigTypeDef sMasterConfig = {0};
      TIM_OC_InitTypeDef sConfigOC = {0};

      /* USER CODE BEGIN TIM2_Init 1 */

      /* USER CODE END TIM2_Init 1 */
      htim2.Instance = TIM2;
      htim2.Init.Prescaler = 0;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = 65535;
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN TIM2_Init 2 */

      /* USER CODE END TIM2_Init 2 */
      HAL_TIM_MspPostInit(&htim2);

    }
    自己类比以下问题在哪里



  • 天意无罪 发表于 2025-2-8 09:09
    如果在实验板上都是正常的话,那就要检查一下你的硬件了,打一下PA2通断,焊接是否有问题,或者MCU有问题等 ...

    硬件肯定没问题
  • jobszheng 发表于 2025-2-8 09:26
    人家的软件配置可以正常输出PWM波,而自己写的不能。
    我觉得是你的代码写得的问题。

    #include "stm32f10x.h"                  // Device header

    void PWM_Init(void)
    {
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
           
            GPIO_InitTypeDef GPIO_InitStructure;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
           
            TIM_InternalClockConfig(TIM2);
           
            TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
            TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
            TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
            TIM_TimeBaseInitStructure.TIM_Period = 2000-1;
            TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;
            TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
            TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
           
            TIM_OCInitTypeDef TIM_OCInitTypeDefStructure1;
            TIM_OCStructInit(&TIM_OCInitTypeDefStructure1);
            TIM_OCInitTypeDefStructure1.TIM_OCMode = TIM_OCMode_PWM1;
            TIM_OCInitTypeDefStructure1.TIM_OCPolarity = TIM_OCPolarity_High;
            TIM_OCInitTypeDefStructure1.TIM_OutputState = TIM_OutputState_Enable;
            TIM_OCInitTypeDefStructure1.TIM_Pulse = 0;
            TIM_OC1Init(TIM2,&TIM_OCInitTypeDefStructure1);       
           
            TIM_OCInitTypeDef TIM_OCInitTypeDefStructure2;
            TIM_OCStructInit(&TIM_OCInitTypeDefStructure2);
            TIM_OCInitTypeDefStructure2.TIM_OCMode = TIM_OCMode_PWM1;
            TIM_OCInitTypeDefStructure2.TIM_OCPolarity = TIM_OCPolarity_High;
            TIM_OCInitTypeDefStructure2.TIM_OutputState = TIM_OutputState_Enable;
            TIM_OCInitTypeDefStructure2.TIM_Pulse = 0;
            TIM_OC2Init(TIM2,&TIM_OCInitTypeDefStructure2);
           

           
            TIM_OCInitTypeDef TIM_OCInitTypeDefStructure3;
            TIM_OCStructInit(&TIM_OCInitTypeDefStructure3);
            TIM_OCInitTypeDefStructure3.TIM_OCMode = TIM_OCMode_PWM1;
            TIM_OCInitTypeDefStructure3.TIM_OCPolarity = TIM_OCPolarity_High;
            TIM_OCInitTypeDefStructure3.TIM_OutputState = TIM_OutputState_Enable;
            TIM_OCInitTypeDefStructure3.TIM_Pulse = 0;
            TIM_OC3Init(TIM2,&TIM_OCInitTypeDefStructure3);       
           
            TIM_OCInitTypeDef TIM_OCInitTypeDefStructure4;
            TIM_OCStructInit(&TIM_OCInitTypeDefStructure4);
            TIM_OCInitTypeDefStructure4.TIM_OCMode = TIM_OCMode_PWM1;
            TIM_OCInitTypeDefStructure4.TIM_OCPolarity = TIM_OCPolarity_High;
            TIM_OCInitTypeDefStructure4.TIM_OutputState = TIM_OutputState_Enable;
            TIM_OCInitTypeDefStructure4.TIM_Pulse = 0;
            TIM_OC4Init(TIM2,&TIM_OCInitTypeDefStructure4);               
           
            TIM_Cmd(TIM2,ENABLE);
    }


    请指点一下
  • xionghaoyun 发表于 2025-2-8 16:05
    先看看PA2脚有没有坏 delay翻转I/O口

    试验程序能在PA2口输出高/低电平(LED亮/灭)
  • 打开keil工程的定时器的寄存器窗口看看配置对不对
12下一页

您需要登录后才可以回复 登录 | 注册