状态寄存器

NRF24L01 无线通信模块使用

ε祈祈猫儿з 提交于 2019-11-30 02:50:08
NRF24L01驱动代码下载: http://download.csdn.net/detail/ieczw/7029597 NRF24L01调试了近一个星期!多多少少有点浪费感情,因为由于板子的问题害的我一直无法调通,后来又找了两块板子,立马搞好!当然我的程序很大成分上是参考老一辈革命家的;但是在这之间,由于板子的问题,迫使我对NRF24L01的datasheet进行了一番研究! NRF24L01与控制器的通信采用的SPI通信协议,这个协议具体细节大家可能都懂,不懂的可以之间百度;他们的通信模型是这样的: NRF*之间基本上可以互相通信,只要你地址设置的没有问题!他有六个通道,每一个通道都有自己的缓冲区,这六个通道可以同时跟不同的NRF进行通信,但是通信的两个之间的TX_ADDR和RX_ADDR一定要相同; 这幅图能够充分的说明这个问题;Point1 to Point2,Point1和Point2的通道地址一定要一样;具体的设置在下面这个寄存器里面配置: NRF24L01有RX模式,TX模式,Standby-I模式,Standby-II模式,掉电模式;他们之间的模式转换如下图: 这张图看着可能没有一点感觉,比较乱,下面这张可能会比较清晰一点: 只要我们想切换到什么模式就可以根据这个对寄存器进行配置;不过在配置的过程中,一点要注意适当的延时,我这次也被这个延时纠结了半天;

TMS320F28377学习笔记——SCI串行通信接口

淺唱寂寞╮ 提交于 2019-11-29 23:43:40
本章介绍串行通信接口(SCI)模块的功能和操作。 SCI是一种双线异步串行端口,通常称为UART。 SCI模块支持CPU和使用标准非归零(NRZ)格式的其他异步外设之间的数字通信。 SCI接收器和发送器每个都有一个16级深FIFO,用于减少服务开销,每个都有自己独立的使能和中断位。 两者都可以独立操作以进行半双工通信,或同时进行全双工通信。 为了指定数据完整性,SCI检查接收到的数据是否存在中断检测,奇偶校验,溢出和帧错误。 比特率可通过16位波特选择寄存器编程为不同的速度。 SCI模块的功能包括: •两个外部引脚: SCITXD:SCI发送输出引脚 SCIRXD:SCI接收输入引脚 如果不用于SCI,则两个引脚都可以用作GPIO。 •波特率可编程为64K不同速率 •数据字格式 一个开始位 数据字长度可编程为1至8位 可选偶数/奇数/无奇偶校验位 一个或两个停止位 •四个错误检测标志:奇偶校验,溢出,成帧和​​中断检测 •两种唤醒多处理器模式:空闲线和地址位 •半双工或全双工操作 •双缓冲接收和发送功能 •发送器和接收器操作可以通过具有状态标志的中断驱动或轮询算法来完成。 •发送器和接收器中断的独立使能位(BRKDT除外) •NRZ(不归零)格式 •13个SCI模块控制寄存器位于控制寄存器帧中,从地址7050h开始 该模块中的所有寄存器都是8位寄存器,连接到外设帧2.当访问寄存器时

用寄存器点亮LED

杀马特。学长 韩版系。学妹 提交于 2019-11-29 23:37:44
为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮一个LED的方法,给大家演示一下STM32如何用操作寄存器的方法点亮一个LED,然后再慢慢讲解到底什么是库,让大家知道库跟寄存器的关系。 1. 用51点亮一个LED   在用STM32点亮一个LED之前,我们先来复习下用51如何点亮一个LED。 硬件上我们假设51单片机的P0口的第0位接了一个LED,负逻辑亮。如果我们要点亮这个LED,代码上我们会这么写: P0 = 0XFE;//总线操作点亮 LED 这时候我们就把LED点亮了,如果要关掉LED ,则是: P0 = 0XFF;//总线操作关闭 LED 这里面我们用的是总线操作的方法,即是对P0口的8个IO同时操作,但起作用的只是P0^0。 除了这种总线操作的方法,我们还学习过位操作,利用51编译器的关键字sbit,我们可以定义一个位变量: sbit LED = P0^0; 那么LED = 0,就点亮了LED; LED = 1,就关闭了 LED。 为了让程序看起来见名知义,我们定义两个宏: #define ON 0 #define OFF 1 点亮和关闭LED的代码就变成了: LED = ON;//位操作点亮LED LED = OFF;//位操作关闭LED 稍微整理一下代码,整体效果就是: //假设51单片机的PO~0口接LED,负逻辑点亮 #define ON 0

栈帧ebp,esp详解

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 21:20:12
栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图 出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图 我们来看下面这个C程序在执行过程中,栈的变化情况 void func(int m, int n) { int a, b; a = m; b = n; } main() { ... func(m, n); L: 下一条语句 ... } 在main调用func函数前,栈的情况,也就是说main的栈帧: 从低地址esp到高地址ebp的这块区域,就是当前main函数的栈帧。当main中调用func时,写成汇编大致是: push m push n; 两个参数压入栈 call func; 调用func,将返回地址填入栈,并跳转到func 当跳转到了func,来看看func的汇编大致的样子: __func: push ebp; 这个很重要,因为现在到了一个新的函数,也就是说要有自己的栈帧了,那么

全局描述符表GDT

烂漫一生 提交于 2019-11-29 19:42:38
写在前面 添油加醋系列第二弹——剖析GDT 头文件: https://github.com/bajdcc/MiniOS/blob/master/include/gdt.h 实现: https://github.com/bajdcc/MiniOS/blob/master/src/kernel/gdt.c 话说C语言的话除了刷刷OJ外,就是用来实现操作系统这个大头了。C语言比C++少了很多很多臃肿的语法特性,写起来非常优美(至少写操作系统是这样的)。虽说C++有许多的奇技淫巧,一个算法有N种实现方法,但这会让选择恐惧症患者(比如我)难堪,比如说一个类要怎样写啊等等,,抛开其他不谈,假如一个语言的语法特性越少,学起来可能越简单(刚试过lua语法很简单)。OK废话不多说,进入本章主题(涉及OS的资料很杂很偏,如有错误望海涵)。 GDT的构成 这个网址不错(英文的): Global Descriptor Table 首先,根据网上资料,GDT(全局描述符表)又叫段描述符表,暂且就这样认为吧,如有异议可以提出来。 一个GDT可能是这样的( GDT与LDT - Lan'Sir - 博客频道 - CSDN.NET ): 同样也是这样的( Global Descriptor Table ): 在代码中它又是这样: // 全局描述符表结构 http://www.cnblogs.com

CPU上下文切换

风流意气都作罢 提交于 2019-11-29 16:51:42
进程在竞争 CPU 的时候并没有真正运行,为什么还会导致系统的负载升高呢?CPU 上下文切换就是罪魁祸首。 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文 。 知道了什么是 CPU 上下文,我想你也很容易理解 CPU 上下文切换 。 CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来, 然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同 ,CPU

CPU上下文切换

对着背影说爱祢 提交于 2019-11-29 13:28:16
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11518557.html CPU 的上下文切换场景 Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器 和 程序计数器(Program Counter,PC) 。 CPU 寄存器 : 是 CPU 内置的容量小、但速度极快的内存。 程序计数器 : 是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。 它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文 。 CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景, 进程上下文切换

ARM汇编指令集

亡梦爱人 提交于 2019-11-29 12:19:22
跳转指令 B BL会把当前PC指针的值加4保存到R14里。 MOV{条件}{S} 目的寄存器 ,源操作数 只能用在通用寄存器的操作 MOV R1,R0 将寄存器R0的值传送到R1里 MVN{条件}{S} 目的寄存器 ,源操作数 在传送之前按位取反,即把一个被取反的值传送到目的 寄存器中。 S决定指令操作是否影响CPSR中条件标志位的值,没有S 时指令不更新CPSR中条件标志位的值。 CMP{条件}操作数1,操作数2 把两个操作数进行比较,同时更新CPSR中条件标志位的值 该指令进行一次减法运算,不存储结果,只更改条件标志位 TST{条件 }操作数1,操作数2 把一个寄存器的内容和另一个寄存器的内存或立即数进行按位与运算,并 更新CPSR中条件标志位的值,当位与结果为0时,EQ位被设置。 TST R5,#(1<<23) ;当bit23位为1时,CPSR EQ位被设置 ADD{条件}{S}目的寄存器,操作数1,操作数2 将两个操作数相加,把结果放在目的寄存器中。 ;ADD指令 MOV R1,#1 MOV R2,#2 MOV R3,#3 ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,#256 ;R0=R1+256 ADD R0,R2,R3,LSL#1 ;R0=R2+(R3<<1) SUB{条件}{S}目的寄存器,操作数1,操作数2 用操作数1减操作数2

modbus通讯协议详解

荒凉一梦 提交于 2019-11-29 11:35:53
一、Modbus 协议简介     Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口。其通信遵循以下的过程:   ● 主设备向从设备发送请求   ● 从设备分析并处理主设备的请求,然后向主设备发送结果   ● 如果出现任何差错,从设备将返回一个异常功能码   此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。   当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构

汇编初识

∥☆過路亽.° 提交于 2019-11-29 06:42:35
   0x00 寄存器初始识   32位x86架构下的寄存器可以被简单分为 通用寄存器 和 特殊寄存器 两类,通用寄存器在大部分汇编指令下是可以任意使用的(虽然有些指令规定了某些寄存器的特定用途),而特殊寄存器只能被特定的汇编指令使用,不能用来任意存储数据。    ①通用寄存器   32位x86架构下的通用寄存器包括:   一般寄存器(eax、ebx、ecx、edx)   索引寄存器(esi、edi)   堆栈指针寄存器(esp、ebp)   eax 被称为累加寄存器( A ccumulator),用以进行算数运算和返回函数结果等。ebx 被称为基址寄存器( B ase),在内存寻址时(比如数组运算)用以存放基地址。ecx 被称为记数寄存器( C ounter),用以在循环过程中记数。edx 被称为数据寄存器( D ata),常配合 eax 一起存放运算结果等数据。   索引寄存器通常用于字符串操作中,esi 指向要处理的数据地址( S ource I ndex),edi 指向存放处理结果的数据地址( D estination I ndex)。   堆栈指针寄存器(esp、ebp)用于保存函数在调用栈中的状态,ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶(下一个压入栈的活动记录的顶部),是栈指针