STM32/STM8技术william hill官网
直播中

jinding

5年用户 23经验值
擅长:嵌入式技术 接口/总线/驱动 控制/MCU
私信 关注
[问答]

STM8的TIM4精确延时问题


/*******************************************************************************
**函数名称:void timer4Init()
**功能描述:定时器4参数初始化
**入口参数:无
**输出:无
*******************************************************************************/
void Timer4Init()
{
  TIM4_IER_bit.TIE = 0;           // 禁止中断
  TIM4_IER_bit.UIE = 0;
  TIM4_EGR_bit.UG = 1;            // 允许产生更新事件
  TIM4_PSCR_bit.PSC = 7;          // 计数器时钟=主时钟16MHz / 128 = 125KHz
                                                            
  TIM4_ARR = 125;                 //设定定时器4产生1毫秒重装载时的计数值,255是最大值
  TIM4_CNTR = 0x00;               // 设定计数器的初值
}
/*******************************************************************************
**函数名称:void TIM4Delayms(unsigned int ms)
**功能描述:定时器4参进行精确延时,最小为1毫秒,最大65535
**入口参数:unsigned int ms     1=< ms <= 65535
**输出:无
*******************************************************************************/
void TIM4Delayms(unsigned int ms)
{
  TIM4_CNTR = 0x00;                // 设定计数器的初值
  TIM4_CR1_bit.CEN = 1;            //启动定时器4开始计数
  while(ms--)
  {
    while(TIM4_SR_bit.UIF == 0);  //等待计数是否达到1毫秒
    TIM4_SR_bit.UIF = 0;          //计数完成1毫秒,清除相应的标志
  }
  TIM4_CR1_bit.CEN = 0;          //延时全部结束,关闭定时器4
}
/*    主函数    */
int main(void)
{
  asm("sim");             //关闭系统总中断
  CLK_CKDIVR = 0x00;      //CPUDIV = 1 HSIDIV = 1  内部时钟 = 16Mhz
  Timer4Init();           //调用定时器4初始化函数
  LED3Init();             //调用LED3初始化函数
  while(1)
  {
    PC_ODR ^= 0x40;       //异或取反PC->6 ,控制LED3进行周期性亮灭亮灭操作
    TIM4Delayms(1000);    //调用定时器4进行精确延时1000毫秒,即1秒
  }
}





问题:
1.第一次运行时,软件置位UG位,会立即更新事件标志位UIF=1,是不是就l立即刷新了定时器TIM4相关寄存器的值?那么第一个1ms定时是不是就不准确,因为UIF已经置1?

2.为啥写定时器4参进行精确延时,最小为1毫秒,最大65535,是不是与单片机的运行速率有关

3.为我讲解一下STM8的定时器延时与定时器中断的区别?(之前学51时不管是延时还是中断都是在定时器的中断服务函数里写,我看这段代码之后就有点迷了)

回帖(2)

陈杰

2019-9-18 16:41:44
这问题也太多了,看一下手册吧
举报

李存皓

2019-9-24 14:31:11
1.第一次运行时,软件置位UG位,会立即更新事件标志位UIF=1,是不是就l立即刷新了定时器TIM4相关寄存器的值?那么第一个1ms定时是不是就不准确,因为UIF已经置1?
->不会,置UG位为什么是复位相关寄存器?

2.为啥写定时器4参进行精确延时,最小为1毫秒,最大65535,是不是与单片机的运行速率有关
->你也可以弄的更大,更小也只能到us
3.为我讲解一下STM8的定时器延时与定时器中断的区别?(之前学51时不管是延时还是中断都是在定时器的中断服务函数里写,我看这段代码之后就有点迷了)
->这段代码用的是轮询的方式,没有用中断,程序会在delay的地方阻塞
举报

更多回帖

发帖
×
20
完善资料,
赚取积分