历史上的今天
今天是:2024年10月16日(星期三)
2018年10月16日 | stm32之滴答定时器(2):滴答定时器地址与stm32结构体
2018-10-16 来源:eefocus
上一篇讲了滴答定时器在内核什么位置,这篇讲讲滴答定时器结构体和地址的联系
不知道大家搜滴答定时地址的时候有没有注意到,SysTick_BASE的下面就是SysTick的定义
#define SysTick ((SysTick_Type *) SysTick_BASE)
这个东西第一次接触还是感觉挺绕的(初学者强烈推荐一本入门书《C和指针》(*^__^*) ),这句什么意思呢,通俗地讲,就是把SysTick定义为了指向SysTick_Type结构体的指针,而这个指针的地址呢,是个固定值, SysTick_BASE,也就是上一篇写的0xE000E010。
这个SysTick_Type结构体是什么,同样要在内核文件中查到了
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__I uint32_t CALIB;
} SysTick_Type;
结构体的这四个成员是不是有点眼熟呢,如果你看过数据手册,或者在stm32的工程里做过滴答定时器的初始化就知道是什么了。
先看cortex内核的数据手册,找到滴答定时器的几个寄存器,如下


再看下滴答定时器的初始化函数中,
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
有没有发现他们是一一对应的呢。结构体中成员是32位的,32数据是4个8bit,一个地址存储的是8个bit,结构体成员如果是同一类型的数据,则结构体成员的地址是连续的。这样就合理解释了这四个寄存器地址与库函数中结构体的对应关系。
虽然这里是以滴答定时器为例,但是学习stm32的过程中,都是这样的方式,使硬件的寄存器与库函数中的结构体相关联,这种方法能够帮助大家一点点看懂通过寄存器编写的库函数,加深理解。
下一篇就写一下滴答定时器初始化中的系统时钟问题吧
史海拾趣
|
以下是顶嵌嵌入式培训学员延小伟所写的C语言技术文章: 说白了,指针就是地址,地址里面放着不同的值,用操作指针的方法来操作这些值。 在32位机中,指针本身占4位,定义时,可以 int *p=&a,其中int *是一部 ...… 查看全部问答> |
|
我想用网络发送一张图片,把图片转为字节数组时遇到了问题 MemoryStream ms = new MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] bt = ms.GetBuffer(); 这种方法在wince中不可以用,弹出NotSupportedExcep ...… 查看全部问答> |
|
收到开发板两周多了,白天公司事忙的不行,晚上还得抱孩子,本来要好好试试PCIe,结果耽搁了不少时日,也连累了玲珑小姐,实在对不住! 总体来说有以下两方面 优点: 1,开发板设计还是比价人性化,供电可以PCIe也可 ...… 查看全部问答> |
|
可编程增益放大器 (PGA) 是特殊的放大器结构(请参见图 1),具有经过修整的内部电阻器网络,拥有比采用离散式电阻器组件的放大器更高的性能。正如图 1 中 PGA 传输函数所显示那样,PGA 输出的绝对误差与内部偏移电压(VOS)、增益精度和 VREF 绝对精 ...… 查看全部问答> |
|
图中框到的那个部分的内容,我在设计自己的原理图时候,我希望不用每次都去添加个人信息。因为自己画的原理图都是没有方框里的东西的,我想问下可不可以预先设定一个模板直接调用就可以了,不用每次都去添加个人信息… 查看全部问答> |
|
本帖最后由 陌路绝途 于 2015-11-8 11:04 编辑 输入项: 输出项: 算法由于该程序所用的数据结构简单,所以该程序所使用的查找算法只是简单的按照关键字查找。流程逻辑当用户在下位机触摸屏上按下对应 ...… 查看全部问答> |




