最近一直在研读正点原子的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 xPSR影响的条件指令
推荐阅读
史海拾趣
富士通(Fujitsu)在电子行业的五个发展故事
故事一:从电话交换机到ICT巨头的起步
富士通的故事始于1935年,当时它作为一家电信设备制造商在日本成立,首款产品是电话交换机,这标志着富士通成为日本首家生产此类设备的公司。这一里程碑不仅奠定了富士通在通信领域的基础,也为其后续在信息技术(IT)和通信技术(CT)领域的多元化发展铺平了道路。随着技术的不断进步,富士通逐渐扩展其业务范围,从单一的通信设备制造商转变为全球领先的ICT企业。
故事二:FACOM 100——日本首台计算机的诞生
1954年,富士通成功研发出日本第一台中继式自动计算机FACOM 100,这一成就不仅标志着富士通在计算机领域的突破,也为其后续在计算机硬件和软件领域的深入发展奠定了坚实基础。FACOM 100的问世,不仅提升了富士通在业界的知名度,也推动了日本乃至全球计算机技术的快速发展。
故事三:全球化战略的推进
自20世纪70年代以来,富士通积极实施全球化战略,通过在全球各地设立研发中心、生产基地和销售网络,不断拓展其国际业务。在中国,富士通自1979年起便开始了其业务布局,从最初的设备销售到后来的技术研发、生产制造和解决方案提供,富士通在中国的发展历程见证了其全球化战略的深入实施。如今,富士通的产品和服务已遍布全球80多个国家和地区,服务超过百万家客户。
故事四:云计算与数字化转型的引领
进入21世纪,随着云计算和数字化转型的兴起,富士通迅速调整战略方向,加大在云计算领域的投入。通过提供全方位的云计算服务和解决方案,富士通帮助客户实现业务的数字化转型和升级。同时,富士通还积极与微软等国际巨头合作,共同开拓全球云计算市场,进一步巩固了其在ICT行业的领先地位。
故事五:技术创新与可持续发展
富士通始终将技术创新作为企业发展的核心驱动力。近年来,富士通在人工智能、物联网、大数据等新兴技术领域取得了显著成就,推出了一系列具有自主知识产权的创新产品和解决方案。同时,富士通还积极履行企业社会责任,通过提供绿色、环保的ICT产品和服务,推动社会的可持续发展。这些努力不仅提升了富士通在全球市场的竞争力,也为其赢得了广泛的赞誉和尊重。
在电子行业的浪潮中,Codeco Corporation Of Vermont(以下简称Codeco)由几位热衷于科技创新的工程师创立。他们看到了电子产品日益普及的趋势,决定投身这个充满机遇的领域。初创时期,资金短缺、市场竞争激烈,Codeco面临着巨大的挑战。然而,凭借着对技术的执着追求和对市场的敏锐洞察,他们成功开发出了一款具有创新性的电子产品,迅速在市场上占得一席之地。
DSP Group Inc公司成立于1987年,早期专注于数字信号处理(DSP)技术的研发。在成立之初,公司便认识到了DSP技术在语音处理、音频编解码等领域的巨大潜力。通过不断的技术创新和研发投入,DSP Group逐渐在DSP领域树立了领先地位,为后续的发展奠定了坚实的基础。
作为一家有远见的企业,德立电子深知绿色发展的重要性。公司积极响应国家环保政策,推行绿色生产和绿色供应链管理。同时,德立电子还积极参与社会公益事业,回馈社会,履行企业社会责任。
请注意,以上故事框架仅供参考,具体内容和细节需根据实际情况进行填充和完善。
在市场竞争日益激烈的背景下,Astro Tool Corp公司始终坚持以创新驱动发展。公司不断投入研发资金,引进先进技术和设备,推出了一系列具有创新性和竞争力的新产品。这些产品不仅满足了客户日益多样化的需求,也为公司带来了可观的利润。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的持续发展提供了有力保障。
随着全球化趋势的加强,Bomar Interconnect公司开始实施国际化战略。公司积极寻求与国际知名企业的合作机会,通过技术引进、合资建厂等方式,加快了公司的国际化进程。同时,公司还加强了海外市场的开拓力度,设立了多个海外销售中心和分支机构,为公司的全球化发展提供了有力支持。这些举措不仅拓宽了公司的业务范围和市场空间,也提升了公司在国际市场上的竞争力。
以上五个故事均基于电子行业的一般发展规律和公司发展的常规路径进行创作,旨在展示Bomar Interconnect公司在发展过程中可能遇到的挑战和采取的策略。需要强调的是,这些故事并非基于真实事件编写,因此可能与公司的实际情况存在出入。如需了解Bomar Interconnect公司的真实发展故事,建议查阅相关新闻报道、公司年报或行业分析报告等权威资料。
一、考试说明 1、考试要求: (1)掌握科学基础知识; (2)掌握嵌入式系统的硬件、软件知识; (3)掌握嵌入式系统分析的方法; (4)掌握嵌入式系统设计与开发的方法及步骤; (5)掌握嵌入式系统实施的方法 (6)掌握嵌入式 ...… 查看全部问答∨ |
|
vxworks+vmware的老问题,如何编译?在什么环境下make? 针对x86的编译,网上能查到的详细流程中,有这样的步骤: -------------------------------------- (1)打开一个控制台窗口,运行批处理程序: %WIND_BASE%\\host\\x86-win32\\bin\\torVars.bat; (2)定位到C:\\tornado2.2\\target\\src\\drv ...… 查看全部问答∨ |
|
这是来自国内创意品牌DouleX的一款创新产品:太阳能计算器,它采用太阳能供电,节能环保,在室外阳光下或室内灯光下都可以应用,仅为信用卡般大小,可以很方便的放进钱包里面,随身 携带以备不时之需。 … 查看全部问答∨ |
在ISE11.1上建立的工程,后来环境升级到ISE11.5后原来11.1上的工程就不能用了,开始是translate报错,找不到一些约束,我把工程运行中产生的文件删掉后,translate可以通过了,但是布局布线又开始报错,说工程不能满足时序要求,这是什么原因导致的 ...… 查看全部问答∨ |
STR710FZ2T6与STR710RZT6的区别是不是只有FLASH? 在datasheet上没有看见STR710RZT6的相关说明,请问是不是除了没有FLASH,在功能、封装等等与STR710FZ2T6一样?… 查看全部问答∨ |