资讯详情

单片机如何从上电复位执行到main函数?

如何从上电复位到执行单片机?main函数?

从事嵌入式开发的合作伙伴可能会考虑一个问题。我们通常使用芯片制造商提供的驱动库和初始化文件,直接从main函数初始写程序,系统上电后如何引导程序?main函数执行呢?还有,系统上电后RAM数据是随机的,那么如何实现定义的全球变量的初始值呢?

接下来,我将带来这两个问题Cortex-M以架构为例,采用IAR EWARM作为编译工具链,从系统上电后执行的第一个代码开始,梳理系统的启动过程,了解编译器在此期间所做的工作。其他工具链,如Keil和GCC在系统初始化过程中所做的工作也是相似的,但详细的实现是不同的。

1、启动文件

芯片制造商提供的启动文件通常用汇编语言编写,少数用C语言编写。启动文件中至少有两个本地内容:

1、向量表

2.默认中断和异常处理程序

向量表实际上是一个放置在存储器零地址的数组,每个元素存储每个中断或异常处理程序的入口地址。STM32F107芯片基于IAR以工具启动文件为例:

文件的开头定义了一个名字__vector_table全局符号,DATA作用是将数据区域定义为代码段的向量表。使用数据区的内容DCD除了第一个,指令定义的32位宽度常量sfe(CSTACK)比较特殊以为,其他的常量都是异常和中断效劳程序的地址(在编译时函数名会被替换成函数的入口地址)。sfe(CSTACK)是IAR汇编器段操作用于获取段(section)在这里完成地址的意图是什么?

事实上,这是获取堆栈基地址的操作。IAR链接器脚本(*.icf)文件中对堆栈的定义实际上是定义为CSTACK”的空闲块(block),如下图所示的脚本命令所示。所谓块,就是保留一个不间断的地址空间作为堆叠或堆叠。当然,块也可以用于内容,比如管理段,但不在今天的讨论范围内。

我们知道Cortex-M结构的堆栈模型是全减栈,堆栈从高地址增长到低地址,所以堆栈的基地址是CSTACK完成地址。

栈基址是向量表的第一个元素Cortex-M架构定义。系统上电后,硬件自动从向量表中获取,并设置主堆栈指针MSP,不像别人ARM架构、堆栈指针必须通过软件设置。

向量表中的第二个元素是复位异常(Reset_Handler)的入口地址。系统上电后,硬件自动从__vector_table 读取4的位置,并从读取的地址开始执行。系统上电后CPU第一的第一条是Reset_Handler函数的第一句。

上面的THUMB命令表示下一个代码使用THUMB模式(Cortex-M只支持Thumb-2指令集);SECTION用来定义定义一段.ResetHandler段类型为代码(CODE);REODER指示用给定的名称打开新段;ROOT当段内的符号未引用指示链接器,链接器不能丢弃这一段。

PUBWEAK这是一个弱定义。如果用户在其他位置编写中断处理函数,并在连接过程中实际链接用户编写,则将忽略用汇编在启动文件中编写的服务函数。在启动文件中编写所有异常和中断服务函数的原因是为了防止用户在不编写服务函数的情况下打开和触发中断,导致系统不确定性。

2.系统初始化过程

在EWARM的工程Options > Debugger > Setup中将“Run to取消检查,以便在进入调试后停止第一个代码的位置:

进入调试后,启动文件将停止Reset_Handler函数第一条汇编指令位置:

此时,通过寄存器观察窗口查看SP的值为0x20009820。通过链接生成map文件,查看CSTACK地址范围,0x20009820正好是CSTACK完成地址MSP,C代码可以运行。

ystemInit函数是芯片制造商的基础ARM的CMSIS规范提供的系统基础配置函数、时钟系统和向量表重定位等。LDR是伪指令,它会SystemInit将函数的地址加载到寄存器R实际上是通过的PC偏移寻址获取SystemInit的地址。

从上图可以发现问题,可以在反汇编窗口观察到SystemInit的地址是0x20000150,但加载到R0寄存器后是0x2000跳转指令更新,2000151PC时,须要置PC的LSB为1,以表示THUMB模式,由于Cortex-M不支持ARM模式,因此LSB总是1。

执行芯片制造商提供的执行SystemInit函数后,跳转到__iar_program_start,这是IAR编译器提供的初始代码入口。

__iar_program_start两个函数将首先执行:__iar_init_core和__iar_init_vfp,能完成一些CPU和FPU在某些方面,相关的初始化操作ARM这两个函数运行时,库中会有这两个函数,用户也可以重写这两个函数来实现一些相关操作。

之后,跳转到__cmain执行函数__cmain中调用一个__low_level_init函数,专门用于为用户编写初始初始化操作,在全球变量初始化之前执行,例如__low_level_init中初始化SDRAM,这样就可以定义整体变量SDRAM中使用。

__low_level_init可以在任何C文件中编写,并注意其返回值。如果返回0,将跳过变量初始化操作,通常返回1。

3.全局变量的初始化

此后进入到__iar_data_init3函数,在这里会完成所有具有初始值的全局/静态变量的赋值,以及零初始化全局/静态变量的清零操作,分别调用__iar_copy_init3和__iar_zero_init3,将保存在ROM链接器生成的变量的初始值复制到变量地址。注意,新的EWARM版本默认变量初始化操作可能会采用压缩算法,实际变量初始化调用的函数可能有区别。

在全局变量初始化之前,通过watch窗口可以看到变量值是随机数。

在__iar_data_init执行完成后,所有变量的初始赋值都完成了。

在__cmain函数结束时,跳转到用户main最终执行初始用户代码的函数。

了解编译器提供的初始化过程和处理器架构,我们可以根据自己的需要定制系统的初始化。

例如,进入__iar_program_start在此之前,您可以执行必要的硬件初始化操作,可以用汇编或C编写。它还可以手动控制变量的初始化操作,实现变量的初始化。甚至,根本没有IAR从复位序列引导到编译器提供的初始操作main函数那也是能够的。

硬件开发工具:

Altium Designer 17.1

编程开发工具:

KEIL 4

程序下载工具:

STC-ISP

串口驱动:

CH341SER

介绍单片机最小系统

单片机(Microcontrollers)是集成电路芯片,具有数据处理能力的中央处理器采用超大规模集成电路技术CPU、随机存储器RAM、只读存储器ROM、多种I/O开口和中断系统、定时器/计数器等功能(也可能包括显示驱动电路、脉宽调制电路、模拟多路转换器A/D转换器等电路)集成到一个小而完美的微型计算机系统型计算机系统中,广泛应用于工业控制领域。从20世纪80年代开始,从当时的从当时的单片机到300台M高速单片机。从20世纪80年代开始,从当时的从当时的单片机到300台M高速单片机。本文单片机特别指51单片机,详细芯片型号为STC89C52RC。需注意STC89C51,STC89C52,AT89C51,AT89C52是51单片机的详细芯片型号。

最小系统组成:

51单片机最小系统:单片机、复位电路、晶振(时钟)电路

最小系统使用的引脚

1.主电源引脚(2根)

VCC:输写电源,接+5V电源

GND:接地线

2.外部晶振引脚(2根)

XTAL1:片内振荡电路的输写端

XTAL2:片内振荡电路输出端

3.控制引脚(4根)

RST/VPP:复位引脚

电源

设计中使用的电源接口是DC 5V。USB座位可以找到手机充电口,电脑USB端取电。连接线路后,按下电源开关,单片机即可初始工作。

输写电源及启动按钮

 DC 5V连接线

复位电路

复位电路

在电路图中,电容器的大小是10uf,电阻大小为10k。

在5V正常工作的51单片机小于1.5V电压信号为低电平信号,大于1.5V电压信号为高电平信号。可计算0电容充电到电源电压.7倍,即电容器两端的电压为3倍.5V、电阻两端电压为1.5V必要时间约为T=RC=10K*10UF=0.1S。

也就是说,在单片机上电启动0.1S电容器两端的电压从0-3不等.5V不断增加,此时10K电阻两端的电压为5-1.5V不断降低(串联电路电压之和为总电压)RST引脚接管的电压为5V-1.5V从高电平到低电平的过程。

单片机RST引脚高电平有效,即复位;低电平无效,即单片机正常工作。所以在启动0.1S内部,单片机系统RST引脚接管时间为0.1S高电平信号左右,实现自动复位。

单片机启动0.1S之后,电容C两端的电压连续充电为5V,这是时候10K电阻两端的电压接近0V,RST在低电平下,系统正常工作。按下按钮时,开关导通。此时,电容器的两端形成一个电路,电容器短路。因此,在按下按钮的过程中,电容器最初释放之前充电的电量。随着时间的推移,电容的电压为0.1S内,从5V释放到1.5V,甚至更小。根据串联电路的电压,此时10K电阻两端的电压为3.5V,甚至更大,所以RST将引脚接管到高电平。自动复位单片机系统。

晶振电路

晶振电路

晶振根本概念晶振全名叫晶体振荡器,每个单片机系统里都有晶振,晶振是由石英晶体经过加工并镀上电极而做成的,主要的特性就是通电后会产生机械震荡,能够给单片机提供稳定的时钟源,晶振提供时钟频次越高,单片机的运行速度也就越快。晶振用一种能把电能和机械能互相转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。

晶振起振后,产生的振动信号会通过XTAL1引脚,依次经过振荡器和时钟发生器的处理,得到机器周期信号,作为指令操作的依据。51单片机常用的晶振是12M和11.0592M

元器件清单及样机焊接

元器件清单

CommentDescriptionDesignatorFootprintLibRefQuantity

30P陶瓷电容C2, C3CAP-2.54Cap2

10uF/16V直插电解电容CE1CAP 1.5*4*8CE1

CON9直插排阻10KJ0R SIP9-2.54CON91

CON22 Pin排针J4HDR2.54-LI-2PCON21

HEADER 44 Pin排针JP3, P6HDR2.54-LI-4PHEADER 42

红色直插5mm LEDLED1, LED2LED 5MM-RLED-5MM2

CON84 Pin排针P0, P1, P2, P3HDR2.54-LI-8PCON84

KEY自锁按键POWER_BUTTONSW-8X8X8HEADER 3X21

DC 5V电源DC 5V插座PW_5VDC05HEADER 31

10K电阻R1AXIAL0.3RES21

2K电阻R2, R3AXIAL0.3RES22

SW-PB轻触按键S1SW-0606SW-PB1

STC89C52RC8-Bit Microcontroller with 4K Flash ROMU1DIP40AT89C511

11.0592M晶振Y1OSC HC-49SCRYSTAL1

假如不想直接焊芯片到板子,能够买个下图黑色的紧锁座。规格选DIP40

PCB板制作

方法1:学校实验室常用的DIY腐蚀电路板制作(略)

方法2:外发给专业的PCB工厂。举荐嘉立创https://www.jlc.com/#

可代发,须要请私信

空板正反面:

空板

焊接注意事项

直插电解电容,和LED灯是有正负极之分的。

电解电容正负极分辨:

1.看实物套管

2.看引脚长短:

电解电容正极引线比较长、负极稍短

LED灯正负极分辨:

1.引脚长短也能够看出来,发光二极管的正负极,引脚长的为正极,短的为负极。

2.万用表打到二极管档,分别短接LED灯引脚,假如亮,红表笔接的是正极。

最终实物:

焊接好的实物如图

程序烧录及测试

测试用的51单片机型号是STC89C52RC,是国产品牌宏晶科技STC量产的8051单片机。

测试代码

#include

#include

//数据类型定义

typedef unsigned char uchar;

typedef unsigned int uint;

uchar flag1s = 0;

uint one_sec_flag = 0;

sbit TEST_LED=P1^0;

void main()

{

EA=1;//开总中断

TMOD=0X01;//T0的工作模式为模式1

TH0=0X4C;

TL0=0X00;//11.0592M晶振 50ms定时初值

ET0=1; //允许定时器1中断

TR0=1;//启动定时器0

while(1)

{

if(flag1s)//一秒刷新一次

{

TEST_LED = 0;

}else{

TEST_LED = 1;

}

}

}

void Timer0() interrupt 1

{

TH0=0XBB;

TL0=0X00;

if(++one_sec_flag

return;//提前完毕函数

}

if(flag1s)

{

flag1s = 0;

}else{

flag1s = 1;

}

one_sec_flag=0;

}

编译之后产生test.hex烧录文件。

下载器及下载驱动

STC89C52单片机下载器实际上就是USB转TTL串口,如下图所示

某宝上的下载器

驱动:压缩包中的CH341SER.EXE

先安装驱动才能下载代码到单片机中。

程序下载

硬件准备:

下载器的RXD连接芯片的TXD(P30),下载器的TXD连接芯片的RXD(P31),本设计引出了芯片的RXD和TXD,如上图所示连接即可。

软件准备:

STC-ISP.exe双击翻开,下载步骤

1选择选择单片机型号

2.选择下载器的串口

3.翻开编译生成的HEX文件

4.点击下载

下载界面

等待

此时,按下电源开关给单片机上电,下载软件会识别出单片机,然后自动下载程序。下载成功后会有提醒。

烧写成功

测试效果:测试LED灯一秒间隔闪烁。

新一代烧写工具 - STM32CubeProgrammer

STM32CubeProgrammer(STM32CubeProg)是STM32微控制器的专用编程工具。 STM32用户都知道,当完成程序调试,须要对芯片进行程序代码烧录编程,一般会有三个选择:通过调试接口【JTAG/SWD】?

AI电堂发表于STM32...

进修STM32单片机,绕不开的串口

刚初始学单片机的你,是不是会因用程序把LED点亮而感到高兴,会因用程序把数码管点亮而感到高兴。这是好事,这也是想继续进修下去的动力。但是数据相关的实验是进修单片机和STM32的一道坎?

SugarlesS

MCS-51系列单片机串口通讯实验(2)

1.实验目标1)掌握51单片机串行通讯调试方法 2)会简略的串行通讯协议编写 2.实验器材1)Widows操作系统的电脑。 2)调试软件 keil仿真实验版keil外挂串口调试工具软件--sscom虚拟调试串口

标签: 二极管ledled2uf直插电容国产mcs连接器直插陶瓷电阻器电阻300kj

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台