你好,我的看法如下:
1.根据工程要求,我觉得使用PWM模式就行,stm32参考手册上对该模式的的定义是:“
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。”
2.
TIM_OCInitStructure.TIM_Pulse 是设置跳变值用的,当计数器计数到这个值时,电平发生跳变 ,你可以先给它一个初始值,然后通过在TIMx中断函数里改变TIMx_CCRx的值来改变它。
3.我贴一段该模式的代码,供你参考:
/****************************************************************************
* 名 称: TIM3_PWM_Config
* 功 能:配置TIM3输出的 PWM 信号的模式,如周期、极性、占空比
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
void TIM3_PWM_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; // 结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//打开TIM3时钟
TIM_TimeBaseStructure.TIM_Prescaler = 36-1; //设置预分频;1MHz
TIM_TimeBaseStructure.TIM_Period = 40000-1; //PWM周期
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //使用TIM3
/* PWM1 Mode configuration: Ch1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_Pulse = 1600;
//当定时器计数值小于CCR1_Val时为高电平
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ClearFlag(TIM3,TIM_FLAG_CC1); //清除定时器中断标志
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);
//使能中断
//使能 TIM3定时器
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler()
{
static int i=0;
//溢出中断
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
if(i<500) {i++;TIM3->CCR1=2000}
if(i>=500)
{
TIM3->CCR1=4000;
}
}
}
这个是用来输出一通道前期占空比为 2000/40000的脉冲波,过20s后输出占空比为10%的脉冲波
类似的,你可以将ASCII码值通过switch函数对应不同的TIMx_CCRx的值,从而输出不同波形,代码具体实现,还是自己写比较好。
4.本人水平有限,如有错误和疏忽,请指正。