打印

STM32F103C8T6 PA2无PWM输出

[复制链接]
5452|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yycaisl|  楼主 | 2025-2-7 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
yycaisl|  楼主 | 2025-2-7 20:39 | 只看该作者

STM32F103C8T6 PA2无PWM输出

STM32F103C8T6最小系统PA0/PA1/PA2/PA3为PWM输出控制舵机,配置相同,PA2始终无输出,PA0/PA1/PA3输出正常;用试验软件对STM32F103C8T6最小系统PA2口验证能输出高/低电平。另外最小系统还配置了PA9/PA10和PB10/PB11分别作2个串口。多方检查无果,望能者指点,谢谢啦!

使用特权

评论回复
板凳
天意无罪| | 2025-2-8 09:09 | 只看该作者
如果在实验板上都是正常的话,那就要检查一下你的硬件了,打一下PA2通断,焊接是否有问题,或者MCU有问题等。

使用特权

评论回复
地板
jobszheng| | 2025-2-8 09:26 | 只看该作者
人家的软件配置可以正常输出PWM波,而自己写的不能。
我觉得是你的代码写得的问题。

重点查看是否PA2引脚重映射未开启,GPIO的初始化是否正确

使用特权

评论回复
5
xionghaoyun| | 2025-2-8 16:05 | 只看该作者
先看看PA2脚有没有坏 delay翻转I/O口

使用特权

评论回复
6
xionghaoyun| | 2025-2-8 16:09 | 只看该作者
打开keil工程的定时器的寄存器窗口看看配置对不对

使用特权

评论回复
7
yycaisl|  楼主 | 2025-2-8 17:25 | 只看该作者
xionghaoyun 发表于 2025-2-8 16:05
先看看PA2脚有没有坏 delay翻转I/O口

试验程序能在PA2口输出高/低电平(LED亮/灭)

使用特权

评论回复
8
yycaisl|  楼主 | 2025-2-8 17:28 | 只看该作者
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);
}


请指点一下

使用特权

评论回复
9
yycaisl|  楼主 | 2025-2-8 17:29 | 只看该作者
天意无罪 发表于 2025-2-8 09:09
如果在实验板上都是正常的话,那就要检查一下你的硬件了,打一下PA2通断,焊接是否有问题,或者MCU有问题等 ...

硬件肯定没问题

使用特权

评论回复
10
GlenX| | 2025-2-9 11:41 | 只看该作者

STM32F103C8T6 PA2无PWM输出

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

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



使用特权

评论回复
11
天意无罪| | 2025-2-9 20:51 | 只看该作者
yycaisl 发表于 2025-2-8 17:29
硬件肯定没问题

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

使用特权

评论回复
12
xionghaoyun| | 2025-2-10 08:20 | 只看该作者
kimi分析 是不是缺了这个GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

使用特权

评论回复
13
xionghaoyun| | 2025-2-10 08:21 | 只看该作者
或者kimi帮写一段PA2输出PWN

使用特权

评论回复
14
xionghaoyun| | 2025-2-10 08:21 | 只看该作者
#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)
    {
        // 这里可以添加其他代码
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝