本帖最后由 zq1987731 于 2009-9-24 16:07 编辑
1.你的例程能让基本51翻出500kHz标准方波吗?
这样啊...可能是3L的注释部分本人写得太不起眼了..
我特别说明一点就是while(1)判定时间忽略,中断关闭。
实际上真正写在单片机中的测试程序中的无限死循环是这样:
while(1)
{
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0; P1_1 = 1; P1_1 = 0;
………………………………(直到ROM放不下为止)
}
然后IO口输出的方波频率就是极其接近500K,STM32的IO翻转速度18MHz我也是这么干的。
用这个简陋的例子就是因为它被广泛的“51迷”用来和M3叫板而已...而就在这一点上加以证明才比较有“说服力”。
2.翻转IO不是特别合适用来表述51的短板。慢吞吞的51通过一些扩展模块一样能产生高速方波;高速CPU操作IO如果不提高效率也会很低劣……
产生高速方波只是一个举例,就和点LED一样,谁会在应用中让单片机造方波?除了PWM...可连不带硬件PWM光靠定时器都能输出三相+死区的STM32都已经这么强了,要是LPC17XX那个系列带完全硬件PWM的还得了?说到扩展模块..这方面51和ARM没有可比性,后者仅仅依靠自身单芯片就可完成51拖了一大堆外围“模块”的多数功能,何况STM32直接有将主频分频后输出的能力,典型值:36MHz。
3.delay_ms()的确是很让人心痛的东东……不过结合51一般应用的场合,他除了傻等还能干什么呢?
我以前用51时,从来不用delay_ms();一般都是定时器提供时基后只在ISR中提供标志位的复位/置位,就比如键盘,用状态机+定时器几乎就是0等待,那么整个程序中凡是需要delay_ms();的一律状态机方法解决,delay_us();的话,如果数值小,直接死等,不然我会用个运行时间心理有数的“空闲任务”来堵“缝隙”。
后面上了STM32就没那么多事了,别说delay_ms();了,连delay_us();都没用过,这个毕竟主频高51太多,和51去比就显得是在“耍赖”了。 |