数据寄存器

LMX2594的寄存器写入

馋奶兔 提交于 2020-01-20 11:21:58
这几天调试LMX2594时犯了一个经验主义的错误,2594的地址位7bit,数据位16bit,一开始采用了32bit的SPI写入方式,将高8位补零。之前调试ADI的芯片时都是这样处理的,没有问题。但由于TI的2594地址位在前,CSS下降沿时芯片已经有动作了(读取寄存器地址),上升沿时读取数据,因此这样的操作方式是不对的,SPI的数据长度必须设为24bit才行。 来源: CSDN 作者: sslee 链接: https://blog.csdn.net/sslee/article/details/104048099

STM32103ZET6 寄存器

纵饮孤独 提交于 2020-01-20 01:35:03
STM32103ZET6每组GPIO端口有7组寄存器 每组GPIO端口的寄存器共7个 【 GPIOx_CRL :端口配置低寄存器 GPIOx_CRH:端口配置高寄存器 GPIOx_IDR:端口输入寄存器 GPIOx_ODR:端口输出寄存器 GPIOx_BSRR:端口位设置/清除寄存器 GPIOx_BRR :端口位清除寄存器 GPIOx_LCKR:端口配置锁存寄存器 】 PS :每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问) 。所有IO口都可以作为中断输入。 GPIO端口基本结构 两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) 选择I/O模式 每组GPIO有16个IO口,每个IO口需要4位来控制,这4位分成两部分,每部分2位,低2 位的部分用于选择输入或输出、选择速度,高2位的部分用于选择输入或输出的模式 GPIOx_CRL用于控制低8个IO口 (例GPIOA_CRL控制PA0-PA7,GPIOx_CRH用于控制高8个IO口(例GPIOA_CRH控制PA8-PA15) 端口输入数据寄存器( GPIOx_IDR ) 读取I/O口电平 端口输出数据寄存器 ( GPIOx_ODR ) 控制I/O口输出 端口位设置/清除寄存器(GPIOx_BSRR) 间接地设置ODR来控制端口输出 端口位清除寄存器(GPIOx_BRR)

C/C++中volatile关键字详解

拥有回忆 提交于 2020-01-17 05:18:36
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier 。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided. volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法: int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如: 1 volatile int i=10; 2 int a = i; 3 ... 4 // 其他代码,并未明确告诉编译器,对 i

STM32 串口

对着背影说爱祢 提交于 2020-01-17 03:23:28
学习笔记 一、STM32的APB1与APB2总线及挂载到该总线的设备 APB1总线上的设备 DAC PWR BKP bxCAN USB IIC1 IIC2 UART2~ 5 TIM2~ 7 RTC WWDG IWDG SPI2/I2S SPIS/I2S APB2总线上的设备 ADC1~ 3 UART1 SPI1 TIM1 TIM8 GPIOx EXTI AFIO 如果是APB1总线上的设备则使用RCC_APB1PeriphClockCmd() 函数使能时钟; 如果是APB2总线上的设备则使用RCC_APB2PeriphClockCmd() 函数使能时钟; 二、串口设置的一般步骤 串口时钟使能, GPIO 时钟使能 串口复位 GPIO 端口模式设置 串口参数初始化 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 使能串口 编写中断处理函数 对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式 1.串口时钟使能。 RCC_APB2PeriphClockCmd(); 2.串口复位。 一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数 USART_DeInit()中完成: void USART_DeInit(USART_TypeDef* USARTx);//串口复位 3

Linux内核分析课程笔记(一)

牧云@^-^@ 提交于 2020-01-17 02:29:49
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机。 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连。CPU上有一些寄存器,IP(Instruction Pointer)是一个指针,总是指向内存的某一块区域CS(Code Segment),CPU即从IP指向的地址取一条指令进行执行,执行完之后IP自增1,加到下一条指令(逻辑意义上的1,因为有些指令系统是变长指令) 从程序员的角度来看,存储程序计算机。CPU从程序员的角度可以抽象成一个无条件的for循环,总是执行下一条指令。 for(;;){ next instruction(); } API(Application Program Interface) ABI(Application Binary Interface) 32位的x86中EIP的三条特性: 每条指令执行完成后EIP自加1 指令的长度不同 EIP还可能会被一些指令修改,如:CALL、RET、JMP以及条件JUMP x86汇编基础 x86寄存器 有8位、16位和32位的寄存器。 16位:AX、BX、CX、DX、BP、SI、DI、SP 32位:EAX(累加器)、EBX(基地址寄存器)、ECX(计数寄存器)、EDX(数据寄存器)、EBP(堆栈基址指针)、ESI与EDI(变址寄存器)

FPGA中的时序分析(一)

有些话、适合烂在心里 提交于 2020-01-16 19:52:47
谈及此部分,多多少少有一定的难度,笔者写下这篇文章,差不多是在学习FPGA一年之后的成果,尽管当时也是看过类似的文章,但是都没有引起笔者注意,笔者现在再对此知识进行梳理,也发现了有很多不少的收获。笔者根据网上现有的资源,作进一步的总结,希望能够有所帮助。 一个不错的网站,类似于一个手册,随时可以去查询如何去定义各个时序约束指令怎么用。http://quartushelp.altera.com/current/mergedProjects/tafs/tafs/tcl_pkg_sdc_ver_1.5.htm 静态时序分析(STA,static timing analysis),对于STA的理解,可以想象在FPGA的内部好比一块PCB,FPGA的逻辑阵列好比PCB板上的一些分立元器件,PCB通过导线将具有相关电气特性的信号相连接,FPGA也需要通过内部连线将相关的逻辑节点导通,PCB上的信号通过任何一个元器件都会产生一定的延时,FPGA的信号通过内部逻辑门传输也有一定的延时,PCB信号走线也有延时,FPGA信号走线也有延时,这就带来了一系列的问题,一个信号从FPGA的一端输入,经过一定的逻辑处理后从FPGA的另一端输出,这期间会产生多大的延时呢?有多个总线信号从FPGA的一端输入,这条总线的各个信号经过逻辑处理之后从FPGA的另一端输出,这条总线的各个信号的延时一致吗?之所以关心这些问题

volatile的使用

微笑、不失礼 提交于 2020-01-16 06:51:12
一个定义为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因为它可能被意想不到地改变

汇编语言学习分享(三)

扶醉桌前 提交于 2020-01-15 21:56:37
字的存储 在上一篇中说到一个16位寄存器可以存放一个字(16位)或者一个字节(8位),当存放一个字节的时候只需要一个内存单元(内存单元是以字节为单位的,8位),而存放一个字需要两个内存单元,这样存放一个字就需要两个连续的内存单元,这个16位的字, 高位存放在高地址,低位存放在低地址 。 内存地址 内存数据 0 20H 1 4EH 2 12H 3 00H 对于字来说0就是低地址单元,1是高地址单元,则字型数据4E20H的低地址位20存放在0号单元,高地址位4E存放在高地址单元,因为它的起始地址为0,又可以称作0地址字单元。 段地址寄存器 通过前面学过的知识我们可以知道当CPU想要对一个内存单元进行操作时,必须知道它的地址,要知道内存单元的地址就要知道它的段地址和偏移地址,在8086 CPU中,DS寄存器就是用来存放段地址的,执行指令的时候,CPU会自动读取DS中的数据为内存单元的段地址,使用 [偏移地址] 来表示偏移地址,假设DS寄存器中此时存放的是1000H,那么 mov al,[0] 就表示将10000H(物理地址=段地址x16+偏移地址)地址上存放的数据存到al中。 如果想要修改DS寄存器中的值,那么直接使用mov指令将数字存到DS寄存器中是不行的,只能先将值存到一个寄存器中,再使用mov指令将这个寄存器中的值存到DS中,例: mov bx,1000H mov ds,bx

STM32的RTC学习笔记

一个人想着一个人 提交于 2020-01-14 14:36:47
STM32的RTC学习笔记 Mcu:STM32F103RBT6 1、RTC简介 RTC(Real Time Clock)实时时钟,是STM32片内的一个外设,这个外设使用起来跟普通定时器有一点区别,他是独立的一个定时器,并且能产生两个中断,秒中断和闹钟中断,他的时钟源可以由外部或内部驱动,由使用者选择,一些教程说RTC使用内部低速时钟(LSI)的时钟频率不准,可能跑久了以后就会出现误差。 2、RTC配置流程 1、使能RTC外设时钟 RCC_APB1PeriphClockCmd ( RCC_APB1Periph_PWR , ENABLE ) ; //RTC时钟使能(电源) RCC_APB1PeriphClockCmd ( RCC_APB1Periph_BKP , ENABLE ) ; //RTC时钟使能(备份) 2、使能备份寄存器访问 PWR_BackupAccessCmd ( ENABLE ) ; //使能备份寄存器访问 开启后才能对备份寄存器进行访问,后期可以讲数据写进备份寄存器里,以防掉电数据丢失。 3、初始化备份寄存器 BKP_DeInit ( ) ; //初始化备份配置 4、时钟源选择与使能 RCC_LSICmd ( ENABLE ) ; //使能内部低速时钟 while ( RCC_GetFlagStatus ( RCC_FLAG_LSIRDY ) == 0 ) ; /

volatile的作用

柔情痞子 提交于 2020-01-14 08:51:29
[转] http://blog.21ic.com/user1/2949/archives/2007/35599.html   一个定义为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; }