给51单片机烧程序,进度条走完提示写入Flash成功——写进去的地方就是程序存储器。它专放编译好的机器指令和常量表,断电不丢,上电后CPU从这里一条条取指令开始跑,跑飞了也是先从它身上找原因。
和数据存储器怎么分工
程序存储器放代码和固定数据,典型是ROM和Flash,掉电保持;数据存储器RAM放变量、中间结果和堆栈,读写快但断电全丢。打个比方:一个是印好的说明书,一页都不能少;一个是随手涂写的草稿纸,用完就翻篇。写C51时用code关键字把大常量表固定进程序存储器,比如字库、波形表,紧张的RAM就省出来了,这招老工程师用得很熟。两者的界限也不是一成不变:很多单片机用同一颗Flash芯片跑程序,再划一块出来存参数,掉电要保的数据靠备份寄存器或外挂EEPROM兜底。
两种体系结构
冯诺依曼结构里程序和数据共用一条总线、一个存储空间,取指令和取数据要排队进行;哈佛结构把程序存储器和数据存储器分成两套独立总线,取指令的同时还能取数据,实时性占优。51单片机、多数DSP用的是哈佛或改进哈佛结构,PC机的内存体系偏冯诺依曼式,各有取舍,没有绝对的好坏。
容量、寻址和选型
程序计数器PC给出当前取指地址,51单片机PC是16位,最多直接寻址64KB程序空间,这也是老教材里反复出现的那个数。代码体积超了就换大容量型号,或外扩存储芯片。选型看编译器输出的代码大小,标称容量留一半余量,后面加功能才有地方塞,别卡着上限买。预算敏感的话,容量往上跳一档往往只贵几块钱,直接选大的省心。
烧不进去、程序跑飞先查哪
烧录失败的常见原因:烧录器驱动没装对、晶振不起振、芯片型号选错。程序跑飞多半和看门狗没喂、中断服务函数里写了耗时代码、指针越界踩到代码区有关。排查时先确认烧录后校验通过,再看启动代码和中断向量表有没有被改乱。
一句话收尾:数据存储器紧了顶多跑得累,程序存储器出问题连第一步都迈不出去。选型时RAM可以抠着用,程序存储器的Flash别抠太狠。