STM32中systick下的CTRL、LOAD 、CALIB、VAL寄存器的功能在哪里设置的

作者&投稿:大季章 (若有异议请与网页底部的电邮联系)
STM32学习中#define SysTick ((SysTick_TypeDef *) SysTick_BASE)的理解~

在CPU的架构里,外设和内存是统一编址的。对所有外设寄存器的操作,都是对某一个地址的操作。为了方便使用外设的地址,需要将外设寄存器映射到对应的地址上。

因此就有了外设头文件中的定义。
================================
#define SCS_BASE ((u32)0xE000E000)
这里定义SCS_BASE值为((u32)0xE000E000),然后定义SysTick_BASE为基址加偏移的位置的地址。
#define SysTick ((SysTick_TypeDef *) SysTick_BASE) 这一句有点不明白。
------这里的SysTick定义成一个指针,它的值等于SysTick_BASE,即0xE000E000。之所以这么写,一是为了引用上的方便,比如:SysTick->LOAD,SysTick->CTRL等等。二是为了不让编译器产生告警。正常情况下,一个常量是不能赋值给一个指针的。

SysTick_BASE是一个变量,强制转换成指针,然后指向SysTick_TypeDef。
SysTick_BASE本来是变量,现在直接加上*变成指针了,那 * SysTick_BASE就变成存储SysTick_BASE变量的地址了吗?
-------注意,SysTick_BASE是一个常量。* SysTick_BASE是不符合C语言语法的。

然后强制类型转换成结构体,那SysTick就是指向这个结构体首地址的地址了吗?还是这个结构体首地址的值?
------你也可以把硬件外设当成一个结构体变量,对这个结构体变量中的成员进行操作就相当于操作硬件寄存器。此时SysTick指针指向的就是这个“硬件结构体”变量,即指向结构体的首地址。后面就可以用SysTick->LOAD来操作LOAD寄存器。

这是
STM32
官方库给出的配制系统
定时器中断

库函数

static
__INLINE
uint32_t
SysTick_Config(uint32_t
ticks){
if
(ticks
>
SysTick_LOAD_RELOAD_Msk)
return
(1);
SysTick->LOAD
=
(ticks
&
SysTick_LOAD_RELOAD_Msk)
-
1;
NVIC_
SetPriority
(SysTick_IRQn,
(1<<__NVIC_PRIO_BITS)
-
1);
SysTick->VAL
=
0;
SysTick->CTRL
=
SysTick_CTRL_CLKSOURCE_Msk
|
SysTick_CTRL_TICKINT_Msk
|
SysTick_CTRL_ENABLE_Msk;
return
(0);
}
只需要把
形参
ticks赋值为50就能让系统定时器每20ms中断一次。

systick叫做系统滴答时钟,这个不属于是STM32的片内外设,而是cortexM3内核里面自带的一个时钟模块,这个模块一般用于嵌入式系统的系统定时(也就是分时间片段处理定时),所以没有专门的固件库函数,但是对这几个寄存器的操作被封装到core_cm3.h中了,函数原型是:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
具体功能就是初始化系统滴答时钟,然后让时钟产生一个很精确的固定定时中断,一般我们可以把这个功能封装成一个很精确的延时函数.这个模块的使用很简单,就是一个初始化函数和一个中断服务函数,初始化函数就是上面的那个,都是直接对寄存器进行写入的,这个应该就是你想要的底层代码了,我也是一个初学者,所以我的回答不一定是正确的,但是这个是我查阅过资料之后再加上自己的理解,所以如果有大神看到有问题的地方还望指出,谢谢.

这几个寄存器在Cortex-M3权威指南中文翻译版的第8章有介绍的,好像是130多页吧,自己去找找看


电脑总是跳出蓝屏,然后只好靠按钮重启
1:重启;2:检查新硬件是否插牢,并安装最新的驱动程序,同时还应对照微软网站的硬件兼容类别检查一下硬件是否与操作系统兼容,如果你的硬件没有在表中, 那么就得到硬件厂商网站进行查询;3:新驱动和新服务:如果刚安装完某个硬件的新驱动,或安装了某个软件, 而它又在系统服务中添加了相应项目(比如:杀毒软件、CPU降温...

我的主板是微星NF2的 CPUAMD Athlon(tm) XP 2500+ 请问在BIOS里面怎么...
32 Bit Mode: 将此选项设为On,有助于在32位的操作系统(如WIN95\/NT)下加快硬盘传输速度,有些旧硬盘不支持此模式,必须将此选项设为Off。 PIO Mode: 支持PIO Mode0~Mode5(DMA\/33)。用BIOS程序自动检查硬盘时,会自动设置硬盘的PIO Mode。 注意:当你在系统中接上一台IDE设备(如硬盘、光驱等)时,最好进入BI...

关于想的英语单词有哪些
2 abdomen [ˈæbdəmən; æbˈdəʊmən] [ˈæbdəmən] 3 abatement [əˈbeɪtm(ə)nt] [əˈbetmənt] 4 abide [əˈbaɪd] [əˈbaɪd] 5 ability [əˈbɪlɪtɪ] [əˈbɪləti] 6 able [ˈeɪb(ə)l] [...

达县18662752496: STM32如何使用Systic(库函数) -
吕虞前列: systick的中断是系统开辟了的 对于他的配置建议看下core_m3.h里面的SysTick_Config(uint32_t ticks)这个函数 调用这个函数以后 初始化状态就是 使用AHB ticks的值为VAL,也就是计数的滴答值,这个值减到了0就会中断,同时VAL值重新装填 还有 调用了函数以后,默认是开启了滴答计时器,所以要在调用函数之后关闭计时器,在要用的时候开启.对于滴答的开启与关闭是用寄存器做的

达县18662752496: stm32关于系统滴答定时器(systick) -
吕虞前列: 你在中断处理函数中调用延时函数.是可以的.关键这个延时函数不可以使用到别的中断.stm32在中断处理中只能同时处理一个中断.如果该中断不处理完.即使有别的高级别中断产生也不会执行处理函数.你说你在你的延时函数中使用了systemtick,在你EXTI0_1_IRQHandler执行的时候,systemtick的中断处理不能执行.你的系统计时也不会增加,就导致你的延时函数永远等不到结束.如果你一定要延时的话,可以使用空循环.

达县18662752496: STM32学习中#define SysTick ((SysTick - TypeDef *) SysTick - BASE)的理解 -
吕虞前列: 在CPU的架构里,外设和内存是统一编址的.对所有外设寄存器的操作,都是对某一个地址的操作.为了方便使用外设的地址,需要将外设寄存器映射到对应的地址上.因此就有了外设头文件中的定义.================================...

达县18662752496: stm32中的Systick与delay有什么区别? systick是否一致占用CPU? -
吕虞前列: systick是m3内核内置的用于时钟节拍的定时器(要看m3的手册,stm32手册里面没有,包括nvic也是).和stm32的其他外设定时器相比非常简单,只有溢出中断可选,只想简单定时应用没啥问题.定时时间也不算长.想要输出个pwm等就别想了.delay?莫非是用for或者while循环做的延时程序?这两个就是delay一直占用cpu,而systick一般都采用中断方式,(不会有人在程序里一直查询标志位的),不占用cpu.除非任务很简单.否则实际项目不会使用循环的延时.不过因为stm32上面有更强大的外设定时器的.定时的范围也比systick要大.还可以级联,所以一般不用systick,只把systick用于操作系统的时钟节拍.

达县18662752496: STM32 Systick能产生秒以上的延迟吗? -
吕虞前列: 因为systick是24bit的,就是16777216,就是说,如果系统时钟大于16777216Hz就不能得到秒以上的延迟,你试试配置一下,让系统时钟除以8之后作为systick的时钟,这样勉强可以达到秒级别的.

达县18662752496: STM32中 Systick问题 while(SysTick - Config(SystemFrequency / 1000)); 是什么意思,实现什么功能,求大神 -
吕虞前列: static __INLINE uint32_t SysTick_Config(uint32_t ticks) {if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */NVIC_SetPriority (SysTick_IRQn, ...

达县18662752496: cortex m3中的systick函数在哪个头文件中有定义 就是SysTick - Config()如何调用 谢谢 -
吕虞前列: 对于stm32f10x系列包含在core_cm.h头文件即可,而这个头文件被包含在stm32f10x.h中,因此只要调用systick函数时,加入#include “stm32f10x.h”即可

达县18662752496: STM32中systick下的CTRL、LOAD 、CALIB、VAL寄存器的功能在哪里设置的
吕虞前列: systick叫做系统滴答时钟,这个不属于是STM32的片内外设,而是cortexM3内核里面自带的一个时钟模块,这个模块一般用于嵌入式系统的系统定时(也就是分时间片段处理定时),所以没有专门的固件库函数,但是对这几个寄存器的操作被封...

达县18662752496: STM32的机器周期怎么算的? -
吕虞前列: STM32机器周期系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;SystemInit();//源自system_stm32f10x.c文件,只需要调...

达县18662752496: STM32的Systick设置问题: -
吕虞前列: 这是设置SysTick 定时器的一个初始化函数,具体解析如下:void SysTInit(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//SysTick时钟源为AHB时钟除以8 SysTick_SetReload(9000);//SysTick重装载值为9000 SysTick_ITConfig(ENABLE);//使能SysTick中断 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 0, 0);//设置优先级为0组0级 SysTStop(); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网