发新帖本帖赏金 1.00元(功能说明)我要提问
12
返回列表
打印
[技术讨论]

stm32f4 定时器精准定时能不能实现us级别?

[复制链接]
楼主: liusheng1998
手机看帖
扫描二维码
随时随地手机跟帖
21
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的


uint16_t flag = 0;
while(1){
        udelay(250);
        Test1_GPIO_Port->BSRR = flag ? Test1_Pin : Test1_Pin << 16;
        flag = !flag;
}


使用特权

评论回复

打赏榜单

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

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

感谢。
您还特地测量了一下。
请问你这个测试使用示波器测得吗,还是仿真?
看来微妙延迟是可以做到的
是我自己的工程写得有问题。
我工程里面确实有一堆USB虚拟串口中断的设计。
我感觉可能是哪里的问题

使用特权

评论回复
23
liusheng1998|  楼主 | 2023-3-8 20:37 | 只看该作者
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

我也在重新写一个程序
删去 USB虚拟串口的部分
只要两路CAN 和延时功能看看。
按道理说
我的数据已近转存到了单片机上。
在做CAN发送的时候 ,USB传输早结束了
看看延迟效果怎么样

使用特权

评论回复
24
liusheng1998|  楼主 | 2023-3-8 22:21 | 只看该作者
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

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

使用特权

评论回复
25
liusheng1998|  楼主 | 2023-3-8 22:25 | 只看该作者
duanks 发表于 2023-3-8 17:13
楼主的测试例程是怎样的?我用gpio翻转做测试是还很挺准的

我已经尝试过了
现在就把存好的数组用CAN发送然后用这个延时功能来做延时
结果还是一样的 200us就能稳定 210us的间隔
但是 250us 就会是 210  3100的横跳
我不知道是不是CAN的本身的问题,但是200能稳在210
不应该在250就不稳定。

使用特权

评论回复
26
liusheng1998|  楼主 | 2023-3-9 09:54 | 只看该作者
本帖最后由 liusheng1998 于 2023-3-9 09:57 编辑
blust5 发表于 2023-3-7 14:14
微秒级定时最好是用定时器中断,因为代码运行时间就会影响精度

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

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

}

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




使用特权

评论回复
27
blust5| | 2023-3-9 10:28 | 只看该作者
liusheng1998 发表于 2023-3-9 09:54
你好 ,请问定时器中断做延时的代码逻辑是什么样的。
我自己想的是:
在定时器初始化里面只配置定时器参数 ...

逻辑上是OK的,有几点可以优化一下
一是不用time++来计数,你将定时器配置成需要的延时时间就行,这样从启动定时器到触发中断,就是这个时间,不需要判断time==1。当然如果只是用来做标志位的话是OK的。
第二个是可以直接在定时器中断里关闭定时器,这样可以防止有些定时器启动时并不初始化累加寄存器,在中断之后到关定时器之前又累加了一定的时钟;而在中断里关定时器可以很大程度上避免这个情况。
当然最保险的情况是每次使用之前先初始化一下定时器,这里只需要初始化一下累加寄存器即可,无需初始化所有寄存器。

使用特权

评论回复
28
duanks| | 2023-3-9 12:54 | 只看该作者
我用淘宝20多的逻辑分析仪看的,也许有什么中断把延时程序打断了,因为这在裸机工程里测试是没问题的

使用特权

评论回复
29
liusheng1998|  楼主 | 2023-3-9 14:55 | 只看该作者
duanks 发表于 2023-3-9 12:54
我用淘宝20多的逻辑分析仪看的,也许有什么中断把延时程序打断了,因为这在裸机工程里测试是没问题的 ...

好的 谢谢duan先生,我也用了淘宝的分析仪测了下 确实 延时是正常的。
说明您的代码 ,以及我之前的代码都是正确工作的。
问题出现在STM32 CAN模块上,
正常执行了延迟250。CAN分析仪器接收却显示200us的接收结果 说明CAN模块有问题 我再想一下

使用特权

评论回复
30
liusheng1998|  楼主 | 2023-3-9 15:46 | 只看该作者
coody 发表于 2023-3-7 11:09
见到过几次说定时器不准确了,不知道为什么这么说?
定时器使用自动重装模式,中断操作,定时器是一个数字 ...

您说的是对的。
延时功能是正常的
问题出在CAN的发送问题上,
他好像没有受到延时的控制
为什么会这样 我还在研究

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则