打印
[其他ST产品]

STM8的TIM4精确延时问题

[复制链接]
677|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2023-6-8 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************
**函数名称: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时不管是延时还是中断都是在定时器的中断服务函数里写,我看这段代码之后就有点迷了)

使用特权

评论回复
沙发
elsaflower| | 2023-6-10 16:57 | 只看该作者
stm8的空指令延时c语言怎样写

使用特权

评论回复
板凳
AloneKaven| | 2023-6-10 23:39 | 只看该作者
elsaflower 发表于 2023-6-10 16:57
stm8的空指令延时c语言怎样写

用for循环

使用特权

评论回复
地板
Jacquetry| | 2023-6-11 23:11 | 只看该作者
因为unsigned int 最大值就是65535

使用特权

评论回复
5
LLGTR| | 2023-6-12 16:00 | 只看该作者
1.确实,第一个1ms可能是不准的。

使用特权

评论回复
6
朝生| | 2023-6-12 16:01 | 只看该作者
51单片机也最好不要在中断中添加延时。

使用特权

评论回复
7
软核硬核| | 2023-6-12 16:02 | 只看该作者
定时器延时,就是用定时器的时间还判断要等待多久。

使用特权

评论回复
8
Henryko| | 2023-6-12 21:34 | 只看该作者
LLGTR 发表于 2023-6-12 16:00
1.确实,第一个1ms可能是不准的。

那有什么办法可以避免吗?

使用特权

评论回复
9
yangjiaxu| | 2023-6-12 23:50 | 只看该作者
elsaflower 发表于 2023-6-10 16:57
stm8的空指令延时c语言怎样写

可以用nop,但是得包含头文件,是那个我忘记了,你得自己百度搜搜

使用特权

评论回复
10
Betty1299| | 2023-6-13 11:26 | 只看该作者
正常来说,你把定时器配置好,逻辑配置好之后,延时就不用你管了

使用特权

评论回复
11
Estelle1999| | 2023-6-13 12:31 | 只看该作者
定时器的精确延时与运行速率没啥关系

使用特权

评论回复
12
Charlotte夏| | 2023-6-13 13:34 | 只看该作者
定时器初始化之后的数据才有效,初始化之时也是无效的

使用特权

评论回复
13
Annie556| | 2023-6-13 15:08 | 只看该作者
最大65535好像是跟变量有关系,再大就溢出了

使用特权

评论回复
14
Emily999| | 2023-6-13 16:41 | 只看该作者
ST的定时器与51的定时器好像也一样吧

使用特权

评论回复
15
Carina卡| | 2023-6-13 19:02 | 只看该作者
定时器延时和中断都是一个事儿啊,都是中断服务

使用特权

评论回复
16
houjiakai| | 2023-6-13 22:51 | 只看该作者
需要对TIM4进行基础配置,包括计数模式、预分频系数和自动重装载值等,以确定定时器的计数范围和精度等参数。

使用特权

评论回复
17
hilahope| | 2023-6-13 23:13 | 只看该作者
通过TIM4模拟延时us微秒。首先需要设置TIM4的预分频和计数值,然后启动TIM4,并在每次延时前清除更新标志位并等待更新完成。

使用特权

评论回复
18
Betty996| | 2023-6-14 07:03 | 只看该作者
你别被STM8的定时器逻辑给迷惑了,哈哈

使用特权

评论回复
19
Alina艾| | 2023-6-14 08:30 | 只看该作者
你就理解定时器就是个计数器

使用特权

评论回复
20
Carmen7| | 2023-6-14 10:41 | 只看该作者
我不知道STM8有没有滴答定时器,要是有的话,可以用这个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

3060

帖子

7

粉丝