下面介绍不掉电载程序的实现过程。先要了解一点基础知识。单片机的复位,下载流等等。。。
首先说一下复位。STC89C52有的复位有两种,一种是上电复位,也就是冷启动,复位后检测串口那里有没有下载流,有的话跑去下载程序那里。还有一种是平时的按键复位,高电平有效那种的,不检测是否有下载流。
下载流是什么?就是串口发送给单片机要烧写程序的信息。STC89C52的下载流是0x7F,连续12个好像(官方公布是大于16 )。如果我们上位机点下载,它就通过一直发送0x7F给单片机。如果这是有上电复位,就烧写程序进去单片机。
我们的程序里面就是要用到这些,再介绍一下基本思路。我们需要单片机正常运行过程中检测是否有下载流(0x7F),如果有下载流就跳进上电复位。只要实现了这个功能,就是实现了不掉电下载程序了~~~检测下载流不难,我这里使用的是串口中断,中断里面检测是否有下载流信息,有的话就跳进上电复位那里。主要是跳到上电复位,怎么跳?上电复位在哪??
跳转方面,有学过微机的同学就能好理解。只要修改 PC 指针就行了,让它指向上电复位那段程序。还有一个问题是,上电复位那段程序在哪里?这个要找芯片数据手册了。官方公布的是0xEC00, 但是我们不是直接跳转过去的, 而是通过使能IAP, 也就是设置IAP控制寄存器。官方公布的IAP控制寄存器地址是0xE7, 设置成0x60就使能了IAP. 来到这里相信同学们都理解了,可以着手写一下程序了。
把必要的东西弄上。文件包含,宏定义,寄存器声明等等。
#include
#define IAP_ENABLE 0x60 //IAP允许
sfr IAP_CNTR = 0xE7; //IAP控制寄存器
void mian(void)
{
UART_Init(); //串口初始化
while(1) //死循环,等待串口中断
{
}
}
void UART_Init()
{
TMOD|=0x20; //定时器1提供串口波特率
TH1=0xf3; //波特率2400, 晶振为12M
TL1=0xf3; //波特率2400, 晶振为12M
EA=1; //打开总中断
TR1=1; //定时器1开始计数
ES=1; //允许串口中断
SCON=0x50; //方式0, 允许串口接收
}
void UART_IRQHandler(void)interrupt 4
{
unsigned char rev; //临时变量, 保存SBUF
if(RI) //检查是否接收到数据
{
RI = 0; //软件清除接受标志位
rev = SBUF; //读取接受缓冲区
if(0x7F == rev) //判断是否为下载流信息
{
IAP_CNTR = IAP_ENABLE; //允许IAP, 也就是直接进入下载程序
}
}
}
(编译通过,下载程序,测试能否在线下载。成功!!!!!!!!!!!!那是感动啊~~~~
)
有了上面程序的话,以后下载程序就直接打开上位机,也就是STC_ISP那个软件,选择好对应的.hex文件,点击下载,就开始下载程序了。以后再也不用先关电源,再上电了下载,那是方便啊(事实证明,我已经对频繁对电源开关,感觉非常繁琐了)。多年来的梦想啊(虽然接触51,貌似不到1年。。。),让我曾经一度非常妒忌AT的单片机,因为它支持在线下载程序。。。
关键字:STC单片机 IAP 不掉电下载
引用地址:
STC单片机的IAP 实现不掉电下载程序
推荐阅读最新更新时间:2024-03-16 14:37
STM32F103CB IAP+APP BIN文件合并烧写
J-Flash工具 选择第一个文件 Merge第二个文件 设置起始地址
[单片机]
STM32F030C6 IAP功能APP中断向量表重映射
1、IAP中断向量表重映射 1.1、Coretext-M3与Coretext-M4: SCB- VTOR = 0X08000000|0X20000; __set_PRIMASK(0); 在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码, M3/M4的这个VTOR寄存器一开始时它的值也是为默认值0,只不过在程序运行到SystemInit()函数后,在代码中明确对其进行了修改 1.2、Coretext-M0: __enable_irq(); memcpy((void*)
[单片机]
ARM片外Flash存储器IAP解决办法
以 ARM 芯片为处理器核的 嵌入式 应用系统,以其小体积、低功耗、低成本、高性能、丰富的片内资源以及对操作系统的广泛支持,得到了人们越来越多的青睐。在应用编程IAP(InAppl ic atAiONProgram)就是这样的自修改程序。它先在RAM存储器中写人数据值,然后使PC指向该存储段,把该段作为程序段来执行。很多ARM7芯片自带IAP处理器,应用其自带的IAP处理器可以方便地对其片内集成的Flash存储器进行在应用编程,但几乎所有的ARM核芯片均不支持片外IAP处理,因为片外Flash存储器是用户选型的,芯片生产厂家无法先知先觉,而不同Flash存储器其编程时序也不尽相同,导致芯片生产厂家无法提供通用的IAP代码。那么
[电源管理]
STC单片机内置ADC的使用方法
STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转换过程需要17个机器周期。通过对相关功能寄存器的适当配置,就可以控制其工作。下面就对相关功能寄存器进行介绍。 A/D转换寄存器总表: 寄存器 地址 名称 7 6 5 4 3 2 1 0 初始初
[单片机]
在PIC18单片机中使用BootLoader在线升级
引 言 PIC单片机的BootLoader属于需要自己写程序的那种,可以根据自己的需要写出各种功能的BootLoader程序来。目前,比较常见的BootLoader程序有Microchip公司的C18版本和著名的PICC编译器厂商HI-TECH公司(以下简称HI-TECH)的PICC18版本。它们的相似之处在于都占用了系统的0x00~0x1FF的程序空间。Microchip的版本是用纯汇编写的,而HI-TECH的版本是用C语言编写的。 在PIC系列单片机中,只有PIC18系列和PIC16F87X系列的单片机才有IAP功能,才能够使用BootLoader功能。下面只介绍PIC18的BootLoader,PIC16F87X的
[单片机]
STM32F103代码远程升级(二)基于串口IAP的简单实现
一、确定需要解决的问题 这里我就记录一下我的学习过程。 首先确定几个问题: 实现IAP编程需要着手编写两个程序,一个是Bootloader程序,一个是APP应用程序。 需要对STM32的Flash进行擦除和写入操作。 需要根据APP应用程序开始地址设置中断向量表的偏移 需要改变代码存放的地址空间(因为BootLoader要存放在0x08000000处,用户程序要存放在0x08005000处,而默认的代码存放的地址空间为0x08000000)。 在下载完更新文件之后需要进行PC指针的强制跳转,跳转时需要做什么 串口接收的用户代码数据是什么样的代码数据,是一种什么样的文件,该如何得到该格式文件 然后我开始一个一个解决问题。 二
[单片机]
ISP和IAP的区别
ISP:in system programming IAP:in applicatin programming 但两者的操作方式,结果和应用场合有什么区别呢?继续看你就会明白了。 什么是ISP: 用写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫 在系统编程 ,即不用脱离系统; 什么是IAP: 在应用编程,有芯片本身(或通过外围的芯片)可以通过一系列操作将code写入,比如一款支持Iap的单片机,内分3个程序区,1作引导程序区,2作运行程序区,3作下载区,芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验
[单片机]
STM32 IAP升级遇到的问题总结
一,串口通信问题 1,串口通信两端的TTL电平要一致,看选用的芯片,要么都是3.3V要么都是5V。。当两端电平不一致时通常是收不到数据的。。当检测程序等都没有问题但是依然收不到数据时,考虑检测一下两端的电平是否一致。。可用 示波器 查看收发数据时的电平 2,在写IAP是使用的官方的库函数,结果串口一直收不到正确的数据。不管我发什么,收到的都是0x58或者0xF6,而且我发5个字节只能收到2个。。确定自己的程序逻辑没问题,然后怀疑是使用的库函数有问题。使用beyond compare挨着对照了一下以前写过的正确的程序。。发现系统初始化时外部晶振没有改。。在SystemInit();时就是为了/* 配置系统时钟为168M 使用
[单片机]