状态寄存器

51单片机串口通信

主宰稳场 提交于 2020-02-27 15:34:17
这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1) 。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。 该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2

linux C 中的volatile使用

孤街醉人 提交于 2020-02-23 16:40:25
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变

SPI详解

江枫思渺然 提交于 2020-02-23 16:10:17
1、 SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 2、 SPI特点 2.1采用主-从模式(Master-Slave) 的控制方式 SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作 2.2采用同步方式(Synchronous)传输数据 Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),

Go语言goroutine调度器初始化(12)

浪子不回头ぞ 提交于 2020-02-21 08:21:12
本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。 package main import "fmt" func main() { fmt.Println("Hello World!") } 首先我们从程序启动开始分析调度器的初始化。 在分析程序的启动过程之前,我们首先来看看程序在执行第一条指令之前其栈的初始状态。 任何一个由编译型语言(不管是C,C++,go还是汇编语言)所编写的程序在被操作系统加载起来运行时都会顺序经过如下几个阶段: 从磁盘上把可执行程序读入内存; 创建进程和主线程; 为主线程分配栈空间; 把由用户在命令行输入的参数拷贝到主线程的栈; 把主线程放入操作系统的运行队列等待被调度执起来运行。 在主线程第一次被调度起来执行第一条指令之前,主线程的函数栈如下图所示: 了解了程序的初始状态之后,下面我们正式开始。 程序入口 在Linux命令行用 go build 编译hello.go,得到可执行程序hello,然后使用gdb调试,在gdb中我们首先使用 info files 命令找到程序入口(Entry point

Starting from fork(...)

纵然是瞬间 提交于 2020-02-21 04:48:55
作为计算机程序的基本单位,一切五花八门,新奇古怪的程序都源于一个fork。亚当夏娃之后,人类繁衍生息便出现了社会,fork繁衍生息之后便出现了windows,或者Linux,又或者你手中的iPhone5,双卡双待,大屏加超长待机,还有标配的炫酷铃声——《爱情买卖》。 fork不是一个C函数,而是一个系统调用。c通常是用户层的语言,比如简单的加减法,若要解决复杂的问题,比如申请一段内存,开多进程,这显然不是c 能办到的,或者你也不知如何实现这样一个函数。不同的操作系统有自己的标准,亦有自己定义的API,fork一个进程更不会是一套相同的代码。这种C自己办不到的事情,只能量力而行,通知系统(内核)帮自己处理下咯,内核处理好,将结果返回给c,这便是合作的道理。 创建一个进程 #include <unistd.h>pid_t fork(void); 系统调用的过程 --> 应用程序函数,也就是上面的pid fork(void) --> libc里的封装例程 , 向内核发送系统调用号 --> 系统调用处理函数,接收到系统调用号,通过sys_call_table找到相应服务例程地址 /* 0 */ CALL(sys_restart_syscall) CALL(sys_exit) CALL(sys_fork_wrapper) //--> CALL(sys_read) CALL(sys_write

第五周学习总结

橙三吉。 提交于 2020-02-19 23:24:29
信息安全系统设计基础第六周学习总结 【学习时间: 6 小时】 一、学习过程 1.一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。 2.程序员可见的状态: Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。 3.存储器:从概念上来说是一个很大的字节数组,保存着程序和数据。 4.程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。 5.Y86指令不允许从一个存储器地址到另一个存储器地址,也不允许从立即数到存储器。 6.halt指令停止指令的执行。并将状态码设置为HLT。 7.Y86利用绝对地址进行寻址,而且使用小端法编码。 8.指令集的一个重要性质就是字节编码必须有唯一的解释。 9.Stat包括四种状态,除了AOK表示正常执行外,其他状态都会导致处理器停止。在更完整的设计中,处理器通常都会调用一个异常处理程序。 10.Y86与IA32代码主要的区别就是,前者需要多条指令去执行一条IA32指令完成的功能。 11.以“.”开头的是汇编器命令,它们告诉汇编器调整地址,以便在那产生代码或者是插入一些数据。 12.指令模拟器YIS 目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。 13.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制如下:

关于CPU的一点知识

醉酒当歌 提交于 2020-02-19 17:12:35
首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和逻辑运算 累计寄存器(AC) 通常叫做累计器,是一个通用寄存器。当ALU处理完算术运算或者逻辑运算之后,会得到一个结果,这个结果就会保存在AC中。 数据缓冲寄存器(DR) 这个DR也是存放数据的,存放的主要是从内存读取过来的数据,会暂时存放在这个DR中,这里就相当于内存和CPU之间做数据传送的一个中转站。CPU和内存的速度是有很大差别的,中间引入一个DR,一定程度上起到了速度上的缓冲作用。 状态条件寄存器(PSW) 首先寄存器还是保存数据的,所以PSW自然也是保存某一类数据的。它保存的主要是由算术指令和逻辑指令运行或者测试的结果建立的各种条件码内容,一般分为状态标志和控制标志。 控制器 上面介绍的运算器只是起到了运算的功能,控制器是控制整个CPU的工作,对于控制器,一般要能够保证程序的正确执行以及能够处理异常事件。 指令寄存器(IR) 顾名思义,指令寄存器是用来保存指令的。也就是说,CPU要执行一条指令的话

新金宝

依然范特西╮ 提交于 2020-02-18 03:38:18
目前只实现了主设备模式,一般也只用到主设备模式,IIC如果不能使用硬件方式,读取大量数据的时候效率很大,由于只有1个字节的缓冲区,根本不能使用中断模式(实际使用过程中,IIC会造成100us以内间隔的中断,单片机根本扛不住的),所以建议数据少就直接阻塞,1个字节也就几十us,数据多直接用DMA,将线程阻塞,等待DMA传输完成,而不会阻塞CPU(上传的代码没有实现DMA部分,便于理解)。 目前已经做了完善的错误处理,读写操作前都会清除中断,遇到错误会软复位,所有位置均做了超时处理,防止程序卡死,目前只测试了几个字节的读写,大量的,长时间的读写均表现稳定,目前手上开发板没有eeprom,无法做大数据的连续读写,如果你在使用过程中遇到问题,欢迎指正。 下面是IIC读写的时序例子,可以先熟悉一下,这样比较容易上手,哪一个环节出了问题也要调试。 正在上传…重新上传取消 下面简要说明一下STM32F7硬件IIC的驱动设计方式(建议先百度学习一下IIC的时序要求): [基本的初始化] 1.初始化IIC时钟,IO(IIC IO必须设置为复用开漏输出,这个很重要)。 2.CR1先赋值为0,复位IIC. 3.除了TIMINGR寄存器需要自己计算设置好,其余寄存器全部复位为0 4.设置CR1使能IIC。 注意:上面说到,IIC的IO必须初始化为复用开漏输出,我之前初始化为复用推挽输出,测试很久

STM32学习笔记5(TIM通用模块定时功能)

吃可爱长大的小学妹 提交于 2020-02-17 11:41:33
原文地址: http://blog.sina.com.cn/s/blog_49cb42490100s6ud.html 1. STM32 的 Timer 简介 STM32中一共有 11个定时器,其中 2个高级控制定时器, 4个普通定时器和 2个基本定时器,以及 2个看门狗定时器和 1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的 SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的 8个定时器。 定时器 计数器分辨率 计数器类型 预分频系数 产生 DMA请求 捕获 /比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上 /向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上 /向下 1-65536之间的任意数 可以 4 没有 TIM6 TIM7 16位 向上 1-65536之间的任意数 可以 0 没有 其中 TIM1和 TIM8是能够产生 3对 PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由 APB2的输出产生。 TIM2-TIM5是普通定时器, TIM6和 TIM7是基本定时器,其时钟由 APB1输出产生。由于 STM32的 TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是 TIM2-TIM5普通定时器的定时功能。 2. 普通定时器 TIM2

体系结构复习3

送分小仙女□ 提交于 2020-02-16 02:45:28
流水线技术 访问主存的冲突解决 设置两个独立编址的存储器 指令和数据依然混合放在同一个主存,但设置两个Cache:指令Cache和数据Cache。程序空间和指令空间相互独立的系统结构称为哈佛结构。 指令和数据依然混合放在统一主存,但主存采用多体交叉结构。(有一定的局限性) 在主存和指令分析部件之间增设指令缓冲站 先行指令缓冲站 先行程序计数器PC1 先行程序计数器PC 指令缓冲 存储区 主 存 指令分析部件 指令寄存器IR 控 制 控制逻辑 器 指令缓冲存储区&控制逻辑 a) 按队列方式工作 b) 只要指令缓冲站不满,他就自动地向主存控制发取指令请求,不断地取指令 指令分析部件 a) 每分析完一条指令,就自动向指令缓冲站发出取下一条指令的请求。指令取出之后就把指令缓冲站中的指令作废。 b) 指令缓冲器中存放的指令条数是动态变化的 两个程序计数器 a) 先行程序计数器PC1:用于从主存预取指令 b) 现行程序计数器PC:用来记录指令分析部件当前正在分析的指令的地址 先行控制 先行控制技术:缓冲技术和预处理技术的结合 a) 缓冲技术:在 工作速度不固定 的两个功能部件之间设置缓冲器,用以 平滑 它们的工作。 b) 预处理技术:预取指令、对指令进行加工以及预取操作数等。 采用先行控制方式的处理机结构 主存储器 存储控制器 先行指令缓冲站 先行读数站 指令分析部件 先行操作站 运算控制器