[技术问答]

说说新唐8051关于SFR多个page那些事

[复制链接]
1155|6
手机看帖
扫描二维码
随时随地手机跟帖
奔跑的牛|  楼主 | 2019-12-11 14:58 | 显示全部楼层 |阅读模式
本帖最后由 奔跑的牛 于 2019-12-11 15:00 编辑

http://www.nuvoton-mcu.com/forum.php?mod=viewthread&tid=46993&extra=

跳转不了的或者404的 建议手动复制链接访问

使用特权

评论回复
捉虫天师| | 2019-12-13 21:50 | 显示全部楼层
可以访问,给力。

使用特权

评论回复
捉虫天师| | 2019-12-13 21:55 | 显示全部楼层
由于8051的特殊寄存器(SFR)只有128个字节,但是现在MCU的功能越做越强大,集成了很多外设在芯片中,使用这些外设就需要通过SFR去设置,这样一来导致128个字节的SFR根本不够用,那怎么办?于是用page的方式解决,将SFR寄存器放在不同page中,可以增加SFR访问的字节数。


大家有没考虑过增加page带来的副作用?
代码里对SFR访问时需要频繁的切换page,会增加额外的代码量,其实这不是致命的问题。
主要问题是中断程序中切换page带来的影响,比如主循环中刚刚切换到page0,下一步对page0中SFR读\写操作,但是这时被中断打断了,进入中断中又切换到page1,退出中断后,此时代码中想对page0的SFR读\写操作,其实是对page1相同地址读\写操作,就根本没有读\写成功,更糟糕的是还破坏了page1中SFR值。
如何解决中断中切换page问题,我们可以对page选择SFRS寄存器进行压栈和出栈保护。怎么实现?很简单如下操作:


以KeilC51为例,注意使用push和pop要#include ”intrins.h”
144838obbc4zzydlqbnd3s.jpg

IAR为例,注意0x91SFRS的地址
144913ou1gch8agcqv2xz8.jpg

除此之外还会遇到哪些问题呢?
使用UART printf 打印不出SFR的值
建议使用XRAM来暂存不同页内需要打印的SFR值,再回到SFRS PAGE0来印出。以ML51EB9AE为例,演示如何打印出PWM0C1H的值。因为UART0的SBUF所在位置为page 0且PWM0C1H所在位置为page 1,需先将PWM0C1H值存入XRAM中再将SFR page切换至SBUF 所在page,才能正确的印出PWM0C1H的值。范例程序如下图所示。
144913y7ny8887w7u8qw90.jpg
切记调用printf前一定先切换到page0,否则代码会卡死在printf函数中。

使用特权

评论回复
捉虫天师| | 2019-12-13 21:56 | 显示全部楼层
太好了,不如贴过来。
有问题交流还是要去原贴,发现原贴不用注册直接就可以回复,太给力了。

使用特权

评论回复
zhuomuniao110| | 2020-1-6 23:19 | 显示全部楼层
多谢分享,原来可以这么解决。

使用特权

评论回复
yiy| | 2020-1-26 12:44 | 显示全部楼层
这个概念好像是汇编里面的。

使用特权

评论回复
antusheng| | 2020-1-31 20:41 | 显示全部楼层
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:新唐科技
简介:新唐科技晶圆代工(源自于华邦电子六英寸晶圆厂)座落于台湾新竹科学园区内,月产能为45,000片,自1992年起,拥有超过20年晶圆代工服务经验,于2008年自华邦电子分割后,完全专注于晶圆代工。新唐晶圆代工厂目前提供0.35微米以上工艺,包括一般逻辑(Generic Logic)、混合信号(Mixed Signal)、高压(High Voltage)、超高压(Ultra High Voltage)、电源管理(Power Management)、Mask ROM (Flat Cell)、嵌入式记忆体(embedded Logic Non-Volatile Memory)与客制化工艺(如:IGBT, MOSFET, TVS, BioChip, Pressure Sensor, and Light Sensor)等。

253

主题

785

帖子

45

粉丝