ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux 下定义寄存器宏 实现类似于STM32的寄存器操作

2019-11-07 11:03:22  阅读:196  来源: 互联网

标签:CCM int 寄存器 unsigned STM32 地址 volatile linux


在使用cpu资源的时候,需要设置寄存器才能使用相应的资源,而在STM32里使用寄存器会类似于下面这种

GPIOA -> ODR |=1<<3;

这样就访问并设置了端口A的 ODR 寄存器,可是有很多人不明白怎么就访问了地址了,怎么就通过一个结构体的赋值语句就能设置ODR这个寄存器呢

下面我们就来自己编写一个结构体来操作寄存器

既然是结构体语句,肯定会有结构体的存在,而结构体里面的内容就是一个功能组的里面的寄存器名字,如:

 

这个CCM寄存器功能组里面就包含了CCM_CCR,CCM_CCDR等等,因为在一个寄存器功能组里的地址是相连或者相近的,这里面我们就可以作为一个结构体,定义如下:

typedef struct
{
    volatile unsigned int CCR;
    volatile unsigned int CCDR;
    volatile unsigned int CSR;
……
    volatile unsigned int CCGR6;
    volatile unsigned int RESERVED_3[1];
    volatile unsigned int CMEOR;    
}CCM_Type;

 可以看见结构体里的排列顺序与寄存器的排列顺序是一样的,但会发现在结构体中出现了一个 RESERVED_3[1];这个是在官方寄存器中是没有的,这是为什么呢,我们来看看官方寄存器表

 

可以看见CCM_CCGR6 地址为20C4080,CCM_CMEOR地址为20C4088,中间为相隔了8个字节地址,我们可以参考上面的寄存器地址,中间相隔为4个字节,说明这两个地址之间空了一个寄存器,我们就需要把这个寄存器地址给他用其他值来进行代替,因为我们结构体的地址是连续的,如果不占用这个地址,后面的值得地址就会偏移。

现在结构体有了,还没有指定地址,我们需要给定结构体基地址,而这个基地址就是我们这个寄存器组的第一个寄存器的地址

#define CCM_address 0x20c400  //定义基地址

给结构体基地址

#define CCM ((CCM_Type*)CCM_address) //外设指针

这样我们就可以像STM32那样使用结构体来使用寄存了

CCM -> CCR |= 1<<3;

 

 

标签:CCM,int,寄存器,unsigned,STM32,地址,volatile,linux
来源: https://www.cnblogs.com/puchi/p/11810677.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有