mars1479 发表于 2023-8-25 20:30:50

8H1K08,串口通讯后改变了系统延时时间 | 已解决

程序中对时钟的初始化如下:


    IRC22M = (char idata *)0xfa;    IRC24M = (char idata *)0xfb;    //IRTRIM = *IRC22M;                           //装载22.1184MHz的IRC参数    IRTRIM = *IRC24M;                           //装载24MHz的IRC参数    P_SW2 = 0x80;    CLKDIV = 0;                                 //主时钟不预分频    P_SW2 = 0x00;



#define MAIN_Fosc                24000000L      //定义主时钟



所用延时函数为:
void delay_ms(unsigned char ms){      unsigned int i;      do{                i = MAIN_Fosc / 10000;                while(--i);      }while(--ms);}


在程序的主循环中和中断中都使用了延时函数,突然发现如果程序启动后和外系统有过串口通讯的话(115200波特率),主循环里面的延时函数会增大18倍多(6毫秒变成100多毫秒,而中断里面的延时函数正常。)
如果没有串口通讯,则主循环和中断中的延时函数都正常。
请问造成延时函数不准的原因是什么?

mars1479 发表于 2023-8-25 20:32:02

    IRC22M = (char idata *)0xfa;

    IRC24M = (char idata *)0xfb;

    IRTRIM = *IRC24M;                           //装载24MHz的IRC参数


    P_SW2 = 0x80;

    CLKDIV = 0;                                 //主时钟不预分频
   
P_SW2 = 0x00;

mars1479 发表于 2023-8-25 20:41:25

好奇怪的现象,麻烦工程师帮忙解释一下。

kksk 发表于 2023-8-25 22:23:49

串口是有中断的,收发数据需要耗费时间

mars1479 发表于 2023-8-26 13:02:14

kksk 发表于 2023-8-25 22:23
串口是有中断的,收发数据需要耗费时间

只通讯了一次,之后主循环里的延时都被改变了10几倍。

mars1479 发表于 2023-8-28 13:43:51

本帖最后由 mars1479 于 2023-8-28 16:20 编辑

已解决。

jwd 发表于 2023-8-28 20:40:43

中断里面就不要用延时了吧

huatlwangl 发表于 2024-9-26 17:46:23

mars1479 发表于 2023-8-28 13:43
已解决。

求教怎么解决的,我现在也遇到这个问题了

ketly 发表于 2024-10-6 19:43:59

mars1479 发表于 2023-8-25 20:41
好奇怪的现象,麻烦工程师帮忙解释一下。

延时函数有这么写的吗?对于是系统你让CPU空转来延时,不但卡而且很不准确
用定时器做延时,设立N个标志就是N个延时函数 。不但准确,而且不占用机器周期
页: [1]
查看完整版本: 8H1K08,串口通讯后改变了系统延时时间 | 已解决