星期一刚入手F4的板子,花三天运行了一遍59个例子。例子的应用相对简单一点,都是对单一应用功能进行调试。运行完后有一个问题想向论坛里的牛人们请教一下。
在不跑系统的情况下,设计到很多硬件资源的整合,你们是怎么设计程序,使程序在你运行在你的控制之下的。
抛出自己的一小点改变,请大家也分享一下自己的经验。
1、最开始是这样的。便携式检测仪器:显示模块(ht1621b),AD采集模块(TLC2543),语音模块(ISD1760),基础IO(泵,阀,灯,加热,按键)。
仪器开机后初始化预热,显示主菜单,并检测按键。通过按键切换菜单并执行相应的操作。测量过程中实时采集AD并进行平均滤波,最后显示测量结果,超出范围报警。
2、接下来是这样的。台式检测仪器,PC端有一个控制软件,通过串口与STM32通讯。所有的操作命令由PC端发起,STM32端接收命令,操作,上传数据。STM32端去掉了显示,报警。增加了CAN控制两个子模块(稳流模块,恒温模块,通过PC机可以获取当前流量值,温度值,也可以设置目标流量和目标温度及其它参数)。增加了FLASH保存一些参数。
仪器开机初始化预热。等待PC机握手(串口协议自己定),(空闲状态)定时向两个子模块发送CAN命令获取相应参数,定时接收PC的询问命令,并向上发送参数。定时进行传感器端的信号检测与调整。接收到PC端的相应命令后进行相应处理,(测量状态)开始命令后进行仪器控制、采集数据、滤波并通过协议向上发送数据。接收到停止命令后停止,进入空闲状态。
这样的问题就出来了。每一次测量,向上发送的AD数据不定。有时候多,有时候少。而且循环采样发送,数据的采样频率也不一定。这说明程序运行的过程中通过各种分支后运行的速度是不受我控制的。当1路AD变成4路AD的时候,我就更蒙了。随着功能的复杂,功能虽然能实现,但是程序结构就惨不忍睹了。顺便说一下,STM32的中断优先级只是说两个中断同时来的时候先相应谁,而不会根据优先级进行嵌套中断。如果你在一个中断里做很多事情,你就会明显的发现程序变的不流畅了。
3、上一个版本是这样的。所有的中断只接受数据不处理。定义一个定时中断,每100ms中断一次,在这个定时中断里调用一个MainTask()函数,这个主任务里定义其他各项任务并顺序执行一遍。当然,你得保证所有的程序能在这100ms里面执行完成。最好是不要有其他太多的中断。这样我就能保证每次测量一分钟,数据采集600个。降低了中断中的程序执行,能够保证所有的外部请求能在100ms内作出响应。
这稍微有了点任务调度的味道,当然,功能允许你可以把100ms再缩小。
4、接下来又遇到了另外一个问题。新的项目里需要外置一个PWM输出,由于外部设计了SD,液晶等,占用了硬件PWM,所以决定用定时器2的四个捕捉口来控制PWM端口模拟输出。在应用3的方法会发现PWM输出会被不连续。(中断函数不嵌套也是这个时候发现的)。
为了解决这个问题,系统时钟的100ms只是计数。把所有函数都放在主函数中,根据为了在100ms内不重复进入,设置了一个FLAG。也保证了所有任务在100ms内能执行一遍。
新人发帖,说了这么多也不知道是对还是错。希望贴吧里的大牛们分享一下单片机程序框架的设计经验。欢迎拍砖
|