OpenEdv-开源电子网

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

STM32F103ZET6核心板使用TIM4重映射无法输出4路PWM

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-5-16
在线时间
4 小时
发表于 2020-5-16 15:59:04 | 显示全部楼层 |阅读模式
       在使用STM32F103ZET6核心板时,由于TIM4原有两路通道未以引脚形式引出,因此想使用端口重映射。TIM4映射到PD12~PD15,但是由于PD12~PD15被FSMC总线数据线(LCD/SRAM)共用,因此需要禁用LCD和SRAM的片选信号。查表得知PG10,PG12是片选控制。但是禁用之后,还是无法实现PWM输出,求助下各位到底是什么原因?(代码如下)
  1. #include "pwm.h"

  2. void TIM4_PWM_Init(void)//PWM输出初始化
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;      
  5.           TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  6.           TIM_OCInitTypeDef  TIM_OCInitStructure;
  7.           
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);  //该代码块想禁用LCD和SRAM的片选
  9.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12;  
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                        
  11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.     GPIO_Init(GPIOG, &GPIO_InitStructure);
  13.           GPIO_SetBits(GPIOG,GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_9);

  14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);     //开GPIOD、TIM4、AFIO时钟,用来实现端口重映射
  15.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  16.     RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   
  17.           GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
  18.    
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  23.     /****************信号周期*****************/           
  24.     TIM_TimeBaseStructure.TIM_Period = 899;                   //当定时器从0计数到899,即为900次,为一个定时周期
  25.     TIM_TimeBaseStructure.TIM_Prescaler = 0;                         //设置预分频
  26.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;         //设置时钟分频系数:不分频
  27.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  28.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  29.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //配置为PWM模式1
  30.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //当定时器计数值小于CCR1_Val时为高电平
  31.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  32.     TIM_OCInitStructure.TIM_Pulse = 100;                                      //设置通道1的电平跳变值,输出另外一个占空比的PWM  
  33.     TIM_OC1Init(TIM4, &TIM_OCInitStructure);                               //使能通道1
  34.     TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  35.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        //配置为PWM模式1
  36.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //当定时器计数值小于CCR1_Val时为高电平
  37.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  38.     TIM_OCInitStructure.TIM_Pulse = 100;                                    //设置通道2的电平跳变值,输出另外一个占空比的PWM
  39.     TIM_OC2Init(TIM4, &TIM_OCInitStructure);                            //使能通道2
  40.     TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

  41.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       //配置为PWM模式1
  42.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //当定时器计数值小于CCR1_Val时为高电平
  43.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  44.     TIM_OCInitStructure.TIM_Pulse = 100;                                  //设置通道3的电平跳变值,输出另外一个占空比的PWM  
  45.     TIM_OC3Init(TIM4, &TIM_OCInitStructure);                            //使能通道3
  46.     TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  47.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         //配置为PWM模式1
  48.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //当定时器计数值小于CCR1_Val时为高电平
  49.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  50.     TIM_OCInitStructure.TIM_Pulse = 100;                                     //设置通道4的电平跳变值,输出另外一个占空比的PWM
  51.     TIM_OC4Init(TIM4, &TIM_OCInitStructure);         
  52.     TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

  53.     TIM_ARRPreloadConfig(TIM4, ENABLE);                                           // 使能TIM4重载寄存器ARR
  54.     TIM_Cmd(TIM4, ENABLE);                                     //使能定时器4
  55. }

复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

42

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-6-25
在线时间
0 小时
发表于 2020-5-16 15:59:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-5-16
在线时间
4 小时
 楼主| 发表于 2020-5-16 16:03:44 | 显示全部楼层
禁用片选那段,GPIO_Pin_9是没删干净,排版时跟发帖的格式有点差距,各位见谅
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-11-22
在线时间
11 小时
发表于 2020-12-3 15:09:48 | 显示全部楼层
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
改成
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;试试
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 06:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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