Proteus仿真MSP430单片机的若干问题记录

时间:2021-12-30 19:36:44

1.支持的具体型号:

P7.8:

Proteus仿真MSP430单片机的若干问题记录

Proteus8.9:

Proteus仿真MSP430单片机的若干问题记录

Proteus仿真MSP430单片机的若干问题记录

Proteus8.9能够支持的类型明显要多于Proteus7.8。但是对于仿真而言,目前个人还是觉得Proteus7.8更稳定。这也是目前能用P7不用P8的原因。

2.时钟设置

在仿真中,外置晶振电路不论如何设计都不会影响单片机的真正运行时钟。MSP430的时钟通过点击芯片“Edit Component”进行设计。下图可以看出可以直接设置MCLK,SMLK和ACLK。经过实际测试可以在程序中选择不同的时钟源,并且可以设计分频。

在仿真的时候可以将几个时钟全部设置成8M,省去配置时钟的麻烦,所有时钟一个标准。

Proteus仿真MSP430单片机的若干问题记录

3.精确的延时函数

MSP430单片机内部含有Timer,ADC,中断等等设计,可以通过内部资源进行一些类型的仿真。如果需要外挂芯片,尤其是串行通信的芯片,一个精确稳定的延时函数就必不可少。如果一个延时函数精确,那么几乎所有的51芯片外挂芯片的仿真,应该都可以移植到msp430上来。同理,stm32的仿真也是类似的。

这一点这篇帖子的分析还是比较到位的:

https://www.cnblogs.com/memset/archive/2013/07/05/3173502.html

IAR中实现了__intrinsic void __delay_cycles(unsigned long __cycles)这个内联函数进行系统时钟次数的延时。所以在IAR中可以这样写来实现延时:

#define CPU_CLOCK 8000000

#define delay_us(us) __delay_cycles(CPU_CLOCK/1000000*(us))

#define delay_ms(ms) __delay_cycles(CPU_CLOCK/1000*(ms))

我在实际的仿真中测试过,这套延时函数比实际时钟慢1倍左右。delay_ms(1000)大概在2s左右,所以实际仿真时候应该适当更正一下这个函数。

#define CPU_CLOCK 4000000

#define delay_us(us) __delay_cycles(CPU_CLOCK/1000000*(us))

#define delay_ms(ms) __delay_cycles(CPU_CLOCK/1000*(ms))

这样的延时时间是相当准的,用这个移植51的程序应该有很大希望。