12
返回列表 发新帖我要提问本帖赏金: 1.00元(功能说明)

[技术讨论] stm32f4 定时器精准定时能不能实现us级别?

[复制链接]
3175|30
duanks 发表于 2023-3-8 17:13 | 显示全部楼层
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的


  1. uint16_t flag = 0;
  2. while(1){
  3.         udelay(250);
  4.         Test1_GPIO_Port->BSRR = flag ? Test1_Pin : Test1_Pin << 16;
  5.         flag = !flag;
  6. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

liusheng1998 打赏了 1.00 元 2023-03-09
理由:谢谢 聊表谢意

评论

还有我请教一下 你的示波器是怎么使用的,我用示波器好像检测不到us即的展示  发表于 2023-3-8 22:26
 楼主| liusheng1998 发表于 2023-3-8 20:25 | 显示全部楼层
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

感谢。
您还特地测量了一下。
请问你这个测试使用示波器测得吗,还是仿真?
看来微妙延迟是可以做到的
是我自己的工程写得有问题。
我工程里面确实有一堆USB虚拟串口中断的设计。
我感觉可能是哪里的问题
 楼主| liusheng1998 发表于 2023-3-8 20:37 | 显示全部楼层
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

我也在重新写一个程序
删去 USB虚拟串口的部分
只要两路CAN 和延时功能看看。
按道理说
我的数据已近转存到了单片机上。
在做CAN发送的时候 ,USB传输早结束了
看看延迟效果怎么样
 楼主| liusheng1998 发表于 2023-3-8 22:21 | 显示全部楼层
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

已近试过了
实验结果 还是200 300 反复横跳
我真的是无语了
难道是CAN发送本身的问题
那为什么200us的延时设置能稳定在210us呢

 楼主| liusheng1998 发表于 2023-3-8 22:25 | 显示全部楼层
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

我已经尝试过了
现在就把存好的数组用CAN发送然后用这个延时功能来做延时
结果还是一样的 200us就能稳定 210us的间隔
但是 250us 就会是 210  3100的横跳
我不知道是不是CAN的本身的问题,但是200能稳在210
不应该在250就不稳定。
 楼主| liusheng1998 发表于 2023-3-9 09:54 | 显示全部楼层
本帖最后由 liusheng1998 于 2023-3-9 09:57 编辑
blust5 发表于 2023-3-7 14:14
微秒级定时最好是用定时器中断,因为代码运行时间就会影响精度

你好 ,请问定时器中断做延时的代码逻辑是什么样的。
我自己想的是:
在定时器初始化里面只配置定时器参数,但是不开启定时器。无  
  1. void TIM3_Int_Init(u16 arr,u16 psc)//5000-1  8400-1
  2. {
  3.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
  4.         NVIC_InitTypeDef         NVIC_InitStructure;
  5.         
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  7.         
  8.   TIM_TimeBaseInitStructure.TIM_Period = arr;         //自动重装载值5000-1
  9.         TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频 8400-1
  10.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  11.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  12.         
  13.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  14.         
  15.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
  16.        <b> //TIM_Cmd(TIM3,ENABLE); // 【此处暂不 使能定时器3】</b>
  17.         
  18.         NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  22.         NVIC_Init(&NVIC_InitStructure);

中断处理函数这么写
  1. void TIM3_IRQHandler(void)
  2. {
  3.         time=0;
  4.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
  5.         {
  6.         <b>   time++;//完成一次中断 10us</b>
  7.         }
  8.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位

  9. }

而是在我的每次调用延时函数时  中开启定时器,和关闭定时器。实现10us
  1. <b>void missoin_10us</b>(void)
  2. {  
  3.    <b>    TIM_Cmd(TIM3,ENABLE); //使能定时器3</b>
  4.       for(;;)
  5.           {
  6.             if(time ==1)
  7.                  {
  8.                   break;
  9.                  }
  10.           }
  11.      <b> TIM_Cmd(TIM3,DISABLE); //关闭定时器 </b>
  12. }




blust5 发表于 2023-3-9 10:28 | 显示全部楼层
liusheng1998 发表于 2023-3-9 09:54
你好 ,请问定时器中断做延时的代码逻辑是什么样的。
我自己想的是:
在定时器初始化里面只配置定时器参数 ...

逻辑上是OK的,有几点可以优化一下
一是不用time++来计数,你将定时器配置成需要的延时时间就行,这样从启动定时器到触发中断,就是这个时间,不需要判断time==1。当然如果只是用来做标志位的话是OK的。
第二个是可以直接在定时器中断里关闭定时器,这样可以防止有些定时器启动时并不初始化累加寄存器,在中断之后到关定时器之前又累加了一定的时钟;而在中断里关定时器可以很大程度上避免这个情况。
当然最保险的情况是每次使用之前先初始化一下定时器,这里只需要初始化一下累加寄存器即可,无需初始化所有寄存器。
duanks 发表于 2023-3-9 12:54 | 显示全部楼层
我用淘宝20多的逻辑分析仪看的,也许有什么中断把延时程序打断了,因为这在裸机工程里测试是没问题的
 楼主| liusheng1998 发表于 2023-3-9 14:55 | 显示全部楼层
duanks 发表于 2023-3-9 12:54
我用淘宝20多的逻辑分析仪看的,也许有什么中断把延时程序打断了,因为这在裸机工程里测试是没问题的 ...

好的 谢谢duan先生,我也用了淘宝的分析仪测了下 确实 延时是正常的。
说明您的代码 ,以及我之前的代码都是正确工作的。
问题出现在STM32 CAN模块上,
正常执行了延迟250。CAN分析仪器接收却显示200us的接收结果 说明CAN模块有问题 我再想一下
 楼主| liusheng1998 发表于 2023-3-9 15:46 | 显示全部楼层
coody 发表于 2023-3-7 11:09
见到过几次说定时器不准确了,不知道为什么这么说?
定时器使用自动重装模式,中断操作,定时器是一个数字 ...

您说的是对的。
延时功能是正常的
问题出在CAN的发送问题上,
他好像没有受到延时的控制
为什么会这样 我还在研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部