爱板网论坛

查看: 401|回复: 0

[技术] 【赚周年币】技术帖Week1-Day2——LPC824 Breakout之二、软件延时

[复制链接]

24

主题

0

好友

5302

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 1458 天

    连续签到: 168 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2017-1-2 15:13:00 |显示全部楼层
    本帖最后由 toofree 于 2017-1-17 23:29 编辑

          LPC824 Breakout之二、软件精确延时,LED闪灯,内嵌汇编。
          有同学会说,“不就是个软件延时嘛,没什么稀奇的……,只要写个循环就成了”。但是能不能做到精确呢?这就不好说了吧。
          
          之前在STM32F103 72MHz主频时做过软件延时,精度没太注意,基本差不多。
          这里附上, STM32F103 72MHz软延时.rar (419 Bytes, 下载次数: 7)

          接下来,我们就对之前的延时程序修改测试。
          还是用上一篇贴中修改过的工程做主工程模板。参见贴子最末尾的附件
         [技术] 【赚周年币】技术帖Week1-Day1——LPC824 Breakout之一、点亮LED灯
         http://www.eeboard.com/bbs/thread-59366-1-1.html
          傲游截图20170102130621.jpg

           在文件夹“LPC824_Example_Code_Bundle_Keil_r1.0\Shared_Project_Source_Code”下,新建个文件夹命名为“user_bsp”,并在新建的文件下再新建两个文件夹“inc”和"src"
           傲游截图20170102131412.jpg


          把之前延时delay.h和delay.c,分别放到“inc”和"src"文件下。
           傲游截图20170102131608.jpg
    傲游截图20170102131601.jpg


         打开工程合集,设置当前活动工程为"Example_GPIO_Pattern_Match"。
          傲游截图20170102130851.jpg

          
          将delay.c添加到工程中,并且在工程包含路径中添加“ ..\..\Shared_Project_Source_Code\common\inc”
           傲游截图20170102133743.jpg
    傲游截图20170102133929.jpg


          
          在“Example_GPIO_PatternMatch.c”中添加“ #include "delay.h" ”备用。
           傲游截图20170102134241.jpg


          129行之后改为:
      while (2) {
    //    number = GetConsoleInput(1);                 // See utilities_lib
    //    temp = (~0xF00) & (LPC_GPIO_PORT->PIN0);     // Read the pin register, preserve all except bits 11-8
    //    LPC_GPIO_PORT->PIN0 = temp | (number << 8);  // Write back the new data into bits 11-8
                    LEDs_On(RED);
                    delay_us(500000);
                    LEDs_Off(RED);
                    delay_us(500000);   
      }
           红灯每秒闪灯一次。

          把delay.h和delay.c中的参数变量类型都改为 “uint32_t”。之前没注意过,对于32位处理器来说,用32位类型处理速度是最快的。
          从种种蛛丝马迹中发现(如有必要,另开贴说明),此工程时钟使用12MHz的内部IRC为时钟源,最终系统是30MHz。而在STM32的工各模板用的时候是72MHz,需要对delay.c做适当修改,修改如下:

    #include "delay.h"


    //延时nms
    void delay_ms(uint32_t nms)
    {                                    
      uint32_t i = nms;
      while (i--)
      {
        delay_us(990);
      }                          
    }   


    //延时nus
    // nCount为要延时的us数.
    void delay_us(uint32_t nCount)
    {
    uint32_t TIMCounter = nCount;
      uint32_t i = 0;
      while (TIMCounter--)
      {
        i = 2;  //此处有更改
        while(i--);
      }
    }

          好了,修改完毕。编译生成HEX文件,下载跑一下程序试试看,看看跟真实情况差多少。
          用万用表测试结果,0.90Hz,还是差点儿,既然要做就做精确。

          单靠修改循环次数显然是不行了,那么就需要嵌入汇编NOP。经过多次尝试,修改如下:
    //延时nus
    //nCount为要延时的us数.
    void delay_us(uint32_t nCount)
    {
    uint32_t TIMCounter = nCount;
    uint32_t i;        
      while (TIMCounter--)
      {               
                    i = 1;
                    while(i--)
                            ;
                    __asm {
                            NOP
                            NOP
                            NOP
                    }
      }
    }

          经测试,3个NOP的情况下是0.99Hz,而4个NOP时为0.96Hz,2个NOP时为1.07Hz。得出结论在微秒级延时中,3个NOP最合适,基本也接近微秒级软件延时精度的极限了。
          将主循环中的参数改为delay_us(500); 测试1KHz误差,结果是996.4Hz。
          

    9964

    9964


          对于ms级误差,接下来我们在delay_ms()函数中进一步修正。修改如下:     
    ////延时nms
    void delay_ms(uint32_t nms)
    {                                    
      uint32_t i = nms;
      while (i--)
      {
        delay_us(997);
      }
    }
          
           主函数循环中改为1ms级,如下:
           LEDs_On(RED);
           delay_ms(1);
           LEDs_Off(RED);
           delay_ms(1);

           经测试,参数997时,实测频率499.7Hz;参数996时,实测频率517.4Hz;参数998时,实测频率499.3Hz。
          

    4997

    4997

          
           好了,软件精确延时完美收工,就它了。

           修改后工程文件打包附上,文件名与前面的官网库相同,但大小和内容不同。
           LPC824_Example_Code_Bundle_Keil_r1.0.rar (1.06 MB, 下载次数: 18)         
    已有 2 人评分 收起 理由
    EEboard爱板网 + 3 3周发帖养成记 奖励
    loveeeboard + 30

    总评分:  + 33   查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-11-21 21:57 , Processed in 0.157310 second(s), 15 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部