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

news2024/11/16 11:38:33

前言

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

材料

开发板: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.coloradmin.cn/o/547145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解神经网络的数学原理(四)多层感知机(MLP)与二叉空间分割树(BSP Tree)

概述 最近发现了一个传统算法&#xff0c;非常适合描述多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09;的模型逻辑&#xff0c;其算法逻辑也非常清晰简单&#xff0c;所以在这里再对比一下&#xff0c;方便大家更容易理解多层感知机的内容&#xff…

手写Docker之认识NameSpace、CGroups、Union file system

关于NameSpace Linux NameSpace主要是kernel中用于隔离系统资源的功能&#xff0c;而docker就是基于NameSpace去隔离系统资源达到容器化的效果 以下案例均以该代码进行举例&#xff1a; package mainimport ("fmt""os""os/exec""syscall&…

【C++】mapsetmultimapmultiset使用说明

文章目录 关联式容器键值对pair的定义(键值对) 树形结构的关联式容器Set -> 排序去重Set的文档介绍Set的使用:set的构造set的迭代器set的容量set修改操作API接口总结: multiset -> 排序 可重复lower_bound&&upper_bound mapmap的模板参数说明map的构造map的迭代…

毕业季,各互联网大厂急缺这类 Python 人才!

又快到了应届毕业生找工作的季节了&#xff0c;一大波大厂高薪岗位陆续开放&#xff0c;想拿 Offer、升职加薪的你准备得怎么样了&#xff1f; 今年的招聘力度可以说是近几年最大&#xff0c;比如字节跳动旗下的大力教育&#xff0c;高调宣布&#xff1a;“未来 4 个月&#x…

最新整理Java面试八股文,大厂必备神器

在看这篇文章之前&#xff0c;我想我们需要先搞明白八股文是什么&#xff1f;&#xff1f;&#xff1f; 明清科举考试的一种文体&#xff0c;也称制义、制艺、时文、八比文。八股文章就四书五经取题&#xff0c;内容必须用古人的语气&#xff0c;绝对不允许自由发挥&#xff0…

记录--axios和loading不得不说的故事

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 loading的展示和取消可以说是每个前端对接口的时候都要关心的一个问题。这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loading展示与取消的逻辑。 首先在我们平时处理业务的时候loading一般…

OpenAI 重磅发布 ChatGPT iOS 客户端!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 今天凌晨&#xff0c;OpenAI 正式发布了 iOS 客户端&#xff01; 这代表你可以直接在 iPhone 和 iPad 上直接使用 ChatGPT 进行聊天了。 该客户端基于 Whisper 开源模型&#xff0c;集成了…

用排列组合来编码通信(七)——《我的5/4张牌的预言》

早点关注我&#xff0c;精彩不错过&#xff01; 从《5张牌的预言》开始&#xff0c;前面介绍了3个拓展思路&#xff0c;分别从引入额外信息解放选牌&#xff08;Eigens value&#xff09;&#xff0c;引入正反信息来编码&#xff08;ups and downs&#xff09;&#xff0c;继续…

从零开始学架构——可扩展架构模式

可扩展架构模式的基本思想和模式 软件系统与硬件和建筑系统最大的差异在于软件是可扩展的&#xff0c;一个硬件生产出来后就不会再进行改变、一个建筑完工后也不会再改变其整体结构 例如&#xff0c;一颗 CPU 生产出来后装到一台 PC 机上&#xff0c;不会再返回工厂进行加工以…

从零玩转前后端加解密之SM2-sm2

title: 从零玩转前后端加解密之SM2 date: 2022-08-21 19:42:00.907 updated: 2023-03-30 13:28:48.866 url: https://www.yby6.com/archives/sm2 categories: - 加密算法 - 从零玩转系列 tags: - 加密算法 - sm2 前言 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥…

工业互联网UWB定位系统源码,支持自定义开发

工厂人员定位系统&#xff0c;采用UWB定位技术&#xff0c;通过在厂区内部署一定数量的定位基站&#xff0c;以及为人员、车辆、物资佩戴标签卡的形式&#xff0c;实时获取人员精确位置&#xff0c;精度高达10cm。 文末获取联系 工厂人员定位系统可实现物资/车辆实时定位&#…

不同厂家对讲机耳塞耳挂/领夹型988对讲机如何写频改频点/频率能互相通信

988型号都是很多厂家代工出来的,代工出来默认的频点都不一样,有可能买回来的2个不同厂家生产的对讲机,这样它们要能通讯,必须要同频点才能互通,它一般出厂设定16个频道,长按+和-键来切换频道。 需要用到typeC 的写频线,其实是用CH430芯片的usb写频线,可以找厂家要写频线…

编程语言中,循环变量通常都用 i?你知道为什么吗?

01 前天&#xff0c;我在朋友圈发了一个问题&#xff1a; 为什么编程中&#xff0c;循环变量通常都是用 i ? 没想到&#xff0c;回复的人这么多&#xff01;要连翻好几页。 这个问题&#xff0c;有 2/3 的人回答正确&#xff0c;有少部分人知道&#xff0c;但是不太确定。 习惯…

Hadoop基础学习---2、Hadoop概述

1、Hadoop概述 1.1 Hadoop是什么&#xff1f; 1、Hadoop是一个又Apache基金会所开发的分布式系统基础架构。 2、主要解决海量数据的存储和海量数据的分析计算。 3、广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈。 1.2 Hadoop 优势&#xff08;4高…

六级备考28天|CET-6|翻译井冈山|2021年12月|8:20~9:40+ ~10:17

目录 四级翻译5篇必练真题 六级翻译5篇必练真题 井冈山 四级翻译5篇必练真题 ①2023年3月一卷①自驾游 ②2022年 12月一卷③立秋 ③2022年6月一卷①拔苗助长 ④2021年 12月一卷②大运河 ⑤2021年6月一卷③普洱茶 六级翻译5篇必练真题 ①2023年3月一卷②郑和下西洋 ②2022年…

微服务多模块:Springboot+Security+Redis+Gateway+OpenFeign+Nacos+JWT (附源码)仅需一招,520彻底拿捏你

可能有些人会觉得这篇似曾相识&#xff0c;没错&#xff0c;这篇是由原文章进行二次开发的。 前阵子有些事情&#xff0c;但最近看到评论区说原文章最后实现的是单模块的验证&#xff0c;由于过去太久也懒得验证&#xff0c;所以重新写了一个完整的可以跑得动的一个。 OK&#…

nvidia-smi 失效解决

服务器重启后&#xff0c;跑模型发现&#xff1a; RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_locationtorch.device(cpu) to ma…

Linux常用命令——hping3命令

在线Linux命令查询工具 hping3 测试网络及主机的安全 补充说明 hping是用于生成和解析TCPIP协议数据包的开源工具。创作者是Salvatore Sanfilippo。目前最新版是hping3&#xff0c;支持使用tcl脚本自动化地调用其API。hping是安全审计、防火墙测试等工作的标配工具。hping优…

【开源项目】Nepxion Aquarius实现分布式锁、缓存、ID生成、限速的源码解读

项目地址 项目地址 https://toscode.gitee.com/nepxion/Aquarius 项目介绍 Nepxion Aquarius是一款基于Redis Zookeeper的分布式应用组件集合&#xff0c;包含分布式锁&#xff0c;缓存&#xff0c;ID生成器&#xff0c;限速限流器。它采用Nepxion Matrix AOP框架进行切面架构…

天工开物 #6 Git 分支管理与版本发布

Git 版本管理系统由 Linux 的作者 Linus Torvalds 于 2005 年创造&#xff0c;至今不到二十年。 起初&#xff0c;Git 用于 Linux Kernel 的协同开发&#xff0c;用于替代不再提供免费许可的 BitKeeper 软件。随后&#xff0c;这一提供轻量级分支的分布式版本管理系统得到了开源…