新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2020-5-16
- 在线时间
- 4 小时
|
在使用STM32F103ZET6核心板时,由于TIM4原有两路通道未以引脚形式引出,因此想使用端口重映射。TIM4映射到PD12~PD15,但是由于PD12~PD15被FSMC总线数据线(LCD/SRAM)共用,因此需要禁用LCD和SRAM的片选信号。查表得知PG10,PG12是片选控制。但是禁用之后,还是无法实现PWM输出,求助下各位到底是什么原因?(代码如下)
- #include "pwm.h"
- void TIM4_PWM_Init(void)//PWM输出初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //该代码块想禁用LCD和SRAM的片选
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOG, &GPIO_InitStructure);
- GPIO_SetBits(GPIOG,GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_9);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //开GPIOD、TIM4、AFIO时钟,用来实现端口重映射
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- /****************信号周期*****************/
- TIM_TimeBaseStructure.TIM_Period = 899; //当定时器从0计数到899,即为900次,为一个定时周期
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 100; //设置通道1的电平跳变值,输出另外一个占空比的PWM
- TIM_OC1Init(TIM4, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 100; //设置通道2的电平跳变值,输出另外一个占空比的PWM
- TIM_OC2Init(TIM4, &TIM_OCInitStructure); //使能通道2
- TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 100; //设置通道3的电平跳变值,输出另外一个占空比的PWM
- TIM_OC3Init(TIM4, &TIM_OCInitStructure); //使能通道3
- TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 100; //设置通道4的电平跳变值,输出另外一个占空比的PWM
- TIM_OC4Init(TIM4, &TIM_OCInitStructure);
- TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
- TIM_ARRPreloadConfig(TIM4, ENABLE); // 使能TIM4重载寄存器ARR
- TIM_Cmd(TIM4, ENABLE); //使能定时器4
- }
复制代码
|
|