使用C语言操作事件管理器的寄存器教材
c语言给寄存器赋值原理
c语言给寄存器赋值原理摘要:I.引言- 介绍C语言和寄存器的基本概念II.寄存器的概念和作用- 定义寄存器- 寄存器的作用III.C语言给寄存器赋值的基本原理- 数据类型与内存分配- 寄存器的赋值操作IV.实际应用案例- 一个简单的C语言程序示例V.总结- 总结C语言给寄存器赋值的原理及应用正文:C语言是一种通用的、过程式的计算机程序设计语言,广泛应用于各种嵌入式系统、操作系统和应用程序的开发。
在C语言中,寄存器是用于暂存计算过程中的数据的一种硬件设备。
寄存器的速度非常快,可以显著提高程序的运行效率。
因此,了解C语言给寄存器赋值的原理对于程序设计者来说是非常重要的。
寄存器是计算机中的一种重要资源,用于存储计算过程中的数据和指令。
它具有高速、低功耗和可读写等特点。
在C语言中,寄存器可以分为通用寄存器、程序计数器、指令寄存器、状态寄存器等。
通用寄存器主要用于存储程序运行过程中的数据,包括整数、浮点数和指针等。
C语言给寄存器赋值的基本原理是通过数据类型和内存分配来实现的。
首先,程序设计者需要根据程序的需求定义数据类型,如整型、浮点型和指针型等。
然后,通过变量声明语句分配内存空间,将数据类型与内存地址关联起来。
最后,使用赋值操作将数据存储到寄存器中。
在C语言中,赋值操作通常使用“=”号表示。
例如,以下代码将整数10赋值给寄存器r0:```cint r0 = 10;```类似地,可以使用“=”号将其他数据类型(如浮点数、指针等)赋值给寄存器。
除了通用寄存器,C语言还支持对特殊功能寄存器(SFR)进行操作。
特殊功能寄存器是单片机内部的一种寄存器,用于存储一些特定的数据,如中断向量表、定时器/计数器等。
在C语言中,可以使用“sfr”关键字定义特殊功能寄存器,并通过“=”号对其进行赋值操作。
例如:```csfr P0 = 0x80;```该代码定义了一个名为P0的特殊功能寄存器,其地址为0x80。
总之,C语言给寄存器赋值的原理是通过数据类型、内存分配和赋值操作实现的。
DSP芯片应用系列讲座_五_第9讲TMS320C28x的事件管理器
DSP 芯片应用系列讲座(五)第9讲 T M S 320C 28x 的事件管理器郭国良1,张雄伟2(1.解放军理工大学通信工程学院研究生1队,江苏南京210007;2.解放军理工大学通信工程学院电子信息工程系)摘 要:文章介绍了T I 公司新近推出的T M S 320C 28x 系列32位定点DSP 芯片的事件管理器。
T M S 320C 28x内部集成了两个独立的事件管理器单元。
它们可以分别用于产生P WM 波形、进行正交编码脉冲解码、记录电平转换等。
文中介绍了事件管理器的功能,并针对PW M 波形产生的应用,举了实用的例子。
关键词:事件管理器;数字信息处理;脉宽调制中图分类号:T N 911.72文献标识码:A文章编号:CN 32-1289(2006)01-0072-05Event Manager of TMS 320C 28x DSPGuo Guo -liang 1,Zhang X iong -w ei2(1.P ostg raduate T ea m 1ICE,P L A U ST ,Nanjing 210007,China ;2.Depar tment o f Electr onic Info rmat ion Engineer ing ICE ,P LA U ST )Abstract :T his paper introduced the Event M anager (EV)of the T MS320C28x 32-bit fix ed-po int digital signal pro cessor developed by T I recently.T he T MS320C28x has tw o EV mo dules w hich can r un individually .T he EV m odules can be used to produce PWM w ave ,decode the quadratur e -encoder pulse ,and r ecord the sig nal lev el tr ansitions .The functions o f EV w ere intro duced,and the example of PWM w ave productio n w as o ffer ed.Key words :event manag er ;DSP;PWMT MS 320C 28x 是美国T I 公司新近推出的DSP 芯片,它既可以作为通用的数字信号处理芯片使用,又可以满足控制方面需要。
C语言位运算实现原码一位乘法3寄存器和2寄存器版本计组
C语言位运算实现原码一位乘法3寄存器和2寄存器版本计组在计算机体系结构中,位运算被广泛应用于实现各种算术和逻辑操作。
原码一位乘法是一种常见的位运算操作。
原码一位乘法是指针对两个二进制原码数进行乘法运算,并输出结果。
在实现原码一位乘法时,可以使用3寄存器版本或2寄存器版本的方案。
以下是对这两种版本的详细解释。
3寄存器版本:3寄存器版本的原码一位乘法需要三个寄存器来存储输入、输出以及中间结果。
假设输入数据为A和B,输出结果为C。
算法的步骤如下:1. 初始化寄存器:将A和B分别存储在寄存器A和B中,将C清零,将一个名为"carry"的寄存器置为0。
2.进行循环:通过移位操作,将A的最低位与B相乘,并将结果累加到寄存器C中。
3. 进行移位和判断:在每次移位后,检查A的最低位是否为1,如果是,则将carry寄存器与B相加(进位操作),并将结果存储回寄存器C中。
4.进行下一次循环:重复步骤2和步骤3,直到A的所有位都被处理完毕。
最终,寄存器C中存储的就是最终的乘法结果。
2寄存器版本:2寄存器版本的原码一位乘法只需要两个寄存器来存储输入和输出。
算法的步骤如下:1.初始化寄存器:将A和B分别存储在寄存器A和B中。
2.进行循环:通过移位操作,将A的最低位与B相乘,并将结果累加到寄存器B中。
3.进行移位和判断:在每次移位后,检查A中的最低位是否为1,如果是,则将B左移一位,并将上一步的结果与B相加。
4.进行下一次循环:重复步骤2和步骤3,直到A的所有位都被处理完毕。
最终,寄存器B中存储的就是最终的乘法结果。
以上是对C语言位运算实现原码一位乘法的3寄存器版本和2寄存器版本的详细解释。
通过这些算法,可以实现高效且准确的二进制原码一位乘法运算。
C语言操作硬件设备
C语言操作硬件设备C语言是一种广泛应用于嵌入式系统开发、驱动程序编写以及底层硬件操作的编程语言。
通过C语言的强大功能和直接的硬件访问能力,开发者可以利用它来操作各种硬件设备,如传感器、执行器、嵌入式控制器等。
本文将介绍C语言操作硬件设备的基本原理和常用方法。
一、硬件设备的基本概念在开始讲解C语言操作硬件设备之前,首先需要了解一些与硬件设备相关的基本概念。
1.1 寄存器寄存器是一种用于存储和操作数据的特殊硬件设备。
在计算机系统中,寄存器是最快的存储器,并且通常直接与CPU相关联。
通过读写寄存器,我们可以与硬件设备进行数据交互。
1.2 端口端口是一种物理接口,用于将计算机与外部硬件设备连接起来。
通过读写端口,我们可以与外设进行通信和控制。
1.3 中断中断是一种机制,用于在硬件设备需要与CPU通信时通知CPU进行响应。
通过中断,我们可以实现实时的硬件设备响应和数据处理。
二、基于C语言的硬件操作方法C语言提供了一系列标准库函数和语法,使得开发者能够直接访问和控制硬件设备。
2.1 使用指针操作寄存器通过定义指针变量,我们可以将地址与寄存器相关联,从而实现对寄存器的操作。
例如,通过指针变量可以读取寄存器中的值,并将特定数据写入寄存器。
2.2 调用库函数操作端口C语言提供了一些库函数,可以直接操作端口。
例如,通过调用outportb函数,可以向特定的端口输出数据。
2.3 处理中断C语言提供了中断处理函数,可以实现硬件中断的响应。
通过编写中断处理函数,我们可以在硬件设备触发中断时进行相应的处理操作。
三、实例:使用C语言操作LED灯为了更好地理解C语言操作硬件设备的方法,下面以操作一个LED 灯为例,介绍在嵌入式系统中如何使用C语言来控制硬件设备。
3.1 硬件连接首先,将LED灯与嵌入式控制器的某个GPIO引脚连接起来。
GPIO引脚是一种通用输入输出引脚,可以用于连接各种外设。
3.2 初始化引脚在程序开始时,我们需要初始化GPIO引脚,以配置引脚的输出模式和初始电平状态。
c语言给寄存器赋值原理
c语言给寄存器赋值原理摘要:I.引言- 介绍C 语言- 介绍寄存器II.C 语言与寄存器- 寄存器在C 语言中的作用- C 语言如何操作寄存器III.给寄存器赋值原理- 赋值操作的语法- 内存与寄存器的关系- 具体赋值过程IV.不同类型的寄存器- 整数寄存器- 浮点寄存器- 指针寄存器V.寄存器的应用- 实际编程中的寄存器使用- 寄存器在算法优化中的应用VI.总结- 总结寄存器在C 语言中的重要性- 概括寄存器赋值原理正文:C 语言是一种广泛应用于计算机编程的语言,其简洁、高效的特性深受程序员的喜爱。
在C 语言中,寄存器是起到存储数据作用的硬件设备。
了解C 语言与寄存器之间的关系以及寄存器赋值的原理,对于深入理解C 语言编程是非常有帮助的。
寄存器在C 语言中的作用主要体现在它能够存储变量和函数的返回地址等。
C 语言通过操作寄存器来实现变量的赋值、函数调用等操作。
在C 语言中,我们可以使用赋值操作将数据存储到寄存器中,从而实现对寄存器的操作。
在C 语言中,赋值操作的语法如下:```寄存器= 表达式;```其中,`寄存器` 是要赋值的寄存器,`表达式` 是要存储在寄存器中的值。
在执行赋值操作时,首先会计算表达式的值,然后将该值存储到寄存器中。
内存与寄存器的关系在C 语言中是非常紧密的。
内存可以看作是一个大容量的寄存器,而寄存器则是内存的缩影。
在实际编程过程中,我们通常会使用内存来存储数据,而寄存器则用于存储经常访问的数据,以提高程序的运行效率。
在具体赋值过程中,C 语言首先会将表达式的值计算出来,然后将该值存储到寄存器中。
这个过程包括了数据类型的转换、算术运算、内存访问等操作。
不同类型的寄存器在赋值过程中会有不同的处理方式。
除了整数寄存器和浮点寄存器之外,C 语言中还有一种特殊的寄存器——指针寄存器。
指针寄存器用于存储变量或函数的地址,可以实现对内存的直接访问。
指针寄存器的使用在C 语言中非常常见,也是C 语言灵活性和高效性的重要体现。
LabWindowsCVI基础指导教程
LabWindows/CVI基础指导教程1. 简介LabWindows/CVI是一种基于C语言的集成开发环境(IDE),广泛应用于数据采集、实验控制和测试自动化等领域。
本教程旨在为初学者提供关于LabWindows/CVI的基础指导,包括环境安装、项目创建、界面设计和编程等方面的内容。
2. 环境安装在开始使用LabWindows/CVI之前,我们首先需要安装LabWindows/CVI的运行环境。
按照以下步骤进行安装:1.下载LabWindows/CVI安装程序,并运行安装程序。
2.在安装程序中选择安装路径,并点击“下一步”进行安装。
3.根据提示完成安装过程。
安装完成后,我们就可以开始创建LabWindows/CVI项目了。
3. 项目创建LabWindows/CVI使用项目(Project)的方式来组织和管理代码。
下面是创建新项目的步骤:1.打开LabWindows/CVI IDE。
2.点击“文件”菜单,并选择“新建项目”。
3.在弹出的对话框中选择项目类型和保存路径,然后点击“确定”。
4.在新建项目的基础上,可以添加文件、配置编译选项等。
4. 界面设计LabWindows/CVI提供了UI工具箱,可以通过拖拽控件来设计界面。
下面是界面设计的基本步骤:1.打开项目。
2.点击“窗体”菜单,并选择“添加窗体”。
3.在窗体设计器中,可以拖拽控件到窗体中,并调整位置和大小。
4.可以通过属性编辑器来设置控件的属性和事件。
界面设计完成后,我们可以进行程序的编程。
5. 编程LabWindows/CVI使用C语言进行编程。
下面是编程的基本步骤:1.打开窗体设计器,选择需要编写代码的控件。
2.双击控件,进入控件的事件处理函数。
3.在事件处理函数中编写代码,实现相应的功能。
4.可以使用LabWindows/CVI提供的函数库来完成各种操作,如数据采集、图形绘制等。
除了事件处理函数,我们还可以创建其他类型的函数来实现更复杂的功能。
STM32系列单片机原理及应用-C语言案例教程 第4章 STM32单片机的中断系统及定时器
STM32中断相关的概念
3.中断屏蔽
中断屏蔽是中断系统中的一个重要功能。 在嵌入式系统中,通过设置相应的中断屏蔽位,禁止CPU响应 某个中断,从而实现中断屏蔽。 中断屏蔽的目的:是保证在执行一些关键程序时不响应中断。 对于一些重要的中断请求是不能屏蔽的,如重新启动、电源故障、 内存出错、总线出错等影响整个系统工作的中断请求。 因此,根据中断是否可以被屏蔽划分,中断可分为可屏蔽中断 和不可屏蔽中断两类。
第4章 STM32单片机的 中断系统及定时器
第4章 STM32单片机中断系统及定时器
内容提要:
介绍了STM32单片机的中断系统、中断基本的概念、 嵌套向量中断控制器NVIC、外部中断及中断使用步骤,还 描述定时器/计数器,定时器的分类及相关寄存器的使用 方法,介绍了中断控制向量NVIC和外中断EXTI,并在例题 提供相应的中断程序,演示了外部中断控制LED。
名称
地址
优先级类 型
说明
—
0X00—0000 —
保留
复位
NMI
0X00—0008 固定
不可屏蔽中断,RCC 时钟安全系 统(CSS)连接到 NMI 向量
HardFault MemManage BusFault UsageFault
SVCall DebugMonitor — PendSV SysTick WWDG
内容安排
中 中断 断控 系制 统器
外 部 中 断
定 时 器
计 数 器
NVIC
第4章 中断系统及定时器
STM32单片机的中断系统:
本章学习要求:
1.了解STM32中断相关的概念 2.了解STM32嵌套向量中断控制器NVIC 3.了解STM32外部中断/事件控制器
8086寄存器的用法
8086寄存器的用法:
8086微处理器包含多个寄存器,每个寄存器都有其特定的用途。
以下是一些常用的8086寄存器及其用法:
1累加器寄存器(ACC):这是8086中最常用的寄存器之一。
它用于暂存操作数,并在算术和逻辑运算中作为累加器使用。
2通用寄存器(R0-R7):这些寄存器可用于存储数据和地址。
它们可以用于算术、逻辑和移位操作。
3指针寄存器(SP、BP、IP):
堆栈指针(SP):用于指示堆栈顶部的位置。
基址指针(BP):通常用于访问堆栈中的数据或间接寻址。
指令指针(IP):指向当前正在执行的指令。
4段寄存器(CS、DS、SS、ES):这些寄存器用于存储段地址。
每个段寄存器都与一个特定的内存段相关联,例如代码段、数据段或堆栈段。
5标志寄存器(FLAGS):这是一个特殊的寄存器,用于存储状态标志,如零标志、进位标志、溢出标志等。
这些标志可用于控制程序的执行流程。
6控制寄存器:包括CR0、CR1、CR2和CR3,这些寄存器用于控制CPU的某些功能和特性。
c 汇编教程
汇编语言教程涉及的内容广泛,包括汇编指令、汇编器和链接器、汇编语法等。
下面将介绍汇编语言的一些基础知识:
汇编指令:汇编指令是特定CPU架构的指令码的助记符,例如在Intel x86 32位下,ADD指令对应的16进制机器码有04/05/80/81等。
操作对象通常是寄存器、内存地址、I/O端口等,具体操作对象通过指令码后面的一个或者多个的1字节辅助操作码指定。
汇编器和链接器:汇编器的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。
链接器则将多个目标代码和相关的库文件链接在一起,生成可执行程序。
汇编语法:汇编语言有自己的固定格式,例如数据段、堆栈段和代码段。
每个段都有其特定的用途,代码段用于放置程序的实际执行代码,数据段用于放置初始化的变量和数组,堆栈段用于存储局部变量和函数调用的返回地址。
此外,C语言中也可以嵌入汇编代码,使用GDB反汇编进行调试等。
以上内容仅供参考,建议查阅专业书籍或咨询专业人士以获取更全面和准确的信息。
Keil使用教程详细教程PPT课件
15)View Trace Records: 显示执行过的指令
16)Memory Map…: 打开存储空间配置对话框
17)Performance Analyzer…: 打开性能分析设置窗口
18)Inline Assembly…:对某一行重新汇编, 且可以修改汇编代码
显示或隐藏工作簿窗口的标签 19)Option…: 设置颜色、字体、快捷键和编辑器选项
2 Keil C操作界面
四、工程(Project)菜单
1)New Project…: 创建一个新工程 2)Import µVision2 Project…:
导入工程文件 3)Open Project:打开一个已有工程 4)Close Project:关闭当前工程 5)Components Environment and Books:
9)Goto Next Bookmark移光标到下一书签
10)Goto Previous Bookmark:
移光标到上一个书签
2 Keil C操作界面
11)Clear All Bookmark: 清除当前文件中所有的书签
12)Find… 13)Replace…:查找与替换 14)Find in Files…:
2)Go:全速运行 3)Step:跟踪运行 4)Step Over:单步运行 5)Step out of current function:
一步执行完当前函数并返回 6)Run to Cursor line:
一步运行到当前光标处 7)Stop Running:停止运行
2 Keil C操作界面
8)Breakpointing…:打开断点对话框 9)Insert/Remove Breakpoint:
第01章 ucGUI的介绍
第1章 µC/GUI的介绍µC/GUIµC/GUI是一种用于嵌入式应用的图形支持软件。
它被设计用于为任何使用一个图形LCD 的应用提供一个有效的不依赖于处理器和LCD控制器的图形用户接口。
它能工作于单任务或多任务的系统环境下。
µC/GUI适用于使用任何LCD控制和CPU的任何尺寸的物理和虚拟显示。
它的设计是模块化的,由在不同的模块中的不同的层组成。
一个层,称作LCD驱动程序,包含了对LCD的全部访问。
µC/GUI适用于所有的CPU,因为它100%由的ANSI的C语言编写的。
µC/GUI很适合大多数的使用黑色/白色和彩色LCD的应用程序。
它有一个很好的颜色管理器,允许它处理灰阶。
µC/GUI也提供一个可扩展的2D图形库和一个视窗管理器,在使用一个最小的RAM时能支持显示窗口。
本文档的目的本指南描述如何安装,配置和在嵌入式应用中使用µC/GUI图形用户界面。
它也说明了软件的内部结构。
假设本指南假定你对C编程语言已经具有一个扎实的认识。
如果你觉得你对C语言的认识不是很充分的话,我们推荐该由Kernighan和Richie编写的“C语言编程语言”给你,它描述了程序设计标准,而在新版中,也包含了ANSI的C语言标准。
汇编语言编程的知识不需要。
µC/GUI中文手册第1页1.1 需求在你使用µC/GUI进行软件开发时,并不需要一个目标系统;只需要使用模拟器,大多数软件就能够进行开发。
然而,最后的目的通常是能够在一个目标系统上运行该软件。
目标系统(硬件)你的目标系统必须:• 有一个CPU(8/16/32/64位)• 有最少的RAM和ROM• 有一个完全的图形LCD(任何类型和任何分辩率)内存需求的变化取决于软件的哪些部分被使用以及你的目标编译程序的效率有多高。
所以指定精确值是不可能的,但是下面的数值适合典型系统。
和利时DCS培训讲义-ConMaker
第六讲
1 POU 分类
POU(程序组织单元)介绍
POU 即程序组织单元(Program Organization Unit) 。控制算法组态的过程就是按照控制方案的设计, 创建所需的一系列 POU,在 POU 中编写相应的控制运算回路,从而实现期望的控制运算。 POU 分为三种: 程序(PROGRANM) 、功能块(FUNCTION_BLOCK) 、函数(FUNCTION) 。三种 POU 的介绍见《ConMaker 培训教 材》P51。 定义程序的关键字:PROGRANM 程序名 定义功能块的关键字:FUNCTION_BLOCK 功能块名 定义函数的关键字:FUNCTION 函数名:数据类型
2 新建工程
1) 新建工程 2) 选择目标“Hollysys codesys sp for QNX” ,目标设置: � Memory layout / 保留型数据的内存空间最大值的修改(如:16#8000) � General / 选中“下载符号文件” 3) 建立主程序,名为“MACS_PRG” (PROGRAM 类型)。 4) 工程 / 选项 / 选中“输出符号条目” (参数设置) 5) 窗口 / 库管理器 / 添加函数库 6) 保存工程:文件类型“*.pro” 注意:一个 ConMaker 工程只针对一个现场控制站!例如有三套现场控制站,则需要建立三个相应 的 ConMaker 工程。
第 4页/共 10页 2010-8-10
�
和利时公司工程一部软件部培训组 ——ConMaker 培训讲义 即为: � 简单型变量名称:数据类型; (*点说明*) 例如:AM01:REAL; (*模拟变量 01*) 关于简单型变量的数据类型的介绍详见《ConMaker 培训教材》P45- P 47。
编程社第一课
使用C语言操作DSP的寄存器PPT课件
了解SCI的寄存器
寄存器名
地址
占用空间
功能描述
SCICCR SCICTL1 SCIHBAUD SCILBAUD SCICTL2 SCIRXST SCIRXEMU
0x0000 7050 0x0000 7051 0x0000 7052 0x0000 7053 0x0000 7054 0x0000 7055 0x0000 7056
union SCIFFTX_REG SCIFFTX; // FIFO 发送寄存器
union SCIFFRX_REG SCIFFRX; // FIFO 接收寄存器
union SCIFFCT_REG SCIFFCT; // FIFO 控制寄存器
Uint16 rsvd2;
// 保留
Uint16 rsvd3;
SCITXBUF SCIFFTX SCIFFRX
0x0000 7059 0x0000 705A 0x0000 705B
16位 16位 16位
SCI-A发送数据缓冲寄存器 SCI-A FIFO发送寄存器 SCI-A FIFO接收寄存器
SCIFFCT SCIPRI
0x0000 705C 0x0000 705F
{
union SCICCR_REG SCICCR; //通信控制寄存器
union SCICTL1_REG SCICTL1; // 控制寄存器1
Uint16
SCIHBAUD; // 波特率寄存器(高字节)
Uint16
SCILBAUD; // 波特率寄存器(低字节)
union SCICTL2_REG SCICTL2; // 控制寄存器2
bit.SCICHAR=7; //SCI字符长度控制位为8位
第13页/共38页
c指令系统课件
⑶ 片外RAM低256单元,除了可使用DPTR作为间址寄存器外, 也可使用R0或R1作间址寄存器。例如:MOVX A,@R0.即把 R0指定的片外RAM单元的内容送累加器A。
⑷ 堆栈区:堆栈操作指令(PUSH和POP)也应算作是寄存器 间接寻址,即以堆栈指针(SP)作间址寄存器的间接寻址方式。
操作码 地址码
数据或地址码
如MOV A,#data 8位立即数data需占一个字节,操作码不能省 却,也需一个字节。
⑶ 三字节指令:在三字节指令中,操作码占一个字节,操 作数占两个字节。其中操作数既可能是数据,也可能是地址。在 80C51系列的指令系统中,共有17条三字节指令。
操作码
数据或地址码 数据或地址码
⑴ 低128单元,在指令中直接以单元地址形式给出。 ⑵ 特殊功能寄存器,这时除可以单元地址形式给出外,还可以 寄存器符号形式给出。虽然特殊功能寄存器可以使用符号标志, 但在指令代码中还是按地址进行编码的。
应当说明的是,直接寻址是访问特殊功能寄存器的唯一方法。
c指令系统
3.寄存器寻址
寄存器寻址是指在指令中将指定寄存器的内容作为操作数。 因此指定了寄存器就能得到操作数。
数据传送指令的一般操作是把源操作数传送到目的操作 数,指令执行后源操作数不变,目的操作数被修改为源操作数。 若要求进行数据传送时,目的操作数不变,则可以用交换指令。
3.1 80C51指令系统概述
80C51指令系统专用于80C51系列单片微机,是一个具有 255种操作码 (00H至FFH,除A5H外) 的集合。
用汇编语言表达操作代码时,只要熟记42种助记符。42种 助记符代表了33种功能,因为有的功能如数据传送,可以有几种 助记符,如MOV、MOVC、MOVX。而指令功能助记符与操作 数各种寻址方式的结合,共构造出111种指令,同一种指令所对 应的操作码可以多至八种 (如指令中Rn对应寄存器R0-R7) 。
C语言:寄存器操作
C语⾔:寄存器操作C语⾔:寄存器操作在对芯⽚进⾏开发时,我们对芯⽚的操作本质上就是对芯⽚底层寄存器进⾏操作,在C语⾔中对寄存器进⾏操作则是通过寄存器的地址进⾏数据的赋值,那这个过程是如何实现的呢?我们在学习单⽚机时,会使⽤到单⽚机⼚商提供 SDK,会遇到如下的代码/** CCM相关寄存器地址*/#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)这些代码⽤宏定义来替换掉寄存器的地址,⽅便⽤户直接使⽤宏定义名称来操作寄存器,最关键的部分就是下⾯这段代码:*((volatile unsigned int *)0X020C4068)这部分代码就是⽤来映射寄存器,使⽤volatile unsigned int *来将⼀个寄存器地址强制转化为unsigned int的指针,同时使⽤volatile关键字对寄存器地址进⾏修饰,告诉编译器,该地址运⾏过程中随时可能变化,编译时不要过优化该地址!关于volatile的⽤法可以看我之前的⽂章:在将寄存器地址强制转化为指针地址后,在前⾯在加上 * 指向地址存放的值,之后我们直接调⽤宏定义就可以操作寄存器了,如下CCM_CCGR0 = 0xffffffff;CCM_CCGR1 = 0xffffffff;CCM_CCGR2 = 0xffffffff;CCM_CCGR3 = 0xffffffff;CCM_CCGR4 = 0xffffffff;CCM_CCGR5 = 0xffffffff;CCM_CCGR6 = 0xffffffff;以上⼀般就是对芯⽚寄存器进⾏开发时常⽤的操作⼿段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EVA的结构体 EVA_REGS中,有 的成员是union类 型的,有的是Uint16 类型的,union的既 可以实现整体操作, 也可以按位操作, 而Uint16的只能按
}; union GPTCONA_REG GPTCONA; //声明一个共同体变量GPTCONA
对寄存器定义了共同体之后,就可以对寄存器进行整体的或者按位 的操作,这种二选一操作方式的实现正是定义共同体的优势所在.
创建结构体文件
EVA/B中除了通用定时器全局控制寄存器GPTCONA外,还有许多其它的 寄存器,为了便于管理,需要创建一个结构体,用来包含EV中的所有的寄存器.
▲ 定义了EVA中所有寄存器的结构体
struct EVA_REGS { union GPTCONA_REG GPTCONA; Uint16 T1CNT; Uint16 T1CMPR; Uint16 T1PR; union TCONA_REG T1CON; Uint16 T2CNT; Uint16 T2CMPR; Uint16 T2PR; union TCONA_REG T2CON; union EXTCONA_REG EXTCON; Uint16 rsvd1[7]; union COMCONA_REG COMCONA; Uint16 rsvd2; union ACTRA_REG ACTR; Uint16 rsvd3; union DBTCON_REG DBTCONA; Uint16 rsvd4; Uint16 CMPR1; Uint16 CMPR2;
第六章 使用C语言操作事件管理寄存器
一、寄存器的C语言访问 二、寄存器文件的空间分配 三、使用C语言设置通用定时器 四、使用C语言设置比较单元 五、使用C语言设置捕获单元与QEP电路
一、寄存器的C语言访问
F2812的寄存器能够实现对系统和外设功能的配置与控制, 因此在F2812的开发中对寄存器的操作是极为重要的,操作寄存 器常用的语言有两种,汇编和C语言,而采用C语言更加形象,更 加有助于理解.本讲就以事件管理器寄存器的操作为例,讲解如 何使用C语言对F2812的寄存器进行操作.
个字节; √ 位域的长度不能大于一个字节的长度,也就是说一个位域不能超过8位;
Struct bs
{ int a: 4; int :0; //空域 int b:5; //从第2个字节开始存放 int c: 3;
};
Struct bs
{ int a: 4; int :2; //这2位不能使用 int b:2; //从第2个字节开始存放 int c: 5; int d: 3;
};
位域定义实例
▲ 定义一个位域bs
6位
2位
c
b
8位
struct bs //定义位域bs {
int a:8; int b:2;
int c:6; }; //这里的分号不能省略 struct bs bs1;//声明bs型变量bs1
a
▲ EVA/B中通用定时器全局控制寄存器位域定义
D15 D14 D13
使用位定义的方法定义寄存器
▲ 什么是位域
所谓位域,就是将一个字节中的二进制位划分为几个不同的区域,并 说明每个区域的位数,每个域都有一个域名,允许在程序中按域名进行操 作.位域的定义和位域变量的说明同结构体定义和其成员说明类似,其语 法格式如图:
Struct 位域结构名
{ 类型说明符 位域名 1:位域长度 类型说明符 位域名 2:位域长度
Uint16 CMPR3; Uint16 rsvd5[6]; union CAPCONA_REG CAPCON; Uint16 rsvd6; union CAPFIFOA_REG CAPFIFO; Uint16 CAP1FIFO; Uint16 CAP2FIFO; Uint16 CAP3FIFO; Uint16 rsvd7; Uint16 CAP1FBOT; Uint16 CAP2FBOT; Uint16 CAP3FBOT; Uint16 rsvd8[2]; union EVAIMRA_REG EVAIMRA; union EVAIMRB_REG EVAIMRB; union EVAIMRC_REG EVAIMRC; union EVAIFRA_REG EVAIFRA; union EVAIFRB_REG EVAIFRB; union EVAIFRC_REG EVAIFRC; };
};
D10 D9
D8
Reserved T2STAT T1STATT2CTRIPE T1CTRIPE T2TOADC T1TOADC
R-0
R-1
R-1
R/W-1
R/W-1
R/W-0
R/W-0
D7
D6
D5
D4
D3 D2 D1 D0
T1TOADC TCMPOE T2CMPOE T1CMPOE T2PIN T1PIN
R/W-0
R/W-0
W-0
R/W-0
R/W-0
R/W-0
声明共同体
使用位定义的方法定义寄存器可以方便地对寄存器功能位进行操作,但是 有时候如果需要对整个寄存器进行操作,就需要对寄存器整体进行共同体 的定义.
▲ EVA/B中通用定时器全局控制寄存器结构体定义
union GPTCONA_REG { Uint16 all; //可实现对寄存器整体操作 struct GPTCONA_BITS bit; //可实现位操作
类型说明符 位域名 n:位域长度
}
使用位定义的方法定义寄存器
▲ 关于位域,需要注意以下几项:
√ 类型说明符就是基本的数据类型,一般取Unit16,位域名一般根据寄存器功能取,也
可以无域名,作用起填充或调整位置;无名的位域不能使用。
√ 位域的定义必须按照从右往左的顺序进行; √ 一个位域必须存储在同一个字节中,不能跨两个字节,这样,位域的长度不能大过一
D12
D11
struct GPTCONA_BITS { Uint16 T1PIN:2; Uint16 T2PIN:2; Uint16 T1CMPOE:1; Uint16 T2CMPOE:1; Uint16 TCMPOE:1; Uint16 T1TOADC:2; Uint16 T2TOADC:2; Uint16 T1CTRIPE:1; Uint16 T2CTRIPE:1; Uint16 T1STAT:1; Uint16 T2STAT:1; Uint16 rsvd:1;