OpenEdv-开源电子网

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

为什么TIM3只能输出一路PWM

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-23 09:43:09 | 显示全部楼层 |阅读模式
20金钱
如题,原子的历程是用TIM3部分复用,用PB8输出PWM波形,部分不用的话是将CH2给到了PB5;CH1给到了PB4。为什么我只有PB5有波形输出,PB4没有,代码如下,求解~
  1. int main(void)
  2. {                          
  3.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  4.         TIM3_PWM_Init(899,0);         //不分频。PWM频率=72000000/900=80Khz
  5.            while(1)
  6.         {                                                                 
  7.                 TIM_SetCompare2(TIM3,300);       
  8.                 TIM_SetCompare1(TIM3,300);       
  9.         }         
  10. }

  11. void TIM3_PWM_Init(u16 arr,u16 psc)
  12. {  
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  15.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  16.        

  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  19.        
  20.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射

  21.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  26.        
  27.         //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.4
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TIM_CH1
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  32.    //初始化TIM3
  33.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  34.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  35.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  36.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  37.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  38.        
  39.         //初始化TIM3 Channel2 PWM模式         
  40.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  41.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  42.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  43.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
  44.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1

  45.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
  46.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器

  47.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3       
  48. }
复制代码

最佳答案

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

PB4是JTAG引脚,需要remap,,GPIO_Remap_SWJ_JTAGDisable
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-2-13
在线时间
125 小时
发表于 2020-7-23 09:43:10 | 显示全部楼层
本帖最后由 492393275 于 2020-7-23 10:27 编辑

PB4是JTAG引脚,需要remap,,GPIO_Remap_SWJ_JTAGDisable
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-23 09:44:52 | 显示全部楼层
不好意思,问题描述有错别字。我现在PB5即TIM3的CH2有波形输出;而PB4即TIM3的CH1没输出,求解~
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4498
金钱
4498
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-23 11:13:19 | 显示全部楼层
遇到问题先看数据手册,STM32F1的数据手册第28页起IO说明的很清楚
PinsPin nameType(1)I / O Level(2)Main
function(3)
(after reset)
Alternate functions(4)
LFBGA100UFBG100LQFP48/UFQFPN48TFBGA64LQFP64LQFP100VFQFPN36Default Remap

A6 A7 40 A4 56 90 31 PB4 I/O FT JNTRSTTIM3_CH1/
PB4/
SPI1_MISO





回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-23 11:30:17 | 显示全部楼层
有几个IO口涉及到程序下载需要注意下。
当芯片IO口资源比较紧张时,可选择SW模式烧录程序。SWD只需用到PA13/JTMS、PA14/JTCK两根线,NREST可以接可不接,而剩下的PB4/JNTRST、PB3/JTDO和PA15/JTDI就可以当做普通IO使用。
  1. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SW
  2. GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW
复制代码

建议用第一个,因为如果都关了,可能导致程序下载不进去,只能通过将boot0接高电平复位来解决
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-23 11:42:37 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-7-23 11:30
有几个IO口涉及到程序下载需要注意下。
当芯片IO口资源比较紧张时,可选择SW模式烧录程序。SWD只需用到PA1 ...

自己试了下,哪怕是用
  1. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SW
复制代码

依旧会导致程序下载不了,需要用到boot0拉高强制复位,所以建议PB4之类的程序下载的IO口尽量不要拿来使用,不方便。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 07:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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