历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | MSP430 延时总结

2019-10-29 来源:eefocus

*****************************************软件延时************************************/ 
# define CPU_F ((double)8000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
/**************************************************************************************/ 
#define CPU_F((double)8000000)中的8000000表示的是你系统的时钟,该值要随你试验系统的改变而改变。本例中8000000为MCLK=8MHz的意思。

以下例程是分别产生微秒级和毫秒级延时的示范,如果要实现不同的延时只要改变程序中的实参就可以了。调用此程序时实参必是数字,而不能使用变量作为实参。 
       理论上各个延时函数可以达到如下精度: 
       delay_us(1);    //延时1us 
       delay_ms(1);    //延时1ms 
       delay_us(4.2);  //延时4.2us 
       delay_ms(4.2);  //延时4.2ms

上诉例程我用MSP430F448平台测试,现将所用程序及实测结果发布如下,供各位参考: 
1MHZ主频下软件定时情况: 
程序: 


#include   
/*****************************************软件延时************************************/ 
#define CPU_F ((double)1000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))  
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
/**************************************************************************************/ 
//1000000是CPU的主频,即MCLK,需要随系统的改变而改变 
void main(void) 

  WDTCTL = WDTPW + WDTHOLD;                 
  P1DIR = 0x22;                              
  P1SEL = 0x22; 
  P2DIR=0X01;                                
  for(;;) 
  { 
    delay_us(1);   
    P2OUT^=0X01; 
  }                              


结果: 
//delay_us(1):  实际延时时间为6.8us 
//delay_us(10);  实际延时时间为15.6us 
//delay_us(20);  实际延时时间为24.8us 
//delay_us(90);  实际延时时间为92us 
//delay_us(100); 实际延时时间为100us 
//delay_us(900); 实际延时时间为880us 
//delay_us(1000);实际延时时间为0.96ms 
//delay_ms(1);   实际延时时间为0.96ms 
//delay_ms(10);  实际延时时间为9.6ms 
//delay_ms(100); 实际延时时间为96ms 
//delay_ms(500); 实际延时时间为480ms 
//delay_ms(1000); 实际延时时间为950ms 
//delay_ms(10000); 实际延时时间为10s

2MHZ主频如下: 
程序 
#include   
/*****************************************软件延时************************************/ 
#define CPU_F ((double)2000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))  
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
/**************************************************************************************/ 
//2000000是CPU的主频,即MCLK,需要随系统的改变而改变 
void main(void) 

  WDTCTL = WDTPW + WDTHOLD;                  
  FLL_CTL0 |= XCAP18PF;                      
  SCFI0 |= FN_2;                             
  SCFQCTL = 60;          
  P1DIR = 0x22;                             
  P1SEL = 0x22; 
  P2DIR=0X01;                                
  for(;;) 
  { 
    delay_ms(1000);   
    P2OUT^=0X01; 
  }                              

结果: 
//delay_us(1):  实际延时时间为4us 
//delay_us(10);  实际延时时间为13.2us 
//delay_us(20);  实际延时时间为23.2us 
//delay_us(90);  实际延时时间为92us 
//delay_us(100); 实际延时时间为104us 
//delay_us(900); 实际延时时间为900us 
//delay_us(1000);实际延时时间为1.04ms 
//delay_ms(1);   实际延时时间为1.04ms 
//delay_ms(10);  实际延时时间为10ms 
//delay_ms(100); 实际延时时间为100ms 
//delay_ms(500); 实际延时时间为500ms 
//delay_ms(1000); 实际延时时间为1000ms 
//delay_ms(10000); 实际延时时间为10s

8MHZ主频: 
程序: 
#include   
/*****************************************软件延时************************************/ 
#define CPU_F ((double)8000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))  
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
/**************************************************************************************/ 
//8000000是CPU的主频,即MCLK,需要随系统的改变而改变 
void main(void) 

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer 
  FLL_CTL0 |= DCOPLUS+XCAP18PF;             // Set load capacitance for xtal 
  SCFI0 |= FN_4;                            // x2 DCO, 4MHz nominal DCO 
  SCFQCTL = 121;                            // (121+1) x 32768x 2= 8Mhz    
  P1DIR = 0x22;                             // P1.1 & P1.5 to output direction 
  P1SEL = 0x22; 
  P2DIR=0X01;                               // P1.1 & P1.5 to output MCLK & ACLK 
  for(;;) 
  { 
    delay_ms(1000);   
    P2OUT^=0X01; 
  }                              

结果: 
//delay_us(1):  实际延时时间为1.75us 
//delay_us(10);  实际延时时间为10.80us 
//delay_us(20);  实际延时时间为20.8us 
//delay_us(90);  实际延时时间为90.5us 
//delay_us(100); 实际延时时间为100us 
//delay_us(900); 实际延时时间为900us 
//delay_us(1000);实际延时时间为1ms 
//delay_ms(1);   实际延时时间为1ms 
//delay_ms(10);  实际延时时间为10ms 
//delay_ms(100); 实际延时时间为100ms 
//delay_ms(500); 实际延时时间为500ms 
//delay_ms(1000); 实际延时时间为1s 
//delay_ms(10000); 实际延时时间为10s


上述测试说明: 
程式用于20us以下的延时,误差会比较大,主频越高误差越小; 
大于20us小于1000ms的延时,定时时间几乎没有什么误差。

在系统实时性要求比较高的情况下,10ms以上的延时采用软件来实现不是很好的选择,建议采用硬件方式。对于us级的延时,本文提供的程式非常有实用价值。

推荐阅读

史海拾趣

Elma Electronic Inc公司的发展小趣事

Elma对产品质量的追求是显而易见的。通过对所有员工的培训以及遵循认证的ISO标准的系统程序,Elma达到了行业领先的质量水平。这种对质量的承诺不仅体现在产品制造过程中,更贯穿于整个公司的运营和管理中。

Gazelle Microcircuits Inc公司的发展小趣事
随着个人电脑市场的不断发展,用户对主板性能的需求也在不断变化。现代主板更加注重的是高速数据传输、稳定性、能效比等方面,而不再是传统的模拟电路或特殊模块的需求。
Hi-G Relays公司的发展小趣事
负电压的生成需要额外的电路和功耗,取消这些电压输出可以降低主板的整体功耗和发热量,提高能效。
Broadcom(博通)公司的发展小趣事

2015年,博通迎来了历史性的时刻。安华高科技以170亿美元现金与200亿美元的股票,合计370亿美元并购了博通,使其成为安华高科技的子公司。这一并购不仅使博通获得了更多的资源和支持,也为其后续的快速发展奠定了坚实的基础。此后,博通通过一系列的并购活动,不断扩张其业务范围和市场份额。

CAROLCABLE公司的发展小趣事

在激烈的市场竞争中,CAROLCABLE公司深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进先进的生产设备和技术人才,推动技术创新和产业升级。经过多年的努力,CAROLCABLE成功研发出了一系列具有自主知识产权的高性能线缆产品,这些产品在传输速度、稳定性和耐用性等方面均达到了行业领先水平。

随着产品技术的不断升级,CAROLCABLE开始积极拓展国内外市场。公司参加了多个国际电子线缆展会,与全球同行交流学习,寻找合作机会。同时,CAROLCABLE还加强与国内大型电子企业的合作,为其提供定制化的线缆解决方案。这些举措不仅为公司带来了更多的商机,也进一步巩固了CAROLCABLE在电子线缆行业的领先地位。

这两个故事仅是对CAROLCABLE公司发展起来的简要描述,实际上,公司的成长历程中还有许多值得探讨的细节和里程碑事件。如需了解更多关于CAROLCABLE公司的故事,建议查阅相关新闻报道或公司官方资料。

Alpha Industries公司的发展小趣事

在环保意识日益增强的今天,Alpha Industries积极响应绿色生产的号召。公司利用电子技术优化生产流程,减少能源消耗和废弃物排放。此外,Alpha Industries还推出了采用环保材料制成的军事服装系列,以实际行动践行绿色环保理念。这些举措不仅有助于提升公司的社会形象,也为公司的可持续发展奠定了坚实基础。

这些故事展示了Alpha Industries如何在电子技术的推动下,不断创新并适应市场变化,进而在相关领域取得显著发展。尽管这些故事并未直接涉及电子行业的核心业务,但它们却充分体现了Alpha Industries在技术创新和市场拓展方面的积极努力和取得的成果。

问答坊 | AI 解惑

滤波器设计基础

滤波器基础设计讲义   …

查看全部问答>

新手问题:二极管怎样确定A.K

 我画的PCB中的二极管始终没有连线.是不是需要定义A.K啊?该如何定义呢??…

查看全部问答>

基于硬件构件的嵌入式底层软件开发方法研究及其应用

200892_荐红梅--基于硬件构件的嵌入式底层软件开发方法研究及其应用…

查看全部问答>

谁有MS-DOS 3.1的软件?

网上找了很多,都没法使用。 大家有没有可以分享的?…

查看全部问答>

求ISD4003 资料

请问哪位高手 有关ISD4003 语音芯片   C版本的…

查看全部问答>

求助:(TFTP)TIMEOUT waiting for Ack block

我是个新手,用一块板子s3c2510测试了下tftp的功能,发现程序中定义的的包结构,都偏移了两个字节发送出去,在发送前人为添加了两个字节,可以正常与tftpserver通信了,并能下载104K 的BIN文件, 但在下载稍微大点的应用文件(大约4M)时,总会报 ...…

查看全部问答>

急求msp430控制led自动调光电路图

方案为:利用光敏电阻监测光强输送给msp430,通过msp430改变led两端电压的占空比以调光…

查看全部问答>

NUC100VE3AN如何读写IS61C6416AL

/*请教下各位大侠  为什么读出来的数据老是等于0呢  麻烦各位这点一下*/ #include #include \"NUC1xx.h\" #include \"DrvGPIO.h\" #include \"DrvSYS.h\" /*$$$$$$$$$$$$$$$$$RAM$$$$$$$$$$$$$$$$$$$$$$*/ #define& ...…

查看全部问答>

哪位大牛给介绍一款常用的内部带flash的fpga

哪位大牛给介绍一款常用的内部带flash的fpga 领导非要用内部带flash的,小弟新手找了好久爱也没找到,不知道从手册的哪里能够看出来有没有内置flash。 我们公司以前的产品里面貌似只有XC3S50AN-4TQ144C这个里面有,但是这个的资源不够用…

查看全部问答>

MAX913比较器外围电路如何搭建

刚学习一下MAX913比较器,一开始外围电路没用电阻,直接输入输出,LE脚接的地,可是把正玄波转换成方波总是出现问题   几百Khz时仿真就出现错误:本来应该高电平的却出现多个三角波 。再网上找别人的经验,试试还是不行   有 ...…

查看全部问答>