数据寄存器

STM32学习笔记(一)---基础知识

让人想犯罪 __ 提交于 2019-12-14 01:30:00
STM32学习笔记(一)—基础知识 知识点 1.所有芯片的引脚顺序都是逆序排列的 2.芯片主要由内核和片上外设组成。 3. volatile :在 C 语言中该关键字用于修饰易变的变量,要求编译器不要优化。 存储器映射 存储器本身不具有地址,给存储器分配地址的过程就称为 存储器映射 。 给存储器再分配一个地址的过程就叫做 存储器重映射 。 寄存器映射 设计片上外设时,以四个字节为一个单元,共32bit,每个单元对应不同的功能,我们控制这些单元就可以驱动外设工作。 根据每个单元的功能不同,以功能为名给这个内存单元起别名,这个别名就是寄存器。 给已经分配好地址的有特定功能的内存单元取别名的过程就叫做 寄存器映射 例子: GPIOF端口的输出数据寄存器ODR的内存地址为0x4002 1414(ODR寄存器32位,低16位有效,控制16个IO端口输出高低电平) 通过绝对地址访问内存单元: * ( unsigned int * ) 0x40021414 = 0xFFFF ; 通过寄存器方式访问内存单元 # define GPIOF_BASE 0x40021400 # define GPIOF_ODR (unsigned int *)(0x40021400 + 0x14) * GPIOF_ODR = 0xFFFF ; c语言封装寄存器 /* 外设基地址 */ # define PERIPH

I2C接口开漏输出输入双向

十年热恋 提交于 2019-12-13 22:03:17
I2C接口 原创 朝辞暮见 发布于2018-06-13 19:45:25 阅读数 8265 收藏 展开 一、I2C总线协议内容 1. I2C总线引脚定义 SDA (I2C数据引脚) CLK (I2C数据引脚) 2. I2C 总线物理连接 I2C总线物理连接如下图所示,SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低。 二、I2C总线的数据传送 1. 数据位的有效性规定 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化 1 scl处于高电平的时候,如果sda处于低电平:传输数据0,sda处于高电平:传输数据1 2.在scl处于高电平的时候,sda用来传输数据,必须保持电平稳定 3.如果要产生数据即sda需要变化时,只能在scl处于低电平的时候 2. 起始和终止信号 SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。 1. 信号的发起和终止,由主机发起,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。 2. scl处于高电平的时候,sda由高->低的跳变, 表示发起传输,产生起始信号s, 如果低-

C语言中volatile关键字的使用

こ雲淡風輕ζ 提交于 2019-12-13 12:56:44
volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。 作用 编辑 简单地说就是防止编译器对代码进行优化。比如如下程序: 1XBYTE[2]=0x55; 2XBYTE[2]=0x56; 3XBYTE[2]=0x57; 4XBYTE[2]=0x58; 对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。 例子 编辑 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1)并行设备的硬件寄存器(如:状态寄存器) 2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3)多线程应用中被几个任务共享的变量 这是区分C程序员和嵌入式系统程序员的最基本的问题

28335GPIO及外部中断配置介绍

ぐ巨炮叔叔 提交于 2019-12-13 03:20:06
本文转载连接: https://blog.csdn.net/E_ROAD_BY_U/article/details/53083151 弄了两周终于把28335的启动流程、寄存器及中断向量表的映射方法、内存的划分等有了一个全面的了解,今天看到久违的LED灯的闪烁,顿扫阴霾。特在此总结下28335GPIO及外部中断配置介绍。其实对于一个微控制器,只要能够独立实现这两个功能,也算是入门了。 一、GPIO口介绍 外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置。 F28335DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻

CPU

不问归期 提交于 2019-12-12 10:36:07
CPU 1. CPU是什么? 2.CPU 实际做什么? 3.CPU 的内部结构 4.CPU 是寄存器的集合体 5.计算机语言 6.汇编语言 7.程序计数器 8.条件分支和循环机制 9.标志寄存器 10.函数调用机制 11.通过地址和索引实现数组 12.CPU 指令执行过程 13.总结 1. CPU是什么? CPU 的全称是 Central Processing Unit ,它是你的电脑中最硬核的组件,这种说法一点不为过。CPU 是能够让你的计算机叫计算机的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。 它 是一种小型的计算机芯片 ,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 2.CPU 实际做什么? CPU 的核心是从程序或应用程序获取指令并执行计算。 此过程可以分为三个关键阶段: 提取,解码和执行 。 CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器 (英语:Random Access Memory,缩写:RAM),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以 随时读写 (刷新时除外)

实模式到保护模式:第11章读书笔记

无人久伴 提交于 2019-12-11 21:03:45
在这一章的主要任务就是从实模式进入保护模式 - 首先创建几个初始化描述符,确保在进入保护模式之后程序能够正常运行, - 将初始化描述符的内容放到GDT表中,此时虽然将GDT表的基地址和大小加载到GDT寄存器中,但是GDT表所在位置已经定义好了 - 接下来将GDT表所在位置和大小全部加载到GDT寄存器中 - 接下来开启第21根地址线,禁止中断,将cr0寄存器的PE位的值置为1,进入保护模式,但是此时还是处于16位的保护模式 2. 什么是GDT表? - 在保护模式中,内存访问方式与实模式不同,在实模式中,寻址方式是 段寄存器*16+偏移量 在32处理器中,段寄存器的结构发生了变化,结构如下 - 在保护模式下的内存访问的方式 - 段寄存器中存储的值为段描述符的索引,也就是0-15位可见部分 - 当将索引加载到寄存器中,处理器会自动到GDT表中根据索引找到对应的描述符,然后将描述符的内容加载到描述符高速缓冲器部分 - 内存访问的方式是根据段寄存器的高速缓冲器中的基地址的内容加上指令的偏移值(描述符的内容在将索引加载到寄存器时,会将描述符的值加载到寄存器的不可见部分),最终得到物理地址 - GDT表其实是对应了一块内存区域,GDT寄存器保存了GDT表的基地址和表的最大偏移量(GDT表的大小 - 1),所有的全局描述符都存储在这块内存区域中,便形成了GDT表 - GDT寄存器的格式如下: -

基础常用arm汇编指令

一个人想着一个人 提交于 2019-12-11 03:55:36
内存访问指令:ldr,str,ldm,stm ldr( Load from memory into register): ldr{条件} 目的寄存器 <存储器地址> 作用: 指令从内存中读出数据到寄存器中 比如: ldr r1, [r2,#4] //将地址r2+4的内存单元的数据读取到r1中 ldr r1,[r2] //将地址r2的内存单元的数据读取到r1中。 R1<——[R2] 注意:ldr中的第二个参数为=时,表示伪指令,或者表示内存访问指令 比如 ldr r1,=4096 ; str: Store from a register into memory 把指令寄存器的值储存到内存中。 比如: str r1,[r2,#4] //将r1的数据保存到地址为r2+4的内存单元中 str r1,[r2] //将r1的数据保存到地址为r2的内存单元中 R1——>[R2] ldm: Load from memory into many register 格式如下: ldm{cond}<addressing_mode> {!} {^} <addressing_mode>表示地址变化模式,有以下4中方式 1、ia(increment after):事后递增 2、ib(increment before):事先递增 3、da(decrement after):事后递减 4、db(decrement

PCI设备编号

空扰寡人 提交于 2019-12-11 02:44:02
1.PCI设备编号 每一个PCI device都有其unique PFA(PCI Fcntion Address) PFA由 bus number、device number、function number组成 一条PCI总线支持256个PFA,即支持256个PCI device 每个PCI芯片都有自己的device number(取决于IDSEL管脚),每个PCI芯片占用8个PFA。 每个PCI芯片的第一个PCI device的PFA必为8的倍数。 若PCI device的配置空间中PCI_HEADER_TYPE寄存器的最高bit为1,说明此芯片还有其他PFA,即还有其他device,即当前芯片是 multi-function device . Each function on a multi-function device has its own configuration space 在系统中,每个PCI芯片上的所独有的信号线是:INTA、INTB、INTC、INTD、IDSEL 每个芯片上的IDSEL需要连到PCI总线中AD[31:11]中的一根,这对应于PCI device PFA的device number IDSEL is equivalent to chip select on the CPU side during address phase of CFG RD

程序员需要了解的硬核知识之控制硬件

孤街醉人 提交于 2019-12-10 21:45:40
应用和硬件的关系 我们作为程序员一般很少直接操控硬件,我们一般通过 C、Java 等高级语言编写的程序起到间接控制硬件的作用。所以大家很少直接接触到硬件的指令,硬件的控制是由 Windows 操作系统 全权负责的。 你一定猜到我要说什么了,没错,我会说但是,任何事情没有绝对性,环境的不同会造成结果的偏差。虽然程序员没法直接控制硬件,并且 Windows 屏蔽了控制硬件的细节,但是 Windows 却为你开放了 系统调用 功能来实现对硬件的控制。在 Windows 中,系统调用称为 API ,API 就是应用调用的函数,这些函数的实体被存放在 DLL 文件中。 下面我们来看一个通过系统调用来间接控制硬件的实例 假如要在窗口中显示字符串,就可以使用 Windows API 中的 TextOut 函数。TextOut 函数的语法(C 语言)如下 BOOL TextOut{ HDC hdc, // 设备描述表的句柄 int nXStart, // 显示字符串的 x 坐标 int nYStart, // 显示字符串的 y 坐标 LPCTSTR lpString, // 指向字符串的指针 int cbString // 字符串的文字数 } 那么,在处理 TextOut 函数的内容时,Windows 做了些什么呢?从结果来看,Windows 直接控制了作为硬件的显示器。但 Windows

STM32 GPIO口的配置和应用

我的梦境 提交于 2019-12-10 16:38:31
STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) GPIO_Mode_IN_FLOATING 浮空输入 (3) GPIO_Mode_IPD 下拉输入 (4) GPIO_Mode_IPU 上拉输入 4种输出模式: (5) GPIO_Mode_Out_OD 开漏输出 (6) GPIO_Mode_Out_PP 推挽输出 (7) GPIO_Mode_AF_OD 复用开漏输出 (8) GPIO_Mode_AF_PP 复用推挽输出 四种输入模式: 1、一图记住上拉、下拉、浮空输入模式: 原理分析:图中箭头表示信号流动方向。从I/O引脚向左沿着箭头方向,首先遇到两个开关和电阻,与VDD相连的称为上拉电阻,与Vss相连的称为下拉电阻,再连接到施密特触发器(信号转换)把电压信号转化为0、1的数字信号,存储在输入数据寄存器(IDR)。然后通过设置配置寄存器(CRL、CRH)控制这两个开关,于是就可以得到GPIO的上拉输入、下拉输入模式和浮空输入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空输入模式中,输出缓冲器被禁止(P-MOS和N-MOS),施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接