OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3213|回复: 5

STM32F405使用一个定时器输出两路PWM波时,将两个引脚的复用写在同一GPIO_PinAFConfig()中会导致一个引脚无法正常输出

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-26
在线时间
6 小时
发表于 2020-8-14 10:21:52 | 显示全部楼层 |阅读模式
1金钱
  1. void TimeSteerMotorConfig(u32 arr,u32 psc)
  2.         {         
  3.                         GPIO_InitTypeDef                 GPIO_InitStructure;
  4.                         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.                         TIM_OCInitTypeDef                 TIM_OCInitStructure;
  6.        
  7.                         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);     //TIM4时钟使能
  8.                         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);                                 //使能GPIOB时钟

  9.                         GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
  10.                         GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);
  11.                        
  12.                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                                 //GPIO
  13.                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                 //复用功能
  14.                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                                    //速度100MHz
  15.                         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                //推挽复用输出
  16.                         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                                 //上拉
  17.                         GPIO_Init(GPIOB,&GPIO_InitStructure);
  18.        
  19.                         TIM_TimeBaseStructure.TIM_Prescaler=psc;                                                         //定时器分频
  20.                         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                         //向上计数模式
  21.                         TIM_TimeBaseStructure.TIM_Period=arr;                                                                 //自动重装载值
  22.                         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  23.                         //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//默认就为0
  24.                         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);                                                //初始化定时器4
  25.                
  26.                 //初始化TIM1 PWM模式
  27.                         //PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。在递减计数模式下,
  28.                         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                         //PWM1为正常占空比模式,PWM2为反极性模式
  29.                         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 //比较输出使能
  30.                         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                         //输出极性:TIM输出比较极性低,有效电平为低电平
  31. //                        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;                //在空闲时输出 低,这里的设置可以改变TIM_OCPolarity 如果没这句,第1通道有问题
  32.                         TIM_OCInitStructure.TIM_Pulse = 2000;                                                                 //输入通道1 CCR1(占空比数值)
  33.                         TIM_OC1Init(TIM4, &TIM_OCInitStructure);                                                         //Ch1初始化
  34.                         TIM_OC2Init(TIM4, &TIM_OCInitStructure);                                                        //TIM4中CH2初始化
  35.                        
  36.                         //TIM_OCInitStructure.TIM_Pulse = 5000;
  37.                         //TIM_OC4Init(TIM8, &TIM_OCInitStructure);//通道4
  38.                         TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);                                         //使能TIM1在CCR1上的预装载寄存器,CCR自动装载默认也是打开的
  39.                         TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);                                        //使能TIM4在CCR2上得预装载寄存器
  40.                         TIM_ARRPreloadConfig(TIM4,ENABLE);                                                                        //ARPE使能
  41.                         TIM_Cmd(TIM4, ENABLE); //使能TIM1
  42.                         TIM_CtrlPWMOutputs(TIM4, ENABLE);                                                                        //使能TIM1的PWM输出,TIM1与TIM8有效,如果没有这行会问题
  43.         }
复制代码
在GPIO复用语句中  如果写成GPIO_PinAFConfig(GPIOB, GPIO_PinSource6|GPIO_PinSource7, GPIO_AF_TIM4);
会导致B6引脚无法正常输出PWM波,只有分开复用才能两个引脚都正常输出PWM波,这是为什么?

最佳答案

查看完整内容[请看2#楼]

如果下到寄存器去看 GPIO_PinSource6|GPIO_PinSource7 = 0x06 | 0x07 = 0x07 等于还是只有7被配置了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2020-6-12
在线时间
303 小时
发表于 2020-8-14 10:21:53 | 显示全部楼层
如果下到寄存器去看  GPIO_PinSource6|GPIO_PinSource7 = 0x06 | 0x07 = 0x07  等于还是只有7被配置了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-14
在线时间
1 小时
发表于 2020-8-14 10:39:11 | 显示全部楼层
不要写在一起,会出问题
回复

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-2-13
在线时间
125 小时
发表于 2020-8-14 11:26:01 | 显示全部楼层
GPIO_PinSourcex不是位操作,两个引脚或运算导致出错,建议详细看看固件库中的定义
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-26
在线时间
6 小时
 楼主| 发表于 2020-8-14 14:26:00 | 显示全部楼层
rektito 发表于 2020-8-14 11:07
如果下到寄存器去看  GPIO_PinSource6|GPIO_PinSource7 = 0x06 | 0x07 = 0x07  等于还是只有7被配置了

多谢多谢
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-26
在线时间
6 小时
 楼主| 发表于 2020-8-14 14:26:42 | 显示全部楼层
492393275 发表于 2020-8-14 11:26
GPIO_PinSourcex不是位操作,两个引脚或运算导致出错,建议详细看看固件库中的定义

哦哦   多谢指点,在固件库中了解了一下确实理解为什么出现这种情况了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 13:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表