STC15 - C51 - 操作寄存器时, 不要操作不相关的位

news2025/1/10 15:15:57

文章目录

    • STC15 - C51 - 操作寄存器时, 不要操作不相关的位
    • 概述
    • 笔记
    • 生成.i文件的选项
    • 编译工程后, 查看.list文件和.i文件
    • .c文件相关内容
    • .list文件
    • .i文件
    • 通过.i文件(预处理文件), 就可以看到最终实现代码有啥区别了
    • 不好使的代码
    • 好使的代码
    • 总结
    • END

STC15 - C51 - 操作寄存器时, 不要操作不相关的位

概述

在集成模块代码, 突然发现了一个奇怪的现象, 过了一段初始化代码(初始化T0定时器)后, 串口打印不出东西了.
反复确认, 在这段初始化代码前面, 就可以串口输出, 过了这段初始化代码, 就不能串口输出. 这段初始化代码一定有问题.
我整的这个测试工程中, 因为要根据不同的功能, 去执行不同的初始化, 我其他地方还有一段T0初始化代码, 在初始化后, 是可以串口输出的.
眼睛真看不出来啥区别, 最后查看.i文件(预处理文件), 看出区别了. 原来不好使的那段代码, 直接给寄存器赋值(影响了其他功能的寄存器控制位). 好使的那段代码, 只给寄存器相关的位赋值.
这就是区别.

笔记

生成.i文件的选项

在这里插入图片描述

编译工程后, 查看.list文件和.i文件

在这里插入图片描述

先看列表文件.lst
e.g. 调试的.c文件为uart_cmd_test_pwm_as_adc.c
那么 .list 文件就为uart_cmd_test_pwm_as_adc.lst, .i文件就为 uart_cmd_test_pwm_as_adc.i

.c文件相关内容

	PrintString1("PWM和ADC测试程序, 输入占空比为 0~256! 输入9999退出\r\n");	//SUART1发送一个字符串
	display_index = 0;
	//  Timer0初始化
// #define __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
#ifdef __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
	// 过了这里, 串口打印就打不出东西来了...
	//	EA = 0;
	AUXR = 0x80;	//Timer0 set as 1T, 16 bits timer auto-reload,
	TH0 = (u8)(Timer0_Reload / 256);
	TL0 = (u8)(Timer0_Reload % 256);
	ET0 = 1;	//Timer0 interrupt enable
	TR0 = 1;	//Tiner0 run
	
	/*
	 AUXR = 0x80;	 
 TH0 = (u8)((65536UL -(22118400L / 1000)) / 256);
 TL0 = (u8)((65536UL -(22118400L / 1000)) % 256);
 ET0 = 1;	 
 TR0 = 1;	
	*/
	
	//	EA = 1;
#else
	// 但是用宏写的初始化, 过了这里, 串口打印可以打出东西...
	// 为啥呢?
	Timer0_1T(); //Timer0 set as 1T, 16 bits timer auto-reload
	Timer0_Load(Timer0_Reload);
	Timer0_InterruptEnable();	//Timer0 interrupt enable
	Timer0_Run();	//Tiner0 run
	
	/*
	// uart_cmd_test_pwm_as_adc.i 最终的代码
	  AUXR |= (1<<7);  
  TH0 = ((65536UL -(22118400L / 1000))) / 256,	TL0 = ((65536UL -(22118400L / 1000))) % 256;
  ET0 = 1;	 
  TR0 = 1;	 
	*/
	
#endif // #ifdef __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
	PrintString1("PWM和ADC测试程序, 输入占空比为 0~256! 输入9999退出\r\n");	//SUART1发送一个字符串

.list文件

 58   1      // #define __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
  59   1      #ifdef __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
                // 过了这里, 串口打印就打不出东西来了...
                //  EA = 0;
                AUXR = 0x80;  //Timer0 set as 1T, 16 bits timer auto-reload,
C51 COMPILER V9.60.0.0   UART_CMD_TEST_PWM_AS_ADC                                          12/16/2022 14:30:28 PAGE 42  

                TH0 = (u8)(Timer0_Reload / 256);
                TL0 = (u8)(Timer0_Reload % 256);
                ET0 = 1;  //Timer0 interrupt enable
                TR0 = 1;  //Tiner0 run
                
                /*
                 AUXR = 0x80;  
               TH0 = (u8)((65536UL -(22118400L / 1000)) / 256);
               TL0 = (u8)((65536UL -(22118400L / 1000)) % 256);
               ET0 = 1;  
               TR0 = 1; 
                */
                
                //  EA = 1;
              #else
  78   1        // 但是用宏写的初始化, 过了这里, 串口打印可以打出东西...
  79   1        // 为啥呢?
  80   1        Timer0_1T(); //Timer0 set as 1T, 16 bits timer auto-reload
  81   1        Timer0_Load(Timer0_Reload);
  82   1        Timer0_InterruptEnable(); //Timer0 interrupt enable
  83   1        Timer0_Run(); //Tiner0 run
  84   1        
  85   1        /*
  86   1        // uart_cmd_test_pwm_as_adc.i 最终的代码
  87   1          AUXR |= (1<<7);  
  88   1        TH0 = ((65536UL -(22118400L / 1000))) / 256,  TL0 = ((65536UL -(22118400L / 1000))) % 256;
  89   1        ET0 = 1;   
  90   1        TR0 = 1;   
  91   1        */
  92   1        
  93   1      #endif // #ifdef __UART_CMD_TEST_PWM_AS_ADC_C__USE_ASM_INIT__
  94   1        PrintString1("PWM和ADC测试程序, 输入占空比为 0~256! 输入9999退出\r\n"); //SUART1发送一个字符串

可以看到, .list文件只是给源文件标记上了行号, 其他和源文件相同, 未做任何改变, 注释都还在

.i文件

 PrintString1("PWM和ADC测试程序, 输入占空比为 0~256! 输入9999退出\r\n");	 
 display_index = 0;
 
 
 
#line 60 "uart_cmd_test_pwm_as_adc.c" /1
 
 
 
 
 
 
 
 






 
 
 
 
#line 78 "uart_cmd_test_pwm_as_adc.c" /0
 
 
  AUXR |= (1<<7);  
  TH0 = ((65536UL -(22118400L / 1000))) / 256,	TL0 = ((65536UL -(22118400L / 1000))) % 256;
  ET0 = 1;	 
  TR0 = 1;	 
 






 
 
 
 PrintString1("PWM和ADC测试程序, 输入占空比为 0~256! 输入9999退出\r\n");	 
 
 AUXR1 &= ~0x30;

可以看到, .i文件是最终生成的源代码文件, 注释, 用宏隔开不需要编译的代码都没了. 将这个文件中的内容, 整理一下, 就是最干净的实现文件.

通过.i文件(预处理文件), 就可以看到最终实现代码有啥区别了

不好使的代码

AUXR = 0x80;  
               TH0 = (u8)((65536UL -(22118400L / 1000)) / 256);
               TL0 = (u8)((65536UL -(22118400L / 1000)) % 256);
               ET0 = 1;  
               TR0 = 1; 

好使的代码

AUXR |= (1<<7);  
  TH0 = ((65536UL -(22118400L / 1000))) / 256,	TL0 = ((65536UL -(22118400L / 1000))) % 256;
  ET0 = 1;	 
  TR0 = 1;

比较可知:
不好使的代码, 直接给AUXR赋值为0x80, 其实本意是要将AUXR最高位置1, 但是将其他bits都改为了0, 当然其他功能就受影响.
好使的代码, 直接位或AUXR.bit7, 没有动其他bit

一般控制寄存器每个位都有不同的功能, 不能动无关的控制位.
这句不好使的初始化代码, 来自STC的寄存器操作的例程. 在那个例程中, 不受影响, 但是在综合性的集成工程中, 动了无关的控制寄存器的位, 事就来了.

总结

*重构代码时,尽量按照最小化原则去动代码.边改边测试, 如果有问题 , 容易发现一些.
*重构时要有次序,应该后面改的代码,绝不先改.不该现在动的代码绝对不动.
*万一发觉事情不对(那怕只是坏味道),一定先停下来,将当前的问题解决掉.否则积累到后面,积累的越久,问题就越多.

  • 手写寄存器操作, 总是不好的. 可以自己用一些好记的宏来代替, 如果官方库中有预定义好的宏, 一定要用.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式系统(故障、恢复)

文章目录故障模型可靠组播基于基本组播基于 IP 组播协定问题ConsensusByzantine generalsInteractive Consistency一些重要结论分布式恢复后向恢复Checkpointing AlgorithmCoordinated CheckpointingIndependent CheckpointingMessage Logging AlgorithmPessimistic message lo…

[附源码]Node.js计算机毕业设计高校运动会管理系统 Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

95.(leaflet之家)leaflet态势标绘-进攻方向采集(燕尾)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html> <

快速传输大文件,怎么通过网络传大文件给对方(1G以上)

在生活和工作中&#xff0c;我们总是要发送一些比较大的文件给别人&#xff0c;或者在自己的设备之间。在互联网日益发达的今天&#xff0c;我们可以用什么方法通过互联网快速传输大文件&#xff0c;发送1G以上的文件&#xff1f; 一、使用QQ传 在电脑上打开QQ&#xff0c;选…

【技术评论】大数据时代,区块链如何解决数据安全和隐私问题

发表时间&#xff1a;2022年6月23日 信息来源&#xff1a;bsvblockchain.org 在这个时代&#xff0c;像GDPR和HIPAA这样的措施为消费者带来了前所未有的数据保护水平&#xff0c;人们理所当然地想知道&#xff0c;由区块链驱动的数据解决方案如何能够符合这些法规的要求。 (全…

PHP代码审计系列(四)

PHP代码审计系列&#xff08;四&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 SQL注入or绕过 源码如下 <?php#GOAL: login as admin,then get the flag; error_reporting(0); require db.in…

Java用户线程和守护线程,线程默认Daemon值是false吗?

文章目录用户线程守护线程必须要在start()方法之前设置守护线程线程默认的daemon值总结Java中通常有两种线程&#xff1a; 用户线程和 守护线程&#xff08;也被称为服务线程&#xff09;通过 Thread.setDaemon(false)设置为 用户线程&#xff08;默认为用户线程&#xff09;通…

【鸿蒙应用开发系列】- 应用置灰方案实现讲解

在某些特殊的日子里&#xff0c;有时候需要对应用进行一个置灰显示处理&#xff0c;在Android中&#xff0c;提供了一些很方便的方法&#xff0c;可以对控件或者应用进行灰色的展示 Android应用置灰方式 1、使用灰色主题皮肤&#xff08;这个开发量比较大&#xff09; 2、图…

LOAM论文阅读

1. 摘要 本文提出一种实现激光雷达里程计与建图方法&#xff0c;使用6自由度的双轴激光雷达进行距离测量。问题的难点在于激光雷达的每一个点的时间戳都不同&#xff0c;运动估计的误差会影响激光点云的配准。目前相关的3D地图一般使用离线批处理方法构建&#xff0c;且使用闭…

回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出

回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 目录回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出预测效果基本介绍程序设计参考资料预测效果 基本介绍 麻雀搜索算法(Sparrow Search Algorithm, SSA)是于…

2_Oracle_手工建库

一、手工建库的目的 1、方便理解Oracle的体系结构 2、更快更好的创建数据库 3、方便了解建库的每步细节 4、手工建库的实用性 二、dbca生成的脚本 /app/oracle/admin/orcl/scripts/ orcl.sh #!/bin/sh OLD_UMASKumask umask 0027 mkdir -p /app/oracle/admin/orcl/adump mkdi…

2022年度调味品十大热门品牌排行

调味品行业总量大&#xff0c;种类繁多&#xff0c;需求量大&#xff0c;且调味品作为生活必需品&#xff0c;与饮食文化紧密联系&#xff0c;也与人们的生活息息相关&#xff0c;如近日各省陆续全面放开后&#xff0c;也出现了北方抢黄头罐头南方抢醋的风潮。总体来说&#xf…

C++11后的常用容器和迭代器

文章目录一、string容器二、vector容器三、list容器1.构造函数2.特性操作3.元素操作4.赋值操作5.交换、反转、排序、归并6.比较操作7.插入和删除五、pair键值对四、map容器1.红黑树&#xff08;平衡二叉排序树&#xff09;2.构造函数3.特性操作4.元素操作5.赋值操作6.交换操作7…

Docker学习笔记5(狂神)

Docker网络&#xff1a; 我们学习docker的网络首先要删除我们所有的镜像&#xff1a; 我们发现我们有这么多的镜像。 我们现在来安装一下tomcat&#xff1a; linux能够ping通docker容器内部 再次测试ip addr 我们再启动一个容器测试&#xff1a; 发现又多了一对网卡。 3.我们来…

条件执行指令 CMP

CMP可以比较两个数的关系&#xff0c;其本质就是一条减法指令&#xff0c;只是不会将运算结果保存到寄存器&#xff0c;因为对于CPU而言&#xff0c;比较两个数时只关心结果是false还是true 指令格式&#xff1a;CMP <第一操作寄存器> <第二操作数> 第一操作寄…

【渐进式:深度光谱变换】

P2Sharpen: A progressive pansharpening network with deep spectral transformation &#xff08;P2Sharpen&#xff1a;一种具有深度光谱变换的渐进式全色锐化网络&#xff09; 大多数现有的基于深度学习方法pansharpening的监督任务仅仅依靠伪ground-truth多光谱图像,展示…

【猿如意】猿如意初用之感及editplus工具解绍

​​​​​​【猿如意】猿如意初用之感及editplus工具解绍 目录 一、猿如意初用之感 二、editplus工具下载安装渠道 三、工具介绍 四、功能介绍首先&#xff0c;EditPlus是一套功能强大的文本编辑器。 五、软件截图 六、软件安装过程 6.1在猿如意中的下载步骤 七、使用…

升级JSONB列式存储,Hologres助力淘宝搜索2022双11降本增效!

作者&#xff1a;陆晨炜&#xff08;花名遣云&#xff09;阿里巴巴智能引擎事业部数据开发 前言&#xff1a; 2022年的双11&#xff0c;阿里淘宝搜推集群承载上千万每秒的的流量峰值&#xff0c;消费者的每一次浏览、点击都通过搜推集群进行流转&#xff0c;与往年双11不同的…

[附源码]Python计算机毕业设计高校学生心理健康信息咨询系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

万字长文——MySQL基础一篇打通

准备工作 直接使用MySQL提供的数据&#xff0c;下载MySQL示例数据库 MySQL示例数据库模式由以下表组成&#xff1a; Customers&#xff1a;存储客户的数据。Products&#xff1a;存储比例模型车列表。ProductLines&#xff1a;存储产品系列类别列表。Orders&#xff1a;存储…