|
3 软件说明 3.1 应用程序使用的STM8外设 温度计应用软件没有使用STM8S系列或STM8L系列标准固件库。而是包含一些优化的代码,通过使用直接访问寄存器来控制STM8S系列和STM8L系列通用外设,如下所述: • CLK:时钟控制器启用,并向CPU和外设提供准确的时钟频率。它将HSI时钟配置为16 MHz主时钟源,并且将CPU时钟预分频器系数配置为1。 • GPIO:STM8S系列和STM8L系列GPIO用于点亮和熄灭LD2指示灯,以及使用以下配置连接按钮: - STM8S系列:PA3和PE4 - STM8L系列:PG6和PG4 • EXTI:外部中断灵敏度配置为每次下降沿触发中断,对于STM8S系列,在PA3或PA4上检测到下降沿,对于STM8L系列,在PG6或PG4上检测到下降沿。 • 闪存:一小时内的最小和最大温度值保存在数据EEPROM中,以进一步显示在终端窗口上。 • U(S)ART:STM8系列使用UART3,STM8L系列使用USART3与PC终端软件进行通信。它的配置如下: - 波特率= 9600 - 字长= 8位 - 1位停止位 - 无校验 - 启用接收和发送 注意:对于STM8L系列,必须禁用USART3 CLK。 通过轮询UART3(STM8S系列)或USART3(STM8L系列)外设上的每次接收和发送操作来管理通信。 • ADC:STM8S系列ADC2的通道2或STM8L系列ADC1的通道3用于将LM235发出的模拟数据转换为数字值,微控制器可以据此计算当前温度值。 • Timer3(TIM3):该外设用于生成50 ms的时基,并每50 ms触发一次温度采集。
3.2 排除STM8S系列和STM8L系列标准固件库 由于此应用程序使用优化代码,因此必须修改对应的thestm8s.h和stm8l.h文件,而不包括STM8S系列标准固件库和STM8L系列标准固件库。使用以下define声明: - #define USE_STDPERIPH_DRIVER
复制代码
3.3 应用软件流程图 本节概述了应用软件主循环、中断函数流程图和状态机流程图以及对终端通信函数的一些参考。
3.3.1 主循环流程图 主循环代码初始化所需的功能、解锁数据EEPROM编程并调用函数需要实现一般的应用程序算法。 为了最小化软件实时时钟的时间漂移(参见定时器触发采集),HSI时钟用作主时钟源。 在初始化阶段完成并且在终端窗口上显示信息性消息之后,用户系统会提示您输入最低和最高温度阈值。因此,第一次调用State_Machine()函数,它直接进入配置模式(state = 1,参见3.3.3节状态机流程图)。 下图显示了应用程序软件主循环的流程图。 图6. 主循环流程图
3.3.2 中断函数流程图 STM8L系列的按钮采集 每次按下Button1或Button2(板载用户按钮),就会触发一个中断并且调用PORTG_IRQhandler()函数。 PORTG_IRQhandler()函数通过测试端口G输入寄存器确定哪个按钮被按下,然后置位ButtonPressed1或ButtonPressed2标志位(参见第3.3.3节状态机流程图)。 这些标志位触发应用程序状态机中的状态更改。
下图显示了PORTG_IRQhandler()函数的流程图。 图7. STM8L系列:PORTG_IRQhandler()函数流程图
STM8S系列的按钮采集 每次按下Button1,就会触发一个中断并调用PORTA_IRQhandler()函数。 每次按下Button2(板载用户按钮),就会触发一次中断,并调用PORTE_IRQhandler()函数。函数相应地断置位ButtonPressed1或ButtonPressed2标志位。 这些标志位触发更改应用程序状态机中的状态。 下图显示了STM8S系列的PORTA_IRQhandler()和PORTE_IRQhandler()函数的流程图 图8. STM8S系列:PORTA_IRQhandler()和PORTE_IRQhandler()函数流程图
定时器触发采集 TIMER3配置为每50 ms产生一次中断以触发温度采集。每次转换ADC2通道2(STM8S系列)或ADC1通道3(STM8L系列)后,数字值存储在缓冲器数组中以进行进一步计算,然后ADC断电。在缓冲区数组中最多保存16个样本。当计算一秒钟内的平均温度,可以通过除以2的幂实现简单的右移。 TIM3_IRQHandler()调用模拟实时时钟的TRtc_CntUpdate()函数。它置位表示秒、分钟和小时。此RTC函数基于TIM3外设50 ms时基。状态机每秒自动切换到状态3(正常模式)(参见章节3.3.3状态机流程图)。 下图显示了TIM3_IRQhandler()函数的流程图。 图9. TIM3_Init()函数流程图
3.3.3状态机流程图 State_Machine函数实现根据计时器和外部事件控制应用程序执行进度的算法。状态变量的不同值表示应用程序模式: • state = 0:空闲模式 这是状态机的默认状态。 每50毫秒执行一次LM235提供的模拟温度转换。按下Button1或Button2(板载用户按钮)退出此状态。 • 状态1 =配置模式 在状态机配置模式下,终端消息提示用户输入最小和最大温度阈值。这些值从终端窗口读取并以十进制格式记录。在启动时或按下Button1时进入此状态。 • 状态2 =读取模式 在状态机读取模式下,应用程序将从数据EEPROM读取最小和最大温度,并在终端窗口上同一些介绍文件显示它们。同时熄灭LD2指示灯。只能通过按下Button2进入此状态。 • 状态3 =正常模式 每秒进入状态机正常模式。它由TRtc_CntUpdate()函数触发,该函数监视已过去的应用程序时间。每次进入此状态时,平均温度为从保存在缓冲区数组中的16个样本计算得出。如果此温度值超过高阈值或低于最小阈值,点亮LD2。
当前温度每分钟一次显示在终端窗口上,并当该温度是关键消息时还会附加特定信息。每一小时在数据EEPROM中记录一组最大和最小测量温度。 EEPROM中最多可存储10组。这意味着可以保存十个小时的测量记录。写入第11小时数据会重置EEPROM地址指针并覆盖以前的数据。前十个小时的数据通过这样依次覆盖。 进入状态1和2时,TIM3计数器在退出正常模式,并且禁用。退出这些时状态时,重新分配定时器寄存器,并且恢复默认执行模式时再次启用计数器。 请参见下面State_Machine()函数的流程图。 图10. State_Machine函数流程图
3.3.4 终端通信函数 有关终端通信函数的详细说明,请参阅A部分配置终端窗口。
4. 修订记录 表5. 文档修订历史记录 日期 | 版本号 | 更改内容 | 2018年6月29日 | 1 | 首次发布。 |
|