推荐阅读最新更新时间:2024-03-16 15:28
stm32局部变量过大,导致栈溢出
在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变,刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域,重新赋了值, 自己忘记了,后来查找了好久都没有其他地方使用这个结构体变量,于是开始单步调试,结果进入一个函数的时候(里面定义了一个200个数据float型的数组),发现只要定了一个这个数组,这时前文提到的那个结构的值就发生改变,通过在keil软件中的Memory窗口查看结构体的变量可以清楚看到结构体的地址里面的数据在这个时候发生改变, 然后修改,这个局部变量数组的大小,把它改小之后,就没有发生问题。因为局部变量是储存在栈中的,于是猜想,这种问题应该是stm32的栈的内存的溢出造
[单片机]
(C51学习五)单片机与PC通过串口通信
1.开发步骤 1.设置串口中断寄存器 2.求出给定波特率对应的T1定时器初始值(因为传统的C51是用T1定时器产生波特率的) 3.写程序 2.串口模块 什么是串口?串口就是COM口,串口是串行发送数据的,是一位位地发送数据位,常见的是9针串口。但在一般的C51学习版和开发版上都有集成CH340转换芯片, 使得用usb口就可以代替串口,所以用一般的学习板进行开发,只要插上usb线就可以进行串口测试。 3.SBUF是什么 SBUF是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收。发送也是,当单片机准备发送数据时,会先把数据放到 SBUF中,再发送出去 4.串口相应寄存器 SCON串
[单片机]
C51的中断号排序规则
在编写中断服务程序(ISR)的时候需要知道中断号,用于通知51内核,这个中断服务程序是为了响应哪个中断的。那么,从以上这句简单的描述可以看出,中断号必然对应于中断服务程序的入口地址,而入口地址又与中断向量(Interrupt Vector)有对应关系,所以: (1)、中断号即是中断向量从小到大的编号,从0开始; (2)、中断向量0x0000是上电复位,不计入中断向量的编号; (3)、特别注意,有些中断源的默认中断优先级并不是中断向量从小到大的编号,所以默认的中断优先级并不能作为中断号使用。 什么是中断号 // Wake-up interrupt handler void resume_isr(
[单片机]
Keil C51中变量的使用方法详解
引言 8051内核 单片机 是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register
[单片机]
Keil C51开发系统基本知识2
3. 第三节 存储模式 存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种: 1. 1. Small模式 所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。 2. 2. Compact模式 所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。 3. 3. large模式 所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。 提示:存储模式在C51编译器选项中选择。 4.
[单片机]
单片机c语言教程第三章--C51数据类型
每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的。先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的数据类型。在标准C语言中基本的数据类型为 char,int,short,long,float 和 double,而在c51编译器中int 和 short 相同,float 和 double 相同,这里就不列出说明了。下面来看看它们的具体定 义 数据类型 长 度 值 域 unsigned char 单字节 0~255 signed char 单字节 -128~+127 unsigned int 双字节 0~65535
[单片机]
C51串口通信(中断模式)T2产生波特率
#include reg52.h #define uchar unsigned char uchar temp; void serial()interrupt 4 using 1 { if(RI) { RI=0; temp=SBUF; SBUF=temp; } else if(TI) TI=0; } main() { uchar string = AT89C52 Microcomputer!Designer: Grarry Meng ; uchar i=0; RCLK=1; TCLK=1; TH2=0XFF; TL2=0XDC; RCAP2H=0XFF; RCAP2L=0XDC;
[单片机]
Keil C51高级编程
l 绝对地址访问 l C与汇编的接口 l C51软件包中的通用文件 l 段名转换与程序优化 第一节 绝对地址访问 C51提供了三种访问绝对地址的方法: 绝对宏: 在程序中,用“#include absacc.h ”即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知 例如: rval=CBYTE ;指向程序存贮器的0002h地址 rval=XWORD ;指向外RAM的0004h地址 2. _at_关键字 直接在数据定义后加上_at_ const即可
[单片机]