历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | 关于stm32寄存器地址定义的小结

发布者:清新自然 来源: eefocus关键字:stm32  寄存器  地址定义 手机看文章 扫描二维码
随时随地手机看文章

最近一直在研读正点原子的stm32开发板,在学习SysTick寄存器的过程中查不到该寄存器的地址是在哪里定义的,很是不解。上网搜后发现 http://www.eepw.com.cn/article/246289.htm 

部分代码粘贴如下:


typedef struct

{

  __IO uint32_t CTRL;   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

  __IO uint32_t LOAD;   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register     */

  __IO uint32_t VAL;    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register    */

  __I  uint32_t CALIB; /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */

} SysTick_Type; //声明一个SysTick_Type型的结构体。


#define SysTick   ((SysTick_Type   *)     SysTick_BASE  ) /*!< SysTick configuration struct */

#define SysTick_BASE   (SCS_BASE +  0x0010UL) /*!< SysTick Base 



Address  */

#define SCS_BASE   (0xE000E000UL) /*!< System Control Space Base Address  */

 CTRL_TICKINT_Set是一个宏定义,定义如下

/* CTRL TICKINT Mask */

#define CTRL_TICKINT_Set      ((u32)0x00000002)

#define CTRL_TICKINT_Reset    ((u32)0xFFFFFFFD)


上面代码中定义一个SysTick_Type类型的结构体实例SysTick,而从根本上来说这是一个地址,

就是STM32芯片内部分配给滴答时钟的实际地址0xE000E000UL+0x0010UL。SysTick->CTRL |= CTRL_TICKINT_Set;

就是给地址0xE000E000+0x0010 +0x000赋一个0x00000002的值,对应滴答时钟的CTRL寄存器的第2位置1

。即为开启中断的意思。 在该文中有详细的说明,个人觉得事实也本应是这样的,可是在我的core_cm3.h头文件中却找不到对SysTick寄存器定义相应的地址

========================================================================


/** \brief  Structure type to access the System Timer (SysTick).

 */

typedef struct

{

  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */

  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */

  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */

} SysTick_Type;


/* SysTick Control / Status Register Definitions */

#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */

#define SysTick_CTRL_COUNTFLAG_Msk       (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */


#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */

#define SysTick_CTRL_CLKSOURCE_Msk       (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */


#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */

#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */


#define SysTick_CTRL_ENABLE_Pos  0                                             /*!< SysTick CTRL: ENABLE Position */

#define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */


/* SysTick Reload Register Definitions */

#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */

#define SysTick_LOAD_RELOAD_Msk      (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */


/* SysTick Current Register Definitions */

#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */

#define SysTick_VAL_CURRENT_Msk       (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */


/* SysTick Calibration Register Definitions */

#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */

#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */


#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */

#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */


#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */

#define SysTick_CALIB_TENMS_Msk       (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */


/*@} end of group CMSIS_SysTick */


上面代码中却怎么也找不到SysTick 寄存器地址的定义,黄天不负有心人,最终还是找到了,

原来在正点原子提供的代码中,把所有的寄存器的结构体定义完之后,统一给各个寄存器定义了地址,

该定义在所有结构体定义的后面。代码如下:

------------------------------------------------------------------------


/* Memory mapping of Cortex-M3 Hardware */

#define SCS_BASE    (0xE000E000UL)  /*!< System Control Space Base Address  */

#define ITM_BASE    (0xE0000000UL) /*!< ITM Base Address                   */

#define DWT_BASE    (0xE0001000UL)     /*!< DWT Base Address    */

#define TPI_BASE  (0xE0040000UL) /*!< TPI Base Address                   */

#define CoreDebug_BASE  (0xE000EDF0UL)   /*!< Core Debug Base Address */

#define SysTick_BASE     (SCS_BASE+0x0010UL) /*!< SysTick Base Address   */

#define NVIC_BASE       (SCS_BASE +0x0100UL)  /*!< NVIC Base Address        */

#define SCB_BASE    (SCS_BASE +  0x0D00UL) /*!< System Control 


Block Base Address #define SCnSCB ((SCnSCB_Type*) SCS_BASE ) /!< System control Register not in SCB /


#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ 

#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ 

#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ 

#define ITM ((ITM_Type *)ITM_BASE) /*!< ITM configuration struct */ 

#define DWT ((DWT_Type *) DWT_BASE) /*!< DWT configuration struct */ 

#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct 

#define CoreDebug ((CoreDebug_Type ) eDebug_BASE)/!< Core Debug configuration struct 

#if (__MPU_PRESENT == 1)***define MPU_BASE (SCS_BASE + 0x0D90UL) /!< Memory Protection Unit */ 

#define MPU ((MPU_Type ) MPU_BASE )/!< Memory Protection Unit */ 

#endif


/@} / 

“`


这里定义了详细代码,但个人觉得这种定义可读性不是很强,没有前面的定义直观。对初学者是一种考验。Ok


关键字:stm32  寄存器  地址定义 引用地址:关于stm32寄存器地址定义的小结

上一篇:STM32中功能复用重映射是什么意思
下一篇:STM32 xPSR影响的条件指令

推荐阅读

18.6万平方米的展览面积,500多家国内外知名企业参展,28个国家和地区的百余名外宾与会,501个重大项目签约合计投资约6120亿元,挤满站厅的参观市民。23日,由科技部、工信部、中国科学院、中国工程院、中国科学技术协会和重庆市人民政府共同主办的2018中国国际智能产业博览会在重庆开幕,政府、企业、市民对于人工智能的热情在展会上展露无遗。智能化发展...
SIA的最新数据显示,2019年上半年全球半导体市场同比下降14.5%。受到全球半导体市场下降影响,中国集成电路产业增速有所下降。据中国半导体行业协会统计,2019年1-6月中国集成电路产业销售额为3048.2亿元,同比增长11.8%,增速比一季度略有增长。其中,设计业同比增长18.3%,销售额为1206.1亿元;制造业同比增长11.9%,销售额为820亿元;封装测试业销售额1...
过去几十年的汽车供应链已经不复存在了。新的汽车制造商,如硅谷和中国的汽车制造商,正以全新的汽车结构和商业模式进入市场,以满足我们社会不断变化的需求和人口结构。现有的OEM正在共享汽车平台,开发电池组,选择电池类型,并相互合作以获得规模经济。随着这些伙伴关系的形成,我们看到了地方政府与全球标准共存的区域出现。我们也看到越来越多的全球...
雷达液位计在高温、高压、易燃、易爆、易凝等介质的液位测量中有着广泛的应用。这是与雷达液位计所具有的结构简单、安装方便、易于维护、耐腐蚀等优点分不开的。尽管如此,由于选型、安装、使用不当等影响,雷达液位计在使用过程中,各种故障和问题时有发生。为避免生产受到影响,帮助仪表用户更好地使用雷达液位计,本文就雷达液位计常见故障及处理简述如...

史海拾趣

问答坊 | AI 解惑

嵌入式系统设计师考试

一、考试说明 1、考试要求:  (1)掌握科学基础知识;  (2)掌握嵌入式系统的硬件、软件知识;  (3)掌握嵌入式系统分析的方法;  (4)掌握嵌入式系统设计与开发的方法及步骤;  (5)掌握嵌入式系统实施的方法  (6)掌握嵌入式 ...…

查看全部问答∨

有人用过WINCE 6.0 R3的Silverlight吗?

想尝尝鲜,不知是否有人用过,效果如何,性能怎样? 希望有大虾能分享一下,先谢谢了!…

查看全部问答∨

vxworks+vmware的老问题,如何编译?在什么环境下make?

针对x86的编译,网上能查到的详细流程中,有这样的步骤: -------------------------------------- (1)打开一个控制台窗口,运行批处理程序:   %WIND_BASE%\\host\\x86-win32\\bin\\torVars.bat; (2)定位到C:\\tornado2.2\\target\\src\\drv ...…

查看全部问答∨

运行Keil故障

运行Keil 时出现“MISSING DEVICE (R003:SECURITY KEY NOT FOUND0)”是怎么会事??…

查看全部问答∨

有新加坡驱动开发的朋友吗?

新加坡的朋友请与我联系,wopafeng@hotmail.com…

查看全部问答∨

PIC单片机?

我想通过PIC18F6622的芯片,来完成一个智能火焰监测系统 但我现在出现了一点问题,就是想知道,最能检测火焰的硅光电池哪种型号的比较好用?? 还有硅光电池连接AD转换器,这个AD转换器应该连接芯片的哪个引脚??? 请求帮忙。。。…

查看全部问答∨

DouleX太阳能卡片计算器

这是来自国内创意品牌DouleX的一款创新产品:太阳能计算器,它采用太阳能供电,节能环保,在室外阳光下或室内灯光下都可以应用,仅为信用卡般大小,可以很方便的放进钱包里面,随身 携带以备不时之需。     …

查看全部问答∨

ISE版本升级后,工程布局布线通不过

在ISE11.1上建立的工程,后来环境升级到ISE11.5后原来11.1上的工程就不能用了,开始是translate报错,找不到一些约束,我把工程运行中产生的文件删掉后,translate可以通过了,但是布局布线又开始报错,说工程不能满足时序要求,这是什么原因导致的 ...…

查看全部问答∨

STR710FZ2T6与STR710RZT6的区别是不是只有FLASH?

                                 在datasheet上没有看见STR710RZT6的相关说明,请问是不是除了没有FLASH,在功能、封装等等与STR710FZ2T6一样?…

查看全部问答∨

2812烧写求助

急 各位大侠看一下--2812密码保护 小弟今天第一次烧flash ,结果程序烧进去了 但是password(3f7ff8-)段被写入数值了,flash被保护了,在map文件中找到 .reset     0    003f7ff6    00000002  &n ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved