各位高手,最近遇到一个STM8 PWM输出的怪问题, 我在初始化里配置TIM1 为PWM 输出模式, 输出的脉冲是用来供给步进电机细分驱动器的,每次TIM1更新中断时重新对ARR,CCR 赋初值。 但是系统经常是过一段时间,ARR就变成0了,查了好久也不知道是什么原因造成的,请大家帮忙看一下,下面是初始化程序 ,和中断处理程序 void InitTime1(void) { /****************************************** ***********************************************/ TIM1->CCMR1 |= 0x78; /* Output mode PWM2.TIM_CNT>TIM_CCR时,输出有效电平,使能预装载 */ //TIM1->CCMR1 |= 0x70; /* Output mode PWM2.TIM_CNT>TIM_CCR时,输出有效电平,使能预装载 */ TIM1->CCER1 |= 0x03; /* CC polarity high,enable PWM output */ TIM1->ARRH = 0x07; /* Freq control register: ARR */ TIM1->ARRL = 0xD0; /* Freq control register: ARR */ TIM1->CCR1H = 0x03; /* Dutycycle control register: CCR */ TIM1->CCR1L = 0XE8; /* Dutycycle control register: CCR */ TIM1->BKR |=0X80; //MOE =1;主输出使能 //TIM1->RCR=200; TIM1->RCR=10; TIM1->SCRH = 00; //TIM1->SCRL = 0x1F; ///32分频=16M/32=500KHZ TIM1->SCRL = 0x07;//8分频=16M/8=2000KHZ TIM1->CR1 |= 0x81; /* Enable TIM3. TIM3->ARR通 过预装载寄存器缓冲 */ //TIM1->CR1 |= 0x01; /* Enable TIM1. TIM3->ARR立 即写入影子寄存器 */ TIM1->IER |= 0x01; //充许更新中断 UIE } #ifdef _COSMIC_ @far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) #else /* _RAISONANCE_ */ void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) interrupt 11 #endif /* _COSMIC_ */ { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ //-----共100 cycle 共6.25us unsigned int waittabletemp; unsigned int ccrtemp; //--------------------------------------------------// //----------------------------------------------// //------------------------------------- TIM1->CR1 &= (~0x01); //关闭计数器 #if ACC_CELE_EN==1 if(ArrTemp!=0) //==0时不执行 { switch(AccCeleState) { case 0 :{ TIM1->ARRH = (u8)(ArrTemp>>8); TIM1->ARRL = (u8)ArrTemp; ccrtemp=ArrTemp>>1; TIM1->CCR1H =(u8)(ccrtemp>>8); //Dutycycle control register: CCR TIM1->CCR1L = (u8)(ccrtemp); break; } case 1 :{ //加速 waittabletemp=WaitTable[ArrLastI+ArrLastI2]; TIM1->ARRH = (u8)(waittabletemp>>8); TIM1->ARRL = (u8)waittabletemp; ccrtemp=waittabletemp>>1; TIM1->CCR1H =(u8)(ccrtemp>>8); //Dutycycle control register: CCR TIM1->CCR1L = (u8)(ccrtemp); if((ArrLastI+ArrLastI2++)==ArrI) { ArrLastI2=0; //复位 AccCeleState=0; //转为匀速 ArrTempLast=ArrTemp; } break; } case 2 :{ //减速 waittabletemp=WaitTable[ArrLastI-ArrLastI3]; TIM1->ARRH = (u8)(waittabletemp>>8); TIM1->ARRL = (u8)waittabletemp; ccrtemp=waittabletemp>>1; TIM1->CCR1H =(u8)(ccrtemp>>8); //Dutycycle control register: CCR TIM1->CCR1L = (u8)(ccrtemp); if((ArrLastI-ArrLastI3++)==ArrI) { ArrLastI3=0; //复位 AccCeleState=0; //转为匀速 ArrTempLast=ArrTemp; } break; } } } #endif //---------------------------------------------------- TestRcr++; TIM1->SR1 &= ~0x01; TIM1->CR1 |= 0x01; //开计数器 } |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:请教 一个STM8 定时器TIM1 PWM 输出的问题(TIM1 ARR被异常赋0)
这个你有考虑过吗?会不会为0?
回复:请教 一个STM8 定时器TIM1 PWM 输出的问题(TIM1 ARR被异常赋0)
多谢楼上的提醒!