上一篇讲了滴答定时器在内核什么位置,这篇讲讲滴答定时器结构体和地址的联系
不知道大家搜滴答定时地址的时候有没有注意到,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的过程中,都是这样的方式,使硬件的寄存器与库函数中的结构体相关联,这种方法能够帮助大家一点点看懂通过寄存器编写的库函数,加深理解。
下一篇就写一下滴答定时器初始化中的系统时钟问题吧
关键字:stm32 滴答定时器 地址 结构体
引用地址:
stm32之滴答定时器(2):滴答定时器地址与stm32结构体
推荐阅读最新更新时间:2024-03-16 16:16
基于STM32的无线通信模块设计
随着网络和现代通信技术的不断发展,远程无线通信技术经过多年的研究与实际应用,现如今在工业控制领域有了非常重要的地位,并且发挥着越来越大的作用。文中根据厂家的要求,设计的无线通信模块,主要实现了短信与数据收发功能,并且做到了模块的稳定,掉线之后能够自动重连。 1 无线通信模块整体设计方案 模块主要有电源部分、主控部分、通信部分、数据传输部分4个部分组成。通信模块采用SIM900A进行无线通信。主控模块采用STM32作为主控芯片,来控制短信的收发与数据传输的顺利进行。远程终端可以是手机或者上位机的数据中心软件,经过处理之后,储存下来,方便日后的查询。本模块具有低功耗,方便灵活,操作简单并且稳定,掉线之后可以自动连接,运行过程十分稳定,
[单片机]
stm32专题十八:SPI协议
参考标准SPI协议说明: 1 SPI架构: SPI的主要部分是状态,控制和数据寄存器,移位器逻辑,波特率发生器,主/从控制逻辑和端口控制逻辑。 SPI模块允许MCU和外围设备之间的双工,同步,串行通信。 软件可以轮询SPI状态标志,或者SPI操作可以是中断驱动的。 2 详细信号说明 2.1 MOSI master output, slave input 2.2 MISO master input, slave output 2.3 SS非(低电平使能) 该引脚用于将选择信号从SPI模块输出到另一个外设,当配置为主机时,将其作为数据传输,当SPI配置为从机时,它用作接收从机选择信号的输入。
[单片机]
STM32嵌套向量中断控制器(NVIC)
嵌套向量中断控制器 一、特性 ● 68个可屏蔽中断通道(不包含16个Cortex -M3的中断线); ● 16个可编程的优先等级(使用了4位中断优先级); ● 低延迟的异常和中断处理; ● 电源管理控制; ● 系统控制寄存器的实现; 嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地 处理晚到的中断。 嵌套向量中断控制器管理着包括内核异常等中断。 二、中断优先级 STM32中有两个优先级的概念---抢占式优先级和响应优先级。所有中断源都要指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。当两个中断源抢占式
[单片机]
点亮LED(库函数实现)
本次测试采用的芯片是STM32F103CB 我的开发板如下: 此开发板有8个led,分别为D11,D12,D13,D14,D15,D16,D17,D18。查询核心板的电路图后知道其对应芯片的控制引脚为P0.0,P0.1,P0.2,P0.3,P0.4,P0.5,P0.6,P0.7,P0.8。 现在开始测试点亮D11。主要源代码如下: 1 //main.c 2 #include pbdata.h 3 #include led.h 4 5 int main(void) 6 { 7 led_init(); 8 led_setBit(); 9 } 1 //pbdata.h 2 #ifndef _pbdata
[单片机]
基于STM32的三轴数字罗盘HMC5883L模块的测试方案
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。 一、IIC协议相关操作(单片机作为主机控制时钟线) 宏定义: //这里用到了STM32的位带区操作,方便实现对一个位的操作 //PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能 //在PB1
[单片机]
STM32中断程序
前段时间用STM32F103VBT6写了一个中断的函数,借此机会想了解下STM32的中断机制,用过之后发现STM32的中断配置相当灵活,稳定行很高,测试发现几乎没出过什么差错。我在程序里开了三个中断,一个计数器用于精确延时用,另外两个为外部事件处理中断,下面一一详细介绍,方便初学者入门。 在进行STM32中断配置之前首先需要了解下它的中断部分: 一、Cortex-M3中断机制 在STM32处理器中有43个可屏蔽中断通道(?包含 16个 Cortex?-M3的中断线)。共设置了16个可编程的优先等级(使用? 4位中断优先级);它的嵌套向?中断控制器(NVIC)和处?器核的接口紧密相连,可以实现低延迟的中断处?和有效处
[单片机]
STM32 TIM1 F1 四通道完全重映射PWM 配置
void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph
[单片机]
STM32 控制lcm液晶ILI9341驱动的液晶驱动程序
/* 选择BANK1-BORSRAM1 连接 TFT,地址范围为0X60000000~0X63FFFFFF * FSMC_A16 接LCD的DC(寄存器/数据选择)脚 * 16 bit = FSMC 对应HADDR * 寄存器基地址 = 0X60000000 * RAM基地址 = 0X60020000 = 0X60000000+2^16*2 = 0X60000000 + 0X20000 = 0X60020000 * 当选择不同的地址线时,地址要重新计算。 */ //#define Bank1_LCD_D ((u32)0x60020000) //Disp Data ADDR //#define Bank1_LCD_C ((u3
[单片机]