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

news/2024/5/15 11:34:16/文章来源:https://blog.csdn.net/m0_60313295/article/details/130779836

前言

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

材料

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

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

流程

keil5步骤

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

STC-ISP步骤

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

    在这里插入图片描述

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

    在这里插入图片描述

代码

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

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_492594.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIT6.824 lecture5上课笔记(涉及到Lab2A)- Go threads and raft

总结&#xff1a;本节课讲解了一些会在lab2中使用到的go的多线程技巧&#xff0c;会给一些简单的demo&#xff0c;lab2中可能会借鉴这些demo。 详细的Lab2 raft算法实现源码&#xff0c;请参考我的个人仓库&#xff08;记得点颗星星&#xff09;, 配合readme食用更佳。 MIT6.…

【Linux升级之路】3_Linux进程概念

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux升级之路】 ✒️✒️本篇内容&#xff1a;认识冯诺依曼系统&#xff0c;操作系统概念与定位&#xff0c;深入理解进程概念&#xff08;了解PCB&…

推荐一款C端的低代码产品

目录 写在前面 低代码平台 平台怎么选 各平台区别 为什么选它 写在前面 大家都知道低代码这个叫法是从B端叫起来的&#xff0c;也就是说不管是业务人员还是开发人员&#xff0c;都是企业内部使用。那么有没有C端的&#xff0c;且免费使用的低代码产品呢&#xff1f; 低代码…

若依源码解析:DataScopeAspect实现数据范围的控制

文章目录 源代码使用场景界面操作SysDeptServiceImplSysUserServiceImplSysUserMapperDataScope定义 代码解析Aspect和Component不同的数据权限类型Before通知处理数据范围的方法 源代码 Aspect Component public class DataScopeAspect {/*** 全部数据权限*/public static fi…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行开发的过程。config&#xff1a;主要用来存储配置文件&#…

【学习版】WeDataSphere组件容器化部署实战

WeDataSphere组件容器化部署文档 WeDataSphere是微众银行的大数据开发平台。目前为让用户能够快速体验WeDataSphere所有组件&#xff0c;我们提供一个使用Docker构建的镜像包&#xff0c;里面包括基础组件Hadoop, Spark, Hive, Flink, MySQL。WeDataSphere的组件有DSS&#xff…

【动态规划专栏】--基础-- 动态规划经典题型

目录 动态规划 动态规划思维&#xff08;基础&#xff09; 状态表示&#xff08;最重要&#xff09; 状态转移方程&#xff08;最难&#xff09; 初始化&#xff08;细节&#xff09; 填表顺序&#xff08;细节&#xff09; 返回值&#xff08;结果&#xff09; 1、第 …

[山海关crypto 训练营 day17]

[HNCTF 2022 WEEK3]pnearq 题目代码和数据 from Crypto.Util.number import * from gmpy2 import next_prime from flag import flagp getPrime(1024) q next_prime(p) n p*q e 0x10001 c pow(bytes_to_long(flag), e, n) print(f"n {n}") print(f"c {…

代理、正向代理与反向代理

一、代理 1.1 什么是代理 代理也被叫做网络代理&#xff0c;是一种比较特殊的网络服务&#xff0c;允许一个终端&#xff08;通常指客户端&#xff09;通过这个服务与另一个终端&#xff08;通常指服务器端&#xff09;进行非直接的连接。例如&#xff1a;一些网关、路由器等…

队列的实现(附含两道经典例题)

&#x1f349;文章主页&#xff1a;阿博历练记 &#x1f4d6;文章专栏&#xff1a;数据结构与算法 &#x1f68d;代码仓库&#xff1a;阿博编程日记 &#x1f365;欢迎关注&#xff1a;欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f33e;前言&#x1f3ac;队列&…

[web安全原理分析]-XXE漏洞入门

前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞&#xff0c;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实体的加载&#xff0c;导致可加载恶意外部文件&#xff0c;造成文件读取、命令执行、内网端口扫描、攻击内网网站、…

国内IEEEXplore访问加速(adblock)

访问IEEEXplore&#xff0c;需要加载一个网页需要等好久&#xff0c;然后才出来&#xff0c;就很奇怪&#xff0c;查到网上有同样这个问题 感谢原博主&#xff1a;ieeexplore加载慢的解决办法 核心原因&#xff1a; 国内无法访问地址&#xff1a; https://cdn.jwplayer.com/…

Redis数据结构——QuickList、SkipList、RedisObjective

承接上文&#xff0c;本文主要介绍QuickList、SkipList、RedisObjective 四、 Redis数据结构-QuickList 问题1&#xff1a;ZipList虽然节省内存&#xff0c;但申请内存必须是连续空间&#xff0c;如果内存占用较多&#xff0c;申请内存效率很低。怎么办&#xff1f; ​ 答&a…

C++入门篇---(命名空间、缺省参数、以及输入、输出)

前言 c 我来了,恭喜牛牛解锁新世界.开启c的学习之旅. &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解C…

pg事务:子事务

什么是子事务&#xff1f; 一般事务只能整体提交或回滚&#xff0c;而子事务允许部分事务回滚。 SAVEPOINT p1 在事务里面打上保存点标记。不能直接提交子事务&#xff0c;子事务也是通过事务的提交而提交。不过可以通过ROLLBACK TO SAVEPOINT p1回滚到该保存点。 子事务在大…

【场景方案】如何去设计并二次封装一个好用的axios,给你提供一个好的参考(1.0版)

文章目录 前言文件结构建议封装的文件结构接口管理文件 二次封装axios的初始配置initutilswebConfig 再封一层环境配置使用 前言 以下演示基于vue3与element-plus 文件结构建议 封装的文件结构 把二次封装axios所有有关的代码全部放在request文件夹中&#xff0c;其中init.js…

【TypeScript】TS中type和interface在类型声明时的区别

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3+vite+typeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免费领取 …

南京邮电大学算法与设计实验二:贪心算法(最全最新,与题目要求一致)

三、实验原理及内容 实验原理&#xff1a; 1、用贪心法实现求两序列的一般背包问题。要求掌握贪心法思想在实际中的应用&#xff0c;分析一般背包的问题特征&#xff0c;选择算法策略并设计具体算法&#xff0c;编程实现贪心选择策略的比较&#xff0c;并输出最优解和最优解值。…

机器学习项目实战-能源利用率 Part-4(模型构建)

博主前期相关的博客可见下&#xff1a; 机器学习项目实战-能源利用率 Part-1&#xff08;数据清洗&#xff09; 机器学习项目实战-能源利用率 Part-2&#xff08;探索性数据分析&#xff09; 机器学习项目实战-能源利用率 Part-3&#xff08;特征工程与特征筛选&#xff09; 这…

【JVM】6. 堆

文章目录 6.1. 堆&#xff08;Heap&#xff09;的核心概述6.1.1. 堆内存细分6.1.2. 堆空间内部结构&#xff08;JDK7&#xff09;6.1.3. 堆空间内部结构&#xff08;JDK8&#xff09; 6.2. 设置堆内存大小与OOM6.2.1. 堆空间大小的设置6.2.2. OutOfMemory举例 6.3. 年轻代与老年…