【STC8】热启动&&串口指令下载

这篇具有很好参考价值的文章主要介绍了【STC8】热启动&&串口指令下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  在目标开发板没有装载自动下载电路的时候,往往需要冷启动,也就是需要手动开关电源,来达到单片机复位下载。当然还有一种方法是热启动,通过串口接收到自定义的指令后,软件执行复位下载。这就是本文介绍的内容。

材料

开发板:STC8A8K64S4A12开发板(用的是STC8A8K64D4库文件来编写程序,兼容的)

因为板载有CH340C了,所以我不用外接USB-TTL。

流程

keil5步骤

  1. 为了快速完成串口1的配置,我使用了自己编写的串口库。该库主要实现了串口1波特率的配置,其中包括预定义波特率和单片机运行频率,初始化函数会自动计算取值。

    【STC8】热启动&&串口指令下载

  2. 在串口1的中断中编写,接收到某个指令后,执行软件复位。这里我将收到的指令设置为0x7f。

    【STC8】热启动&&串口指令下载

  3. 在主程序中调用初始化程序后,可以将主循环中的注释行取消注释,使用串口发送数据来检查串口初始化配置是否正确。在测试成功后,需要再次将该行注释掉。

    【STC8】热启动&&串口指令下载

    完成后,编译没问题后,到下一步。

STC-ISP步骤

  1. 注意单片机运行频率设置。

    【STC8】热启动&&串口指令下载

  2. 配置自定义指令之类。还要注意选择下载文件。

    【STC8】热启动&&串口指令下载

代码

代码只有三个区块,我就在下面全部贴出来,方便验证。当然工程文件也会在文章末尾分享出来。

  • main.c
  • CK.c
  • CK.h
  • main.c
    #include <STC8A8K64D4.h>
    #include <CK.H>
    
    void main()
    {
    	CK_Init();
    	while(1)
    	{
    		//CK_SendIntX(123);
    	}
    }
    
  • CK.c
    #include <STC8A8K64D4.h>
    #include <CK.H>
    #include <stdio.H>
    #include "intrins.h"
    //配置工作环境
    #define CK_Bti 	115200    	//配置串口波特率
    #define	CK_FOSC  11059200	//单片机运行频率(默认:11.0592  (频率x10^6))
    #define CK_IntStrLen 20		//整型上限个数
    #define CK_FloatStrLen 20	//浮点型型上限个数(默认保留三位小数)
    
    #define CK_BRT  (65536 - CK_FOSC/ CK_Bti /4)
    
    bit CK_busy;			//繁忙标志
    char CK_rjs;			//接收缓冲计数
    char CK_ryjs;			//接收阅读计数
    char CK_buffer[16];		//接收缓冲
    
    int JS=0;
    
    //串口初始化
    void CK_Init()
    {
    	SCON=0x50;		//串口1控制寄存器			//串口1工作模式_模式1:可变波特率8位数据方式 and 允许串口接收数据
    	TMOD=0x00;		//定时器模式寄存器		//定时器/计数器1工作模式:16位自动重载模式
    	TL1=CK_BRT;		//定时器1计数寄存器(低位)
    	TH1=CK_BRT>>8;	//定时器1计数寄存器(高位)
    	TR1=1;			//定时器T1的运行控制位	//开始计数
    	AUXR=0x40;		//辅助寄存器1			//定时器1速度控制位_CPU时钟不分频分频(FOSC/1)
    	
    	ES=1;			//串口1中断开关			//打开
    	EA=1;			//中断总开关				//打开
    	
    	CK_rjs=0x00;  		
    	CK_ryjs=0x00;
    	CK_busy=0;
    }
    
    //发送字符串
    void CK_SendStr(char *p)
    {
    	while(*p)
    	{	
    		CK_SendByte(*p++);
    	}	
    }
    
    //发送字符串(自动换行)
    void CK_SendStrX(char *p)
    {
    	while(*p)
    	{	
    		CK_SendByte(*p++);
    	}
    	CK_SendStr("\r\n");
    }
    
    //发送整型
    void CK_SendInt(int num)
    {
    	char str[CK_IntStrLen];
    	sprintf(str,"%d",num);
    	CK_SendStr(str);	
    }
    
    //发送整型(自动换行)
    void CK_SendIntX(int num)
    {
    	char str[CK_IntStrLen];
    	sprintf(str,"%d",num);
    	CK_SendStrX(str);
    }
    
    //发送浮点型
    void CK_SendFloat(float num)
    {
    	char str[CK_FloatStrLen];
    	sprintf(str,"%.3f",num);
    	CK_SendStr(str);	
    }
    
    //发送浮点型(自动换行)
    void CK_SendFloatX(float num)
    {
    	char str[CK_FloatStrLen];
    	sprintf(str,"%.3f",num);
    	CK_SendStrX(str);
    }
    
    //发送字节
    void CK_SendByte(char Data)
    {
    	while (CK_busy);
    	CK_busy = 1;
    	SBUF = Data;
    }
    
    //串口1中断事件  分配寄存器组1
    void UartIsr() interrupt 4 using 1   
    {
    	//发送
    	if (TI)
    	{
    		TI = 0;
    		CK_busy = 0;
    	}
    	//接收
    	if (RI)
    	{
    		char Data;
    		RI = 0;
    		Data=SBUF;
    		CK_buffer[CK_rjs++] = Data;
    		//指令下载
    		if(Data==0x7f)
    		{
    			IAP_CONTR = 0x60;  //软件复位
    		}
    		//
    		CK_rjs&=0x0f;	//满16归0
    		//CK_SendIntX(JS++);		//发送整型(自动换行)
    	}
    }
    
    //电脑发送数据给单片机又发回给电脑
    void CK_ReRead()
    {
    	if (CK_ryjs!=CK_rjs)
    	{
    		CK_SendByte(CK_buffer[CK_ryjs++]);
    		CK_ryjs &= 0x0f;
    		
    	}
    }
    
    void CK_ReadChar()
    {
    	if (CK_ryjs!=CK_rjs)
    	{
    		CK_SendByte(CK_buffer[CK_ryjs++]);
    		//CK_SendIntX(JS++);		//发送整型(自动换行)
    		CK_ryjs &= 0x0f;	
    	}
    	
    }
    
  • CK.h
    /*
    	简单串口通信库
    	.H文件通常用于配置
    	.C文件通常用于编写函数
    
    	说明:该库只是简单的应用串口1通信,和定时器1作为波特率发生器。方便调整程序。
    	功能:串口打印
    	使用说明:1.配置串口波特率,配置单片机运行频率
    			 2.调用初始化函数
    			 3.调用功能函数
    	
    	层级:一级(为最底层无需在嵌套其他库)
    	标记:XY
    */
    //基础
    void CK_Init();					//串口1初始化
    void CK_SendByte(char Data);	//发送字节
    //功能(发送)
    void CK_SendInt(int num);		//发送整型
    void CK_SendIntX(int num);		//发送整型(自动换行)
    void CK_SendFloat(float num);	//发送浮点型
    void CK_SendFloatX(float num);	//发送浮点型(自动换行)
    void CK_SendStr(char *p);		//发送字符串
    void CK_SendStrX(char *p);		//发送字符串(自动换行)
    void CK_ReRead();					//电脑发送数据给单片机又发回给电脑
    //功能(接收)
    void CK_ReadChar();
    

最后

  本文仅介绍了利用串口进行简单热启动下载的方法。在实际的工程中,可能需要增加多字节识别等逻辑以增强稳定性,防止误判断等情况的发生。当然,这些只是一种思路,读者可以根据具体需求进行适当修改。

  链接:https://pan.baidu.com/s/1RXhOqAoJR-sZZc3Q4fbd8Q 提取码:lbs9文章来源地址https://www.toymoban.com/news/detail-458803.html

到了这里,关于【STC8】热启动&&串口指令下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机(STC8) -- 开发环境搭建(Keil C51)

    STC8H3K系列芯片概述 文章中所用的芯片选型为STC8H3K64S4,后续STC8案例均以该芯片展开 内核 • 超高速 8051 内核(1T),比传统 8051 约快 12 倍以上,指令代码完全兼容传统8051 • 21个中断源,4 级中断优先级 • 支持在线仿真 工作电压 • 1.9V~5.5V 工作温度 • -40℃~85℃ Flash 存储

    2024年01月25日
    浏览(52)
  • 【STC8A8K64D4开发板】第2-12讲:数码管显示

    学习目的 了解数码管分类、工作原理及驱动电路的设计。 掌握STC8A8K64D4系列单片机驱动8位共阴数码管的动态显示的软件设计。 数码管概述 数码管是一种常用的显示设备,他有着价格便宜、使用简单的特点,在各个领域被广泛的应用,如空调、电子万年历、冰箱等等。学习数

    2024年02月20日
    浏览(40)
  • STC15W104 8脚单片机串口下载程序

    单片机串口下载是一种常见的单片机程序下载方式,它通过串口线连接单片机的串口引脚和电脑的串口接口实现。下面是单片机串口下载的基本原理和操作方法: 确定下载模式:大多数单片机芯片都支持串口下载模式,需要在程序中设置下载模式。 连接串口:使用串口线连

    2024年02月13日
    浏览(45)
  • STC8学习 ——ADC 1

    注意:  uint8_t正常左移8位是0,但如果赋值给uint16_t就占uint16_t中高8位,要保留数据就要把八位数据左移8位后赋给16数据,继续赋给8位数据,结果就是0 注意:通过ADC采集数据并输出电压的原理是  电压和对应ADC端口采集结果的比值是恒定的 ADC第15通道采集的内部参考电压值

    2023年04月24日
    浏览(72)
  • STC8学习5 - 定时器

    定时器也可以做为计数器,其实他们本质上的原理是一样的,定时器是计数单片机内部的系统时钟,每1个或者12个时钟脉冲,就加一。计数器则是记录外部输入脉冲。 1. 定时器0有四种工作模式,这里使用的是定时器0的16位可重新装载模式,16位(0x0000~0xFFFF)即可以从0数到

    2024年02月06日
    浏览(42)
  • STC8比较器功能案例介绍

    📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》 📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定)上。 📑实验说明 🌿采用10K电位器,0 - 5V可调电压范围,可调端接到P37外部端口引

    2024年02月08日
    浏览(35)
  • 单片机STC8H入门

      STC8H系列单片机是不需要外部晶振和外部复位的单片机。在相同的工作频率下,STC8H系列单片机比传统的8051快约12倍,是宽电压/高速/高可靠/低功耗/强抗静电/较强干扰的新一代8051单片机。 用常用的C51版的keil安装,可以进入下面链接下载: https://download.csdn.net/download/wei

    2024年02月02日
    浏览(51)
  • 『STC8H8K64U』概述

            大家好,我是初尧.C。希望看完这篇文章对你能有所帮助,不足之处请指正~📝         本文由初尧.C 原创 CSDN首发 如需转载还请通知🚫         📌无端坠入凡生梦. 却惹三千烦恼丝📌         欢迎各位💘点赞+收藏+留言💖         系列专栏― STC8H8K64U🎨     

    2024年02月05日
    浏览(42)
  • STC8H_PWM制作呼吸灯

    PWM边沿对齐模式 寄存器描述 输出使能寄存器(PWMx_ENO) 功能实现说明: 通过定时器递增或递减来设置PWM的占空比调节亮度,最终显示出呼吸灯的效果 代码部分 PWM程序模块 主函数部分 中断部分

    2024年02月12日
    浏览(44)
  • STC8h1k28六个基本实验

    实验内容: 项目1: 参考原理图,设计1位闪烁灯程序,每次亮、灭时长均为500ms。 项目2: 参考原理图,设计三色流转灯程序,GRB三种颜色的LED轮番点亮,每次只亮一盏,每次点亮时长为500ms。 原理图: 实验原理: (共阳)LED负极接单片机IO口(P00P01P02),当IO口输出低电

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包