寄存器结构体

合集下载

TI DSP位域寄存器文件(Bit Field and Register-File Structure)结构

TI DSP位域寄存器文件(Bit Field and Register-File Structure)结构
C 中,预处理指令 DATA_SECTION 的语法是: #pragma DATA_SECTION (symbol,"section name") C++中,预处理指令 DATA_SECTION 的语法是: #pragma DATA_SECTION ("section name") DATA_SECTION 预处理指令将 symbol 定位到名为 section name 的存储空间 中。下面的代码中,应用预处理指令 DATA_SECTION 将寄存器文件结构变量 SciaRegs 和 ScibRegs 分别定位到名为 SciaRegsFile 和 ScibRegsFile 的 section 中,SciaRegsFile 和 ScibRegsFile 是被 DSP 的 SCI 外设寄存器占据的 空间。 /******************************************************************** * Assign variables to data sections using the #pragma compiler statement * C and C++ use different forms of the #pragma statement * When compiling a C++ program, the compiler will define __cplusplus automatically ********************************************************************/ //---------------------------------------#ifdef __cplusplus #pragma DATA_SECTION("SciaRegsFile") #else #pragma DATA_SECTION(SciaRegs,"SciaRegsFile"); #endif volatile struct SCI_REGS SciaRegs; //----------------------------------------

SPI接口详解1

SPI接口详解1

SPI接口是一种同步串行总线(Serial Peripheral Interface)。

四线SPI接口连线图:CS为片选脚,用于选中从机。

SCLK为时钟脚,用于数据传输时提供时钟信号。

MOSI为主output,从input,即主机发送脚。

对应从机的引脚为SDI。

MISO为主input,从output,机主机接收脚。

对应从机的引脚为SDO。

上述SPI为标准SPI协议(Standard SPI)或单线SPI协议(Single SPI),其中的单线是指该SPI协议中使用单根数据线MOSI 进行发送数据,单根数据线MISO 进行接收数据。

为了适应更高速率的通讯需求,半导体厂商扩展SPI协议,主要发展出了Dual/Quad/Octal SPI协议,加上标准SPI协议(Single SPI),这四种协议的主要区别是数据线的数量及通讯方式,见下表:除了上述接法,SPI还支持半双工1bit模式:SCLK:时钟线。

I/O:数据线,同一时刻要么主机发送,要么主机接收。

SS:片选脚。

Dual SPI的2bit模式:由于是半双工,同一时刻要么主机使用MOSI、MISO线,要么从机使用MOSI、MISO线。

Quad SPI(4线)模式与Dual SPI类似,也是针对SPI Flash,也是半双工,Quad SPI Flash增加了两根I/O线(SIO2,SIO3),目的是SCLK一次触发传输4bit数据。

以AC63芯片SPI接口为例,进行代码分析:根据SPI接口的时序要求,SPI接口可以通过软件实现,也可以通过硬件实现。

这里仅分析硬件实现方式。

查看数据手册可知,芯片最多支持三个SPI接口,SPI接口支持DMA发送、接收功能。

每个SPI接口引脚可以映射到不同的引脚,分别为不同的组,即组A、组B、组C、组D。

SPI硬件包含控制寄存器、波特率寄存器、buf缓冲区寄存器、DMA地址寄存器、DMA计数寄存器。

寄存器结构体定义如下:typedef struct {__RW __u32 CON;__WO __u32 BAUD;__RW __u32 BUF;__WO __u32 ADR;__WO __u32 CNT;} JL_SPI_TypeDef;每个SPI接口寄存器基地址:#define JL_SPI0_BASE (ls_base + map_adr(0x1c, 0x00))#define JL_SPI0 ((JL_SPI_TypeDef *)JL_SPI0_BASE)#define JL_SPI1_BASE (ls_base + map_adr(0x1d, 0x00))#define JL_SPI1 ((JL_SPI_TypeDef *)JL_SPI1_BASE)#define JL_SPI2_BASE (ls_base + map_adr(0x1e, 0x00))#define JL_SPI2 ((JL_SPI_TypeDef *)JL_SPI2_BASE)现将三个SPI寄存器首地址定义在数组中:static JL_SPI_TypeDef *const spi_regs[SPI_MAX_HW_NUM] = { JL_SPI0,JL_SPI1,JL_SPI2,};通过SPI的编号就可以进行对应SPI寄存器的访问操作。

stm32结构体的定义及外部引用方法

stm32结构体的定义及外部引用方法

stm32结构体的定义及外部引用方法在STM32中,结构体通常用于描述复杂的数据类型,例如硬件寄存器、协议数据单元等。

在C语言中,结构体是一种用户自定义的数据类型,允许我们将多个不同类型的数据组合在一起。

下面是一个简单的STM32结构体定义的例子:```ctypedef struct {uint32_t Register1;uint8_t ByteRegister;uint16_t BitRegister;} RegisterStruct;```在这个例子中,我们定义了一个名为`RegisterStruct`的结构体,它包含了三个成员:一个32位的寄存器`Register1`,一个8位的寄存器`ByteRegister`和一个16位的寄存器`BitRegister`。

要使用这个结构体,你可以创建一个该类型的变量,并为其成员赋值:```cRegisterStruct myRegister;= 0x;= 0x11;= 0x2233;```如果你想从其他文件引用这个结构体,你可以在头文件中声明它:```c// my_ifndef MY_REGISTER_Hdefine MY_REGISTER_Htypedef struct {uint32_t Register1;uint8_t ByteRegister;uint16_t BitRegister;} RegisterStruct;endif // MY_REGISTER_H```然后在需要使用这个结构体的源文件中包含这个头文件:```c//include "my_"int main() {RegisterStruct myRegister;= 0x;= 0x11;= 0x2233;// 其他代码...return 0;}```这就是在STM32中定义和引用结构体的基本方法。

具体的实现可能会根据你的项目需求和使用的库有所不同。

使用C语言操作SCI寄存器与CMD文件的编写

使用C语言操作SCI寄存器与CMD文件的编写
对 SCICCR 整体进行操作
[cpp] view plaincopy
SciaRegs.SCICCR.all = 0x0007;
对 SCIHBAUD 和 SCILBAUD 进行操作
[cpp] view plaincopy
SciaRegs.SCIHBAUD = 0; SciaRegs.SCILBAUD = 0xF3;
六.寄存器文件的空间分配(CMD 文件的产生)
值得注意的是,之前所做的工作只是将 F2812 的寄存器按照 C 语言中位域定义和寄存器结构体的方式组织了数据结构,当编译时, 编译器会把这些变量分配到存储空间中,但是很显然还有一个问题需 要解决,就是如何将这些代表寄存器数据的变量同实实在意的是之前所做的工作只是将f2812的寄存器按照c语言中位域定义和寄存器结构体的方式组织了数据结构当编译时编译器会把这些变量分配到存储空间中但是很显然还有一个问题需要解决就是如何将这些代表寄存器数据的变量同实实在在的物理寄存器结合起来
使用 C 语言操作 SCI 寄存器与 CMD 文件的编写
13. };
14.
15. extern volatile struct SCI_REGS SciaRegs;
16. extern volatile struct SCI_REGS ScibRegs;
定义为 union 形式的成员既可以实现对寄存器整体的操作,也可以实
现对寄存器位的操作。
定义为 Uint16 形式的成员只能直接对寄存器进行操作
对 SCICCR 按位进行操作[cpp] view plaincopy
SciaRegs.SCICCR.bit.STOPBITS = 0; SciaRegs.SCICCR.bit.PARITYENA = 0; SciaRegs.SCICCR.bit.LOOPBKENA = 0; SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0; SciaRegs.SCICCR.bit.SCICHAR = 7;

SysTick系统定时器(功能框图和优先级配置)

SysTick系统定时器(功能框图和优先级配置)

SysTick系统定时器(功能框图和优先级配置)SysTick—系统定时器是属于 CM3 内核中的⼀个外设,内嵌在 NVIC 中。

系统定时器是⼀个 24bit (2^24)的向下递减的计数器,计数器每计数⼀次的时间为 1/SYSCLK,⼀般我们设置系统时钟 SYSCLK 等于 72M。

当重装载数值寄存器的值递减到 0 的时候,系统定时器就产⽣⼀次中断,以此循环往复。

因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单⽚机都具有这个系统定时器,使得软件在 CM3 单⽚机中可以很容易的移植。

系统定时器⼀般⽤于操作系统,⽤于产⽣时基,维持操作系统的⼼跳.SysTick的执⾏过程:counter在时钟的驱动下,从reload初值开始往下递减计数到0(在递减的过程中值可以在STK_VAL中查看到),产⽣中断和置位COUNTFLAG标志。

然后⼜从reload 值开始重新递减计数,如此循环。

SysTick相关寄存器SysTick—系统定时器有4 个寄存器(CTRL LOAD VAL CALIB),简要介绍如下。

在使⽤ SysTick 产⽣定时的时候,只需要配置前三个寄存器,最后⼀个校准寄存器不需要使⽤。

SysTick寄存器结构体SysTick寄存器(在固件库⽂件:core_cm3.h中定义)typedef struct{_IO uint32_t CTRL; /*控制及状态寄存器*/_IO uint32_t LOAD; /*重装载数值寄存器*/_IO uint32_t VAL; /*当前数值寄存器*/_IO uint32_t CALIB; /*校准寄存器*/}SysTick库函数SysTick配置库函数(在固件库⽂件:core_cm3.h中定义)__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){// 不可能的重装载值,超出范围if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);}// 设置重装载寄存器SysTick->LOAD = (uint32_t)(ticks - 1UL);// 设置中断优先级,默认优先级最低 __NVIC_PRIO_BITS 4(1111)系统定时器此时设置的优先级在内核外设中是最低的NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);// 设置当前数值寄存器SysTick->VAL = 0UL;// 设置系统定时器的时钟源为 AHBCLK=72M// 使能系统定时器中断// 使能定时器SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |21 SysTick_CTRL_TICKINT_Msk |22 SysTick_CTRL_ENABLE_Msk;23 return (0UL);24 }⽤固件库编程的时候我们只需要调⽤库函数 SysTick_Config()即可,形参ticks⽤来设置重装载寄存器的值,最⼤不能超过重装载寄存器的值 2^24,当重装载寄存器的值递减到 0的时候产⽣中断,然后重装载寄存器的值⼜重新装载往下递减计数,以此循环往复。

使用C语言操作SPI的寄存器及相应的CMD文件

使用C语言操作SPI的寄存器及相应的CMD文件

使用C语言操作SPI的寄存器及相应的CMD文件1.SPI寄存器结构体文件定义:struct SPI_REGS{union SPICCR_REG SPICCR; // 配置控制寄存器定义union SPICTL_REG SPICTL; //工作控制寄存器定义union SPISTS_REG SPISTS; // 状态寄存器定义Uint16 rsvd1; // 保留位Uint16 SPIBRR; // 波特率寄存器定义Uint16 rsvd2; // 保留位Uint16 SPIRXEMU; //仿真缓冲寄存器定义Uint16 SPIRXBUF; //串行接收缓冲寄存器定义Uint16 SPITXBUF; //串行发送缓冲寄存器定义Uint16 SPIDAT; // 串行数据寄存器定义union SPIFFTX_REG SPIFFTX; // FIFO发送寄存器定义union SPIFFRX_REG SPIFFRX; // FIFO接收寄存器定义union SPIFFCT_REG SPIFFCT; // FIFO控制寄存器定义Uint16 rsvd3[2]; //保留位union SPIPRI_REG SPIPRI; // FIFO优先级控制寄存器定义};extern volatile struct SPI_REGS SpiaRegs;extern volatile struct SPI_REGS SpibRegs;2.使用DATA_SECTION方法将寄存器文件分配到数据空间# pragma DATA_SECTION(SpiaRegs,”SpiaRegsFile”);volatile struct SPI_REGS SpiaRegs;# pragma DATA_SECTION(SpibRegs,”SpibRegsFile”);volatile struct SPI_REGS SpibRegs;3.将数据段映射到寄存器对应的存储空间(.CMD)MEMORY{PAGE 1:SPIA : origin = 0x007040, length = 0x000010 /* SPIA寄存器*/ SPIB : origin = 0x007740, length = 0x000010 /* SPIB寄存器*/ }SECTIONS{SpiaRegsFile : > SPIA, PAGE = 1SpibRegsFile : > SPIB, PAGE = 1}。

CPU寄存器详解

CPU寄存器详解

CPU寄存器详解组件计算机是一种数据处理设备,它由CPU和内存以及外部设备组成。

CPU 负责数据处理,内存负责存储,外部设备负责数据的输入和输出,它们之间通过总线连接在一起。

CPU内部主要由控制器、运算器和寄存器组成。

控制器负责指令的读取和调度,运算器负责指令的运算执行,寄存器负责数据的存储,它们之间通过CPU内的总线连接在一起。

每个外部设备(例如:显示器、硬盘、键盘、鼠标、网卡等等)则是由外设控制器、I/O端口、和输入输出硬件组成。

外设控制器负责设备的控制和操作,I/O端口负责数据的临时存储,输入输出硬件则负责具体的输入输出,它们间也通过外部设备内的总线连接在一起。

组件化的硬件体系上面的计算机系统结构图中我们可以看出硬件系统的这种组件化的设计思路总是贯彻到各个环节。

在这套设计思想(冯。

诺依曼体系架构)里面,总是有一部分负责控制、一部分负责执行、一部分则负责存储,它之间进行交互以及接口通信则总是通过总线来完成。

这种设计思路一样的可以应用在我们的软件设计体系里面:组件和组件之间通信通过事件的方式来进行解耦处理,而一个组件内部同样也需要明确好各个部分的职责(一部分负责调度控制、一部分负责执行实现、一部分负责数据存储)。

缓存一个完整的CPU系统里面有控制部件、运算部件还有寄存器部件。

中寄存器部件的作用就是进行数据的临时存储。

既然有内存作为数据存储的场所,那么为什么还要有寄存器呢?答案就是速度和成本。

我们知道CPU的运算速度是非常快的,如果把运算的数据都放到内存里面的话那将大大降低整个系统的性能。

解决的办法是在CPU内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。

我们称这一小块临时存储区域为寄存器。

因为寄存器和运算器以及控制器是非常紧密的联系在一起的,它们的频率一致,所以运算时就不会因为数据的来回传输以及各设备之间的频率差异导致系统性能的整体下降。

PCI配置寄存器

PCI配置寄存器

io内存和io端口
我们知道,外设都是通过读写设备上的寄存器来进行的,外设寄存器也 称为“I/O端口”。而IO端口有两种编址方式:独立编址和统一编制。 而具体采用哪一种则取决于CPU的体系结构。 如,PowerPC、m68k等
采用 统一编址;而X86等则采用独立编址。 对于某一既定的系统,它要么是独立编址,也即“I/O端口”方式,外设 寄存器位于“I/O空间”; 要么是统一编制,也即“I/O内存”方式,外设寄存器位于“内存空间”
PCI总线简介
PCI寻址(物理)
pci域:(16位) 总线号:(8位) 设备号:(5位) 功能号:(3位) 总线号、设备号和功能号共同组成pci外设的16位硬件地址。 但是由于256个总线对许多大系统是不够的, Linux 现在支持 PCI 域。每个 PCI 域可以占用多达 256 个总线. 每个总线占 用 32 个设备, 每个设备可以是一个多功能卡(例如一个声音 设备, 带有一个附加的 CD-ROM 驱动)有最多 8 个功能 这样,linux系统可以支持更多的pci设备

linxu对io内存和io端口的访问
对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种访问方式: 1.linux访问IO内存的流程是: request_mem_region() -> ioremap()
-> ioread8()/iowrite8() -> iounmap() -> release_mem_region() 。 2.访问IO端口的方式: (1)Linux内核提供了如下一些访问I/O端口的内联函数(这种方法比较常用) unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); unsigned inw(unsigned port); void outw(unsigned short word, unsigned port); unsigned inl(unsigned port); void outl(unsigned longword, unsigned port); (2)linux访问io端口的新机制 ioport_map() -> ioread8()/iowrite8() ->ioport_unmap()

DSP28335代码学习

DSP28335代码学习

1.2、外设位域结构体方法综述1.2.1、传统#define的方法C代码访问寄存器的传统方法是使用#define宏为每一个寄存器分配一个地址。

例如:#define CPUTIMER0_TIM (volatile unsigned long *) 0x0c00#define CPUTIMER0_PRD (volatile unsigned long *) 0x0c02#define CPUTIMER0_TCR(volatile unsigned long *) 0x0c04#define CPUTIMER0_TPR (volatile unsigned long *) 0x0c06…..同样的#define方法将在每一个外设寄存器上不断重复弊端:不容易访问寄存器中的位域部分不容易在CCS观察窗口显示位域的值不能利用CCS的自动完成功能对于重复的外设,头文件的开发者不能获得重复利用的便利。

1.2.2、位域及结构体的方法位域及结构体方法采用C代码的结构体方式,将属于某个指定外设的所有寄存器组成一个集合。

通过链接器,每个C代码结构体就是外设寄存器的内存映射。

这一映射允许编译器通过使用CPU数据页指针(DP)直接访问外设寄存器。

另外,多数寄存器都定义了位域,从而使编译器能够读取或者操作某一个寄存器中的单个位域。

(1)下面代码是下面代码示例是一个DSP28335的CPU定时器存器对应的C代码结构体类型。

// CPU Timer Register File://struct CPUTIMER_REGS {union TIM_GROUP TIM; // Timer counter registerunion PRD_GROUP PRD; // Period registerunion TCR_REG TCR; // Timer control registerUint16 rsvd1; // reservedunion TPR_REG TPR; // Timer pre-scale lowunion TPRH_REG TPRH; // Timer pre-scale high};该结构体类型包括6个成员组成,前后顺序与他们在内存中的顺序相同。

单片机结构体使用方法

单片机结构体使用方法

单片机结构体使用方法单片机(Microcontroller)是嵌入式系统设计中常用的一种集成电路芯片,它具有微处理器核心、存储器和各种外设接口等功能模块。

为了方便对单片机进行编程和操作,通常会使用结构体(Struct)来定义单片机的各个寄存器和相关参数。

本文将详细介绍单片机结构体的使用方法。

我们需要了解结构体的概念。

结构体是一种自定义的数据类型,它可以包含多个不同类型的成员变量。

通过结构体,我们可以将相关的变量打包在一起,方便进行统一的管理和操作。

在单片机编程中,结构体通常用于定义寄存器的位域(Bit Field)和寄存器组(Register Group)。

寄存器是单片机内部的一种存储器,用于存储控制和数据信息。

通过位域的方式,我们可以对寄存器中的每一个位进行单独的操作,而寄存器组则是将多个寄存器打包在一起,方便进行整体的控制。

下面以一个简单的例子来说明单片机结构体的使用方法。

假设我们要控制单片机的GPIO口,其中包含了多个引脚,我们需要对每个引脚的输入输出状态进行设置和读取。

我们定义一个结构体来表示GPIO口的寄存器组:```ctypedef struct {unsigned char PIN0 : 1;unsigned char PIN1 : 1;unsigned char PIN2 : 1;unsigned char PIN3 : 1;unsigned char PIN4 : 1;unsigned char PIN5 : 1;unsigned char PIN6 : 1;unsigned char PIN7 : 1;} GPIO_Reg;```在这个结构体中,我们使用了位域的方式来定义了8个引脚(PIN0~PIN7),每个引脚占用一个比特位。

通过这种方式,我们可以方便地对每个引脚进行单独的操作。

接下来,我们可以定义一个结构体变量来表示具体的GPIO口:```cGPIO_Reg GPIOA;```通过这个结构体变量,我们可以对GPIO口的每个引脚进行读写操作。

STM32单片机的知识点总结

STM32单片机的知识点总结

STM32系统结构STM32f10xxx系统结构内核IP从结构框图上看,Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:指令存储区总线(两条)、系统总线、私有外设总线。

有两条代码存储区总线负责对代码存储区(即 FLASH 外设)的访问,分别是 I-Code 总线和 D-Code 总线。

I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。

系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。

它们也在系统级存储区。

还有一个DMA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。

简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工。

处理器外设(内核之外的外设)从结构框图上看,STM32的外设有串口、定时器、IO口、FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。

寄存器什么是寄存器?寄存器是内置于各个IP外设中,是一种用于配置外设功能的存储器,并且有想对应的地址。

一切库的封装始于映射。

是不是看的眼都花了,如果进行寄存器开发,就需要怼地址以及对寄存器进行字节赋值,不仅效率低而且容易出错。

库的存在就是为了解决这类问题,将代码语义化。

语义化思想不仅仅是嵌入式有的,前端代码也在追求语义特性。

从点灯开始学习STM32内核库文件分析cor_cm3.h这个头文件实现了:1、内核结构体寄存器定义。

2、内核寄存器内存映射。

3、内存寄存器位定义。

跟处理器相关的头文件stm32f10x.h实现的功能一样,一个是针对内核的寄存器,一个是针对内核之外,即处理器的寄存器。

MIPS构架

MIPS构架

MIPS体系结构首先是一种RISC架构1 MIPS32架构中有32个通用寄存器,其中$0(无论你怎么设置,这个寄存器中保存的数据都是0)和$31(保存函数调用jal的返回地址)有着特殊的用途,其它的寄存器可作为通用寄存器用于任何一条指令中。

虽然硬件没有强制性的指定寄存器使用规则,在实际使用中,这些寄存器的用法都遵循一系列约定。

这些约定与硬件确实无关,但如果你想使用别人的代码,编译器和操作系统,你最好是遵循这些约定。

寄存器编号助记符用法0 zero永远返回值为0 1 at用做汇编器的暂时变量2-3 v0,v1子函数调用返回结果4-7 a0-a3子函数调用的参数8-15 t0-t7 24-25 t8-t9暂时变量,子函数使用时不需要保存与恢复16-25s0-s7子函数寄存器变量。

子函数必须保存和恢复使用过的变量在函数返回之前,从而调用函数知道这些寄存器的值没有变化。

26,27 k0,k1通常被中断或异常处理程序使用作为保存一些系统参数28 gp全局指针。

一些运行系统维护这个指针来更方便的存取“static”和“extern"变量。

29 sp堆栈指针30 s8/fp第9个寄存器变量。

子函数可以用来做桢指针31 ra 子函数的返回地2 MIPS32中如果有FPA(浮点协处理器),将会有32个浮点寄存器,按汇编语言的约定为$f0~$f31,MIPS32中只能实用偶数号的浮点寄存器,奇数号的用途是:在做双精度的浮点运算时,存放该奇数号之前的偶数号浮点寄存器的剩余无法放下的32位。

比如在做双精度的浮点运算时,$1存放$0的剩余的部分,所以在MIPS32中可以通过加载偶数号的浮点寄存器而把64位的双精度数据加载到两个浮点寄存器中,每个寄存器存放32位。

比如:l.d $02,24(t1)被扩充为两个连续的寄存器加载:lwc1 $f0,24(t1)lwc1 $f1,28(t1)3 MIPS架构中没有X86中的PC(程序计数)寄存器,它的程序计数器不是一个寄存器。

外部中断学习笔记

外部中断学习笔记

资料来源:/zzwdkxx/article/details/9036679 STM32-外部中断学习笔记2013-06-07 10:1813368人阅读评论(1) 收藏举报分类:STM32(25)目录(?)[+]中断分类STM32的EXTI控制器支持19 个外部中断/ 事件请求。

每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。

STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:线0~15:对应外部IO口的输入中断。

线16:连接到PVD 输出。

线17:连接到RTC 闹钟事件。

线18:连接到USB 唤醒事件。

触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。

外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。

寄存器组EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的EXTICR1~ EXTICR 4(查了好久才搞明白这个数组的含义!!)。

每个EXTICR只用了其低16 位。

EXTICR[0] ~EXTICR[3]的分配如下:EXTI寄存器的结构体:typedef struct{vu32 IMR;vu32 EMR;vu32 RTSR;vu32 FTSR;vu32 SWIER;vu32 PR;} EXTI_TypeDef;IMR:中断屏蔽寄存器这是一个32 寄存器。

但是只有前19 位有效。

当位x 设置为1 时,则开启这个线上的中断,否则关闭该线上的中断。

13_TMS320F28335的外设(包你明白)

13_TMS320F28335的外设(包你明白)
GPACTRL寄存器的数据结构类型是GPACTRL_REG,使用联合体就是既可以用32位的all也可以用结构体GPACTRL_BITS bit里面的四个8为数据来访问这个寄存器。跟GPACTRL的物理逻辑结构一对照就知道为什么要用这种数据结构来定义GPACTRL寄存器了。
28335的外设功能很多,整个寄存器体系结构跟映射关系还是很复杂的,但是找准一个模块慢慢研究,其他的寄存器模块也就触类旁通了
CPU跟这些模块的接口就是这些模块的寄存器,模块的配置和访问操作都是通过读写相关寄存器来完成的。这些寄存器的物理存储空间是直接并入数据地址空间的,所以不需要另外的读写指令来操作这些寄存器。
28335里面又把这些模块的寄存器分为4组,分配在不同的地址空间下。上图可以看出4个寄存器组的地址分配情况。中间的Reserved阴影块应该是留给后续版本升级的地址空间,隔开了组号0跟1、2、3。组1、2、3其实是在连续的地址上的,这些组除了所包含的模块不同之外,其总线结构也是稍有不同的。
而在源文件里面,则是GPIO_CTRL_REGS、GPIO_DATA_REGS、GPIO_INT_REGS分别表示这三个寄存器组,DSP2833x_Gpio.h文件里面声明了这三个寄存器组全局结构,然后是DSP2833x_GlobalVariableDefs.c为这三个结构体定义自定义数据段GpioCtrlRegsFile、GpioDataRegsFile、GpioIntRegsFile,在DSP2833x_Headers_nonBIOS.cmd文件里面将这三个数据段映射到定义好的三个数据空间GPIOCTRL、GPIODAT、GPIOINT里面,就如上图所示。
上表是Peripheral Frame 0的寄存器分配排列信息,各个不同模块的寄存器占用的空间各有不同,在地址空间上连续排列。

STM32手册中找不到的寄存器说明

STM32手册中找不到的寄存器说明

STM32手册中找不到的寄存器说明在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3 Technical Reference Manual (r2p0)。

在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下:一、NVIC寄存器组STM32的固件库中有如下定义:typedef struct{vu32 ISER[2];u32 RESERVED0[30];vu32 ICER[2];u32 RSERVED1[30];vu32 ISPR[2];u32 RESERVED2[30];vu32 ICPR[2];u32 RESERVED3[30];vu32 IABR[2];u32 RESERVED4[62];vu32 IPR[11];} NVIC_TypeDef;它们对应ARM手册中的名称为ISER = Interrupt Set-Enable RegistersICER = Interrupt Clear-Enable RegistersISPR = Interrupt Set-Pending RegisterICPR = Interrupt Clear-Pending RegisterIABR = Active Bit RegisterIPR = Interrupt Priority Registers每个寄存器有240位,以Interrupt Set-Enable Registers说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7]。

参考STM32技术参考手册中的中断向量表,中断源的位置为:位置0 - WWDG = Window Watchdog interrupt位置1 - PVD = PVD through EXTI Line detection interrupt位置2 - TAMPER = Tamper interrupt......位置58 - DMA2_Channel3 = DMA2 Channel3 global interrupt位置59 - DMA2_Channel4_5 = DMA2 Channel4 and DMA2 Channel5 global interrupts二、系统控制寄存器组STM32的固件库中有如下定义:typedef struct{vuc32 CPUID;vu32 ICSR;vu32 VTOR;vu32 AIRCR;vu32 SCR;vu32 CCR;vu32 SHPR[3];vu32 SHCSR;vu32 CFSR;vu32 HFSR;vu32 DFSR;vu32 MMFAR;vu32 BFAR;vu32 AFSR;} SCB_TypeDef; /* System Control Block Structure */它们对应ARM手册中的名称为CPUID = CPUID Base RegisterICSR = Interrupt Control State RegisterVTOR = Vector Table Offset RegisterAIRCR = Application Interrupt/Reset Control Register SCR = System Control RegisterCCR = Configuration Control RegisterSHPR = System Handlers Priority RegisterSHCSR = System Handler Control and State Register CFSR = Configurable Fault Status RegistersHFSR = Hard Fault Status RegisterDFSR = Debug Fault Status RegisterMMFAR = Mem Manage Address RegisterBFAR = Bus Fault Address RegisterAFSR = Auxiliary Fault Status Register三、系统时钟寄存器组STM32的固件库中有如下定义:typedef struct{vu32 CTRL;vu32 LOAD;vu32 VAL;vuc32 CALIB;} SysTick_TypeDef;它们对应ARM手册中的名称为CTRL = SysTick Control and Status Register LOAD = SysTick Reload Value Register VAL = SysTick Current Value Register CALIB = SysTick Calibration Value Register。

【STM32H7教程】第42章STM32H7的DMA基础知识和HAL库API

【STM32H7教程】第42章STM32H7的DMA基础知识和HAL库API

【STM32H7教程】第42章STM32H7的DMA基础知识和HAL库API完整教程下载地址:第42章 STM32H7的DMA基础知识和HAL库API本章节为⼤家讲解DMA1(Direct memory access controller,直接存储器访问控制器)和DMA2,相⽐前⾯章节的BDMA,功能要强些,属于通⽤型DMA。

42.1 初学者重要提⽰42.2 DMA基础知识42.3 DMA的HAL库⽤法42.4 源⽂件stm32h7xx_hal_dma.c42.5 总结42.1 初学者重要提⽰1. DMA1和DMA2均⽀持8路通道。

虽然是8路,但这8路不是并⾏⼯作的,⽽是由DMA的仲裁器决定当前处理那⼀路。

2. DMA最⼤传输次数65535次,每次传输单位可以是字节、半字和字。

3. DMA的循环模式不可⽤于存储器到存储器模式。

4. DMA1和DMA2带的FIFO是4个32bit的空间,即16字节。

5. 使⽤DMA的FIFO和突发需要注意的问题较多,详情可看本章2.7⼩节。

6. STM32H7的参数⼿册DMA章节对存储器到存储器,外设到存储器,外设到存储器模式的传输过程进⾏了讲解,推荐⼤家看完本章节后读⼀下。

42.2 DMA基础知识DMA的⼏个关键知识点放在开头说:由于总线矩阵的存在,各个主控的道路四通⼋达,从⽽可以让DMA和CPU同时开⼯,但是注意⼀点,如果他们同时访问的同⼀个外设,会有⼀点性能影响的。

DMA⽀持存储器到外设,外设到存储器和存储器到存储器的传输,不⽀持外设到外设的传输,⽽BDMA是⽀持的,这个模式在低功耗模式下⽐较有⽤。

DMA1和DMA2是有两个AHB总线主控,可以分别⽤于源地址和⽬的地址的传输。

源地址和⽬的地址的数据宽度可以不同,但是数据地址必须要跟其数据类型对齐。

⽐如源地址是uint32类型的,那么此数组的地址必须4字节对齐。

DMA主要有两种模式,⼀个是Normal正常模式,传输⼀次后就停⽌传输;另⼀种是Circular循环模式,会⼀直循环的传输下去,即使有DMA中断,传输也是⼀直在进⾏的。

寄存器原理结构

寄存器原理结构

寄存器原理结构寄存器是计算机中一种重要的存储设备,用于存储和传输数据。

它由多个存储单元组成,每个存储单元能够存储一个固定大小的数据。

寄存器的结构是计算机体系结构设计中的关键要素之一。

一、寄存器的基本原理寄存器是一种高速存储设备,用于存储指令和数据。

它能够快速存取数据,并能够在需要时将数据传送到其他部件中。

寄存器的基本原理是通过电子元件来实现数据的存储和传输。

常见的寄存器有通用寄存器、程序计数器、状态寄存器等。

二、寄存器的结构1. 存储单元:寄存器由多个存储单元组成,每个存储单元能够存储一个固定大小的数据。

存储单元通常由触发器或锁存器实现,能够存储二进制数据。

存储单元之间通过数据线相连,实现数据的传输。

2. 控制电路:控制电路用于控制寄存器的读写操作。

它包括时钟信号发生器、使能信号控制器等。

时钟信号发生器产生时钟信号,使得寄存器的读写操作能够按照时序进行。

使能信号控制器用于控制寄存器的使能信号,使得数据能够正确地写入和读出。

3. 数据线:数据线用于传输数据。

在寄存器中,数据线连接各个存储单元和其他部件,实现数据的输入和输出。

数据线的宽度决定了寄存器能够存储的数据的位数。

4. 输入端口和输出端口:寄存器的输入端口用于接收数据的输入信号,输出端口用于输出数据。

输入端口和输出端口通过数据线与存储单元相连,实现数据的输入和输出。

三、寄存器的工作原理寄存器的工作原理是通过时钟信号和使能信号控制数据的读写。

寄存器的读操作是在时钟上升沿或下降沿进行的,写操作是在时钟上升沿或下降沿之后进行的。

当使能信号为高电平时,寄存器能够进行读写操作,当使能信号为低电平时,寄存器处于禁止读写状态。

寄存器的读操作是将指定的存储单元中的数据传送到输出端口,输出端口再将数据输出到其他部件中。

寄存器的写操作是将输入端口的数据写入到指定的存储单元中。

四、寄存器的应用1. 数据传输:寄存器能够将数据从一个部件传输到另一个部件,实现数据的传递和共享。

STM32_NVIC寄存器详解

STM32_NVIC寄存器详解

在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 ISER[2]; //2 个 32 位中断使能寄存器分别对应到 60 个可屏蔽中断 u32 RESERVED0[30]; // vu32 ICER[2]; //2 个 32 位中断除能寄存器分别对应到 60 个可屏蔽中断 u32 RSERVED1[30]; vu32 ISPR[2]; //2 个 32 位中断挂起寄存器分别对应到 60 个可屏蔽中断, 可挂起正在执行的中断 u32 RESERVED2[30]; vu32 ICPR[2]; //2 个 32 位中断解挂寄存器分别对应到 60 个可屏蔽中断, 可解除被挂起的中断 u32 RESERVED3[30]; vu32 IABR[2]; //2 个 32 位中断激活标志寄存器, 可读取该寄存器判断当 前执行的中断是哪个,中断执行完硬件清零,只读 u32 RESERVED4[62]; vu32 IPR[15]; //15 个 32 位中断优先级分组寄存器,每个中断分配 8 个 bit,对应到 4*15=60 个中断 } NVIC_TypeDef;ISER0:使能寄存器 0,写 1 使能orICER1:使能寄存器 1,写 1 使能 ISPR1:挂起寄存器 1, 写 1 挂起orICER1:除 ICPR1:解挂ICER0:除能寄存器 0,写 1 除能 ISPR0:挂起寄存器 0,写 1 挂起or能寄存器 1,写 1 除能 or寄存器 1,写 1 解挂ICPR0:解挂寄存器 0,写 1 解挂 IABR0:中断激活标志寄存器 0寄 存 器 位 0 1 对应可屏蔽中断 描述 寄 存 器 位 0 1IABR1:中断激活标志寄存器 0对应可屏蔽中断描述WWDG PVD2 3 4 5TAMPER RTC FLASH RCC6EXTI0窗看门狗 连到 EXTI 的 电源电压检 测(PVD) 中 断 侵入检测中 断 实时时钟全 局中断 闪存全局中 断 Reset and Clock Control 中断 EXTI 线 0 中IIC1_ER IIC2_EVIIC1 错误中断 IIC2 事件中断2 3 4 5IIC2_ER SPI1 SPI2 USART1IIC2 错误中断 SPI1 全局中断 SPI2 全局中断 USART1 全局中断6USART2USART2 全局中断7 8 9 10 11 12 13 14 15 16 17 18EXTI1 EXTI2 EXTI3 EXTI4 DMA1_channel1 DMA1_channel2 DMA1_channel3 DMA1_channel4 DMA1_channel5 DMA1_channel6 DMA1_channel7 ADC1/219USB_HIGH/CAN_TX20USB_LP/CAN_RX021 22 23 24 25 26 27 28CAN_RX1 CAN_SCE EXTI[9:5] TIM1_Break TIM1_Update TIM1_Trg/Com TIM1_CC TIM2断 EXTI 线 1 中 断 EXTI 线 2 中 断 EXTI 线 3 中 断 EXTI 线 4 中 断 DMA1 通道 1 全局中断 DMA1 通道 2 全局中断 DMA1 通道 3 全局中断 DMA1 通道 4 全局中断 DMA1 通道 5 全局中断 DMA1 通道 6 全局中断 DMA1 通道 7 全局中断 ADC1 和 ADC2 全局中 断 USB 高优先 级或 CAN 发 送中断 USB 低优先 级或 CAN 接 收 0 中断 CAN 接收 1 中断 CAN SCE 中 断 EXTI 线[9:5] 中断 TIM1 刹车中 断 TIM1 更新中 断 TIM1 触发和 通信中断 TIM1 捕获比 较中断 定时器 2 全局 中断7 8 9 10 11 12 13 14 15 16 17 18USART3 EXTI[10:15] RTC_Alarm USB_WakeUp Tim8_Break Tim8_Update Tim8_Trg/Com Tim8_CC Adc3 Fsmc Sdio Tim5USART3 全局中断 EXTI[10:15]中断 连接到 EXTI 的闹钟中断 连接到 EXTI 的 USB 待机唤醒 中断 定时器 8 刹车中断 定时器 8 更新中断 定时器 8 触发和通信中断 定时器 8 捕获比较捉弄中断 ADC3 全局中断 FSMC 全局中断 SDIO 全局中断 定时器 5 全局中断19Spi3SPI3 全局中断20Uart4Uart4 全局中断21 22 23 24 25 26 27 28Uart5 Tim6 Tim7 Dma2_Channel1 Dma2_Channel2 Dma2_Channel3 Dma2_Channel4/5 /Uart5 全局中断 定时器 6 全局中断 定时器 7 全局中断 DMA2 通道 1 全局中断 DMA2 通道 2 全局中断 DMA2 通道 3 全局中断 DMA2 通道和通道 5 全局中断 /29 30 31TIM3 TIM4 IIC1_EV定时器 3 全局 中断 定时器 4 全局 中断 IIC1 事件中 断29 30 31/ / // / /IPR[15] 15 个 32 位中断优先级分组寄存器,每个中断分配 8 个 bit,对应到 4*15=60 个中断。

DSP程序中寄存器如何分配地址

DSP程序中寄存器如何分配地址

DSP程序中寄存器如何分配地址DSP中某个寄存器怎么分配地址?在数据⼿册中,我们常常看到说某个寄存器地址是多少,以TMS320F28335的时钟系统寄存器为例,在ti公司给出的⼿册我们看到如下信息我们看到HISPCP中的地址为0x701A;翻看ti公司给的⼀系列库我们发现其寄存器定义在结构体SYS_CTRL_REGS中,经过⼀系列查找,我们发现SYS_CTRL_REGS映射的是 DSP281x_Headers_nonBIOS.cmd⽂件中,其对应的地址映射是System:0我们发现其⾸地址是0x7010;⽽resvd1不代表任何含义,仅仅⽅便位置偏移设数,⽽结构体中HISPCP前⾯有10个16进制变量,HISPCP是第11个,在C语⾔中,下标是从0开始,所有HISPCP是第10个,也就是A,那么HISPCP地址是0x701A,查看芯⽚数据发现吻合,相关内容,可参考下⾯⼀⽚博客⽤过F2812的朋友⼀定会对cmd⽂件很熟悉,因为这个⽂件中为每个程序和数据分配了相应的地址。

我们常⽤的cmd⽂件包括连个:(1) DSP281x_Headers_nonBIOS.cmd(2) F2812_EzDSP_RAM_lnk.cmdDSP281x_Headers_nonBIOS.cmd上⾯第⼀个⽂件⽤于对DSP外设分配地址,⽽第⼆个⽂件是为系统的程序和数据分配地址。

当然,如果DSP的外设地址我们⽤C 语⾔已经⾃⼰定义,那第⼀个⽂件我们就可以不⽤了,笔者就是⾃⼰定义的,所以没有⽤到第⼀个⽂件。

对于为什么要⾃⼰定义外设寄存器以及中断地址,有这⼏个原因:(1) ⾃⼰定义外设寄存器地址可以很清楚的了解DSP的⼯作原理,虽然这样很耗费时间,但是会了解到DSP的中断等等是怎么⼯作的。

(2) 因为DSP外设寄存器地址的分配时采⽤寄存器形式分配到的。

举个例⼦,以sci串⼝通信为例,其他的外设以及中断都⼀样。

⽐如我们设置波特率,肯定是设置某个寄存器的相应位来实现。

stm8寄存器

stm8寄存器

所用芯片stm8s105s4开发环境:ST Visual DevelopStm8s的库为V1.1.1CPU频率及所有外设频率/时钟系统复位后,所有外设时钟均处于开的状态。

用户可通过清除CLK_PCKENR1或CLK_PCKENR2中的PC KEN位来关闭相应的外设时钟。

但是在关闭外设的时钟前,用户必须设置相应的位禁用该外设。

为了使能一个外设,用户必须先设置寄存器CLK_PCKENR中对应的PCKEN位,然后设置外设控制寄存器中的外设使能位。

AWU计数器是由独立于fMASTER的内部或外部时钟(LSI或HSE)驱动,因此,即使寄存器的时钟已被关掉,该外设依然可以继续运行。

例如禁用所有外设时钟:CLK_PCKENR1 = 0x00;// close all clks of PeripheralCLK_PCKENR2 = 0x00;开启定时器TIME1定时器时钟:CLK_PCKENR1 |= 0x20; //具体参考STM8S_Reference 59页CPU分频因子:CPU时钟(fCPU)由主时钟(fMASTER)分频而来,分频因子由时钟分频寄存器(CLK_CKDI VR)中的位CPUDIV[2:0]决定。

共7个分频因子可供选择(1至128中,2的幂)。

如图13所示。

fCPU为CPU和窗口看门狗提供时钟。

时钟分频寄存器(CLK_CKDIVR)通用端口GPIO和其他的单片机一样,我是习惯从端口开始学习。

Stm8s105s系列最多有7组I/O端口,A~G,而根据不同的封装可能没有其中的一些,在这里根据具体项目,我选择的是44脚封装的。

使用任何的外设前,我们都要根据需要的将参考手册和数据手册看一边,当然端口也不能另外了。

作为通用的IO口,每一个GPIO端口都有5个对应的寄存器如下表:注意:初始复位时,所有引脚设置为浮空输入。

其中Px_ODR是ODR[7:0]:端口输出数据寄存器位; (1)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档