以下是前提 1. 延时的过程中最好不关断,以保持对高优先级中断的响应 2. 延时的时间可能很短,比如说5us,也有可能比较长,比如说500us,且对时序的精度要求比较高 3. 系统中有不少于一个的较高级别的中断源,其中断服务的执行时间极端情况下可能比较长,比如说有可能大于500us,但通常不会太长。 4. 系统主频不希望太高(纯粹个人习惯),比如说11.06MHz,
应用1,读写单总线器件DS1820,需要比较严格的时序,比如单总线读取时序, 1.将口线输出0, 2.延时待6us 3.口线变高阻态 4.延时9us 5.读取口线上的电平(口线输出0,15us后读取) 6.口线输出0,60us后返回
应用2,模拟串口 LPC2103中有两个串口,但有时使用PWM的时候会导致管脚冲突,或者需要更多的串口的时候,需要软件模拟串口。串口接收的时候,收到起始位后每隔一段固定的时间检测输入信号,以9600bps的速率接收时,每位需要延时104us,接收一个字节需要1ms,即使232协议允许有一定的速率波动,通常也不会超过10%。
以这两个应用为例,都需要比较精确的us级的延时,误差都不能太大,要想用关中断的办法来确保延时精度都需要关比较长时间的中断。 以前用51实现的时候,1ms干不了多少事,关上1ms的中断也就关了,还用过MSP430,TA0有定时锁存管脚信号的功能,ARM的定时器没发现有这个功能
下面是问题: 用ARM,比如说LPC2104,不知道有什么更好的办法实现精确延时没有!? |