工作中,很少使用STM8S,但是由于这颗U在通用U中的价格实在太诱人,在一个非常简单的应用中使用了它。
需求:根据主控板的串口指令,控制风扇转速。
技术要求:1. 风扇为两线普通风扇,24V供电,功率3W,三个并联使用;2主控板与该风扇控制板通过串口485通讯;3.风扇速度设定三种A停转 B低速静音 C 高速。
电路设计:1使用MC34063设计24V转5V给STM8供电;2.由于ssop20引脚的芯片手工焊接容易不良,选择LQFP32封装的STM8S005K6;3. 使用75176通讯芯片;4.使用TIP122芯片驱动风扇。5.设置一个单片机口控制的LED指示灯。
软件设计:很简单,串口接收指令,如果指令中改变了风扇的速度,则,通过改变控制TIP122的PWM,达到控制转速的目的。
调试:
第一步,通过改变程序强制输出PWM试验,每改变一次下载一次程序。分别设置PWM,查看不同PWM对应风扇的速度,并选取中间某一种作为静音风速。ok
第二步,串口通讯,没收到一次翻转LED控制电平。使用UST TO 485模块,电路板上电后,通过串口助手发送信息测试通讯。ok
第三步,编制串口通讯协议,用第二步方法测试,每收到完整一帧,LED翻转。ok
第四步,整合所有程序,其中LED用来只是串口收到完整一帧数据。用串口助手测试ok。
第五步,跟主控板连接,实际应用,偶尔会出现风扇板LED不亮的问题<即未成功接收到指令>,且出现LED不亮后,不断电的情况下,无论怎么插拔串口无法让LED亮起<即永远的不正确运行了>。
该现象偶然出现,使用串口助手测试,永远好事,百思不得其解。于是先给主控板和风扇板单独供电,之后再连接通讯电缆,百试不爽,不会出现问题。看来问题出在初始化附近,猜测是不是初始化设计的代码不合适,开了串口就收到数据会出现死机问题。
于是将串口的初始化放在最后,等所有初始化完成后,放置一段LED闪烁程序,再来初始化串口,再实际联机,仍然会出现此问题。这个时候,真的摸不到头脑了,调试陷入僵局!怎么办,没办法,先放着去吧......
晚上洗澡的时候,把整个STM8的启动过程从加点开始系统串联一遍,突然脑子里意识到似乎少算了一个东西,这个东西因为STM32的缘故,而忽略了STM8与STM32的不同!!那就是bootloader。STM32的boot,需要改变两个管脚boot0,boot1,实现从boot启动还是用户程序启动,而STM8的boot,没有硬件的选择,工作过程是上电,检查是否有boot指令,有则进入boot,在一段时间内无,则进入用户程序,想到这里,和我们未初始化就死机好像能对应的上,如果上电进入了boot,而我们又实际没有进行boot操作,则STM8一直会再boot内出不来,进不去用户程序,就会体现处死机现象出来。好,明天继续试验,估计差不多就是它了!
ok,第二天来了之后,通过配置项把stm8的boot选项设置为bootloader disabled。重新上电,very good ,成功。
事了之后回顾排除过程,依然是经验主义导致思维禁锢,潜意识就认为这里不可能出问题,结果排查的时候总是让真正的元凶漏网。跳出编程和排错的环境后,整体把所有环节列出,再来排查,就很轻易找到问题!所以,除错的过程,第一个要对所有的部分持有怀疑精神,第二个不要埋头苦调,而是应该跳出局外思考全局。以此为戒
关键字:STM8s 死机问题 串口指令
引用地址:
STM8s使用中遇到的死机问题的排除
推荐阅读最新更新时间:2024-11-13 21:21
STM8S单片机怎样改变引脚实现最低功耗
STM8S无任何外围电路单片机CAP接104电容 复位接上拉电阻,其它引脚全部悬空,利用以下程序测试电流如下:(以前也用STM8L做过类似实验,情况也基本同下) 另外打开AWU 电流就变成了200uA 如果开了看门狗,就成了500uA ,这两个参数不是太好,不太适合带有周期唤醒的电池的应用 定时器和串口休眠后对功耗基本无影响 整机依然为4.7uA 单独一个引脚悬空会浪费4UA电流 如果将这个悬空的脚内部或外部上拉或下拉,电流都会变小 //GPIO_MODE_OUT_OD_LOW_SLOW 4.8uA //GPIO_MODE_IN_FL_NO_IT 390uA //GPIO_MODE_IN_PU_NO_IT 4.7uA
[单片机]
STM8S定时器操作
综述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的 架构 。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。 关于STM8S103手册的TIM简介 每个定时器的功能都有详细介绍,大家可以认真看下。 TIMx详细讲解 3.1 TIM1解析 TIM1_Prescaler :即预分
[单片机]
STM8S精确延时+LED闪烁
#include iostm8s105c4.h #define LED PC_ODR_ODR1 void GPIO_Init() { PG_DDR_DDR0=1; PG_CR1_C10=1; PG_CR2_C20=0; PG_ODR_ODR0=0; PC_DDR_DDR1=1; PC_CR1_C11=1; PC_CR2_C21=0; } /********** 微秒级延时程序*********/ void Delayus(void) { asm( nop ); asm(
[单片机]
STM8S——8位基本定时器(TIM4)
简介:该定时器由一个带可编程预分频器的8位自动重载的向上计数器所组成,它可以用来作为时基发生器,具有溢出中断功能。 主要功能: (1)8位向上计数的自动重载计数器; (2)3位可编程的预分配器(可在运行中修改),提供1、2、4、8、16、32、64、128这8种分频比例; (3)中断产生:更新中断(溢出,计数器初始化)。 代码实现: 1 /* Includes ------------------------------------------------------------------*/ 2 #include stm8s.h 3 4 /* Private define --------------
[单片机]
TM1638测试程序STM8S
//适用于STM8S003F3 //main.c 文件 //实验现象:刚开始上电时,所有数码管亮且显示0;按下按键其对应的数码管数字加一,对应的LED灯亮 #include stm8s.h #include tm1638.h unsigned char num ; //各个数码管显示的值 int main(void) { u8 i; init_TM1638(); //初始化TM1638 for(i=0;i 8;i++) Write_DATA(i 1,tab ); //初始化寄存器(所有数码管上电时均显示0) while(1) {
[单片机]
STM8S介绍(编程环境、烧录、芯片内容)
【1】我使用的开发板和烧录器 首先,我用的是STM8S003F3P6这款开发板,淘宝上就有了,5块钱以内吧 然后是烧录器,ST Link,大概20块钱以内吧 搜寻『STM8S 开发板』『ST Link』就可以找到了 我这边不会给出链接,我不是来推销的 另外,这边顺便给出烧录时需要接的线(图片) 总共需要4条线(3条?) 『3.3V』『SWIM』『GND』『RST』(也许RST不需要?) 为什么会这样认为?我一开始也是接4条,后来不小心RST没接,也能烧录。。 【2】编程环境 这边先给出IAR的链接(编程环境) https://pan.baidu.com/s/1GPdgTsoOzgZ5n6StFHTlrg 提取码:2t3
[单片机]
STM8S TIM2 输出PWM初始化函数
参考网上例程总结出初始化函数 #define TIM2_CLK 16000000 void timer2_Init(char channal, ulong hz,int pwm) { TIM2_ARRH = (TIM2_CLK/hz)/256; TIM2_ARRL = (TIM2_CLK/hz)%256; switch (channal) { case 1:{ TIM2_CCMR1 |= 0x70; TIM2_CCER1 |= 0x03; //通道1使能,低电平有效,配置为输出 TIM2_CCR1H = (((TIM2_CLK/hz)*pwm)/1000)/256;
[单片机]
STM8S低功耗处理
要低功耗设计,主要考虑几个方面: 1.外设的低功耗,不需要的外设模块,全部关闭。 2.GPIO的处理,不需要的IO最好做悬浮输入处理。 3.主时钟的处理,先降到最低内部LSI时钟,关闭其他不需要的时钟模块。 4.进入低功耗模式。 除了运行模式,可以采用以下三种低功耗模式:等待、主动停机、停机。 1)等待(Wait)模式:CPU停止工作,片上设备可以选择被关断,任意内部外部中断及复位均可唤醒,耗电2.4mA@24MHz,5v。 2)主动停机模式(Active Halt):保留一个定时唤醒单元AWU工作,CPU和片上设备全停止工作,AWU和外部中断及复位均可唤醒,耗电11uA - 1000uA,取决于片上稳压器(MVR还是LPVR)
[单片机]