STM32 TIM8 CH1 PWM输出问题:
原先做过的工程项目文件,使用的是STM32F103VCT6,LQFP-100的芯片。
使用PA0作为触摸屏的触摸中断输入;一共是4路PWM输出。
使用了TIM2的3个通道输出PWM(PA1,PA2,PA3),TIM8的1个通道输出PWM(PC7),
使用好长时间了,非常好,没有问题.
这一次有个项目,要用到5路PWM输出,原先设计的PCB板上也有预留PC6的输出,
所以就想着使用PC6作为1路 PWM输出,将原来的4路PWM输出扩展到5路输出。
结果事情就来了,开启PC6,也就是TIM8_CH1的输出,结果导致原来好用的触摸屏,
怎么点击,都没有反应了,就是挂接在SPI1总线上的flash芯片M25P16也是初始化识别,
读取的flash芯片的ID都变成0XFFFFFFFF了,研究了半天,也没有找到原因。
没有办法,就详细地看STM32F103VCT6的说明文档,特别是引脚定义那一块的东西。
应该是TIM8的开启,导致SPI1不好用了,也就是TIM8的引脚输出干扰SPI1,就找到了SPI1
的PA7引脚(SPI1_MOSI)。PA7引脚功能如下: SPI1_MOSI/TIM8_CH1N/ADC12_IN7/TIM3_CH2
原因就是TIM8_CH1N和SPI1_MOSI产生冲突了,干扰到SPI1的正常工作了。那就得必须关闭
TIM8_CH1N !!!, 那应该就正常了。尝试了一下,果然如同上述,问题解决了!!!
SPI1,TIM8_CH1都正常了.
具体的初始化程序如下所示:
void TIM8_GPIO_Configeration( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
//PC.6,PC.7--->PWM Output;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // T8OC1 引脚输出,T8OC2 引脚输出,
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/****************************************************************************
* 功 能: 定时器8初始化函数
*----------------------------------------------------------------------------------------------------------*
* 入口参数:duty----占空比[0~100]
* 出口参数:nil
****************************************************************************/
void TIM8_PWM_Configuration(u8 duty)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
if(duty>100) return;
TIM_TimeBaseStructure.TIM_Period = 65535; //PWM周期=(65535+1)/2000000=30.5HZ
TIM_TimeBaseStructure.TIM_Prescaler = 36-1; //72MHz/1=2MHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //使用模式2
//PA7:SPI1_MOSI/TIM8_CH1N
//SPI1,TIM8_CH1同时使用时,必须关闭TIM8的互补通道:TIM8_CH1N
//不然的话,TIM8_CH1的输出会干扰SPI1的工作,也就是SPI1_MOSI
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //add!!!
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM输出
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//TIM8的通道1[TIM8_CH1]
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM输出
TIM_OCInitStructure.TIM_Pulse = 65535*duty/100; //占空比=duty*65535/(TIM_Period+1)
TIM_OC1Init(TIM8,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable); //TIM_8---->通道1[PC6]
//TIM8的通道2[TIM8_CH2]
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM输出
TIM_OCInitStructure.TIM_Pulse = 65535*duty/100; //占空比=duty*65535/(TIM_Period+1)
TIM_OC2Init(TIM8,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable); //TIM_8---->通道2[PC7]
TIM_Cmd(TIM8,ENABLE);
TIM_CtrlPWMOutputs(TIM8, ENABLE); //设置TIM2的PWM输出为使能
} |