历史上的今天
今天是:2024年10月16日(星期三)
2018年10月16日 | STM32之SysTick时钟
2018-10-16 来源:eefocus
今天学完STM32的SysTick时钟,(24位递减计数器)现在总结如下:
首先SysTick时钟包含一下四个寄存器
(1),STK_CSR 地址为0xE000E010 ----控制寄存器
STK_CSR中有以下四位具有意义,使用的时候需要配置
(1),第0位:SysTick使能位(0-关闭功能,1-开启功能)
(2),第1位:SysTick中断使能位(0-关闭中断,1-开启中断)
(3),第2位:SysTick时钟源选择(0-使用HCLK/8作为时钟(8分频),1-使用HCLK作为时钟)
(4),第16位:SysTick技术比较标志(如果计数到达0,则该位为1,否则为零)
(2),STK_LOAD 地址为0xE000E014 ----重载寄存器
STK_LOAD 重载寄存器
当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。最大计数为0xffffff(24位)
(3),STK_VAL 地址为0XE000E018 ----当前值寄存器
24位的寄存器,读取时返回当前倒计数的值,写这个寄存器的时候,该位为0,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志
(4),STK_CALRB 地址为0xE000E01C ----校准寄存器(一般不怎么使用)
其次:附上微秒级和毫秒级的函数体,可直接调用使用。
//精确的微秒级延时程序
//利用SysTick时钟
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=9*nus;
//72MHz/8=9MHz
//1*9MHz*9=1us
//重载寄存器赋值
//24位递减寄存器
//最大值为0xFFFFFF
SysTick->VAL=0x00;
//当前寄存器赋值
//清空当前值寄存器,然后将重载寄存器的值送到该寄存器
SysTick->CTRL=0x01;
//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计时值
}
while((temp&0x01)&&(!(temp&(1<<16))));
//temp&0x01检查SysTick的使能位的状态
//0x01表示SysTick功能开启;0x00表示SysTick功能关闭
//temp&(1<<16)检查SysTick的比较标志位
//如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1.否则如果读取该位,则该位自动清零
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0x00;//清空计数器
}
//精确的毫秒级延时程序
//利用SysTick时钟
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=9000*nms;//使用时注意不要超过最大范围0XFFFFFF
//72MHz/8=9MHz
//1*9MHz*9=1us
//重载寄存器赋值
//24位递减寄存器
//最大值为0xFFFFFF
SysTick->VAL=0x00;
//当前寄存器赋值
//清空当前值寄存器,然后将重载寄存器的值送到该寄存器
SysTick->CTRL=0x01;
//使能,减到零是无动作,采用外部时钟源
//
do
{
temp=SysTick->CTRL;//读取当前倒计时值
}
while((temp&0x01)&&(!(temp&(1<<16))));
//temp&0x01检查SysTick的使能位的状态
//0x01表示SysTick功能开启;0x00表示SysTick功能关闭
//temp&(1<<16)检查SysTick的比较标志位
//如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1.否则如果读取该位,则该位自动清零
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0x00;//清空计数器
}
最后,附上一段使用实例:
//主要实现以下功能
//LED灯按照精准延时实现闪烁
int main(void)
{
RCC_Configuration();//系统时钟初始化72MHz
GPIO_Configuration();//端口初始化
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delay_ms(500);//0.5s
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay_ms(500);//0.5s
}
}
void RCC_Configuration(void)
{
SystemInit();//系统初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//初始化GPIO结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//选中B5引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置最高输出速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置GPIO工作模式为推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB
}
注:文中所提供的函数体可直接移植到STM32中使用,该函数借鉴于网络,本人在自己理解的基础上做了总结,以供相互交流学习。
上一篇:STM32之按键操作
史海拾趣
|
求救:如何将SST 89E564RD (40-c-p1 0438064-AC)变成仿真器 买了块廉价的芯片,想自己做仿真器 里面没有启动程序 想自己DIY一个仿真器 麻烦成功的大虾发一个可以用的 1电路图 2软件 3监控程序 4 其他对SST 89E564RD 用的上 [ 本帖最后由 wanzsxit ...… 查看全部问答> |
|
再次请教S3C2440+WinCE5.0+4.2BSP下使用4GB的SDHC大容量SD卡驱动问题,大家指点 再次请教S3C2440+WinCE5.0+4.2BSP下使用4GB的SDHC大容量SD卡驱动问题,大家指点!!! 大家好,谢谢大家一直以来这么热心的回复的我帖子,帮助我,谢谢大家,祝大家工作顺利! 我的环境:S3C2440+WinCE5.0+4.2BSP,开发板是广嵌科技的GEC2440。 ...… 查看全部问答> |
|
现在用nrf905设计开发一个射频智能卡测试平台的无线接口,为增强实验的可靠性,我们在设计了PCB环形差分天线的前提下,通过两个跳线,将芯片的ANT1和ANT2通过匹配网络再连接到SMA天线接口处,以备PCB环形天线不能满足实验要求时,可以经过跳线连接 ...… 查看全部问答> |
|
在eMbedded Visual C++中使用VC++编写的.dll的问题 我最近做个项目,在手机上显示监控图像。在eMbedded Visual C++中使用VC下的Dll出错。 提示如下: error LNK2019: unresolved external symbol __imp__MP4_ClientStopCapture referenced in function \"protected: void __thiscall CKlsDlgDlg::On ...… 查看全部问答> |
|
datasheet上是说应该在下面一点共地,但是如果在附近引出来用0欧电阻接可能产生什么问题,还查到有说,用磁珠相连有选频的好处,这个“选频”怎么讲?是指可以把数字区指定频率的噪声滤掉吗?数字区的噪声频率是不是就是单片机的频率啊?谢谢指教 ...… 查看全部问答> |
|
这是继MSP430的MP3扩展板(DSP C5000)后的又一个华丽的扩展板。 说说功能吧!扩展板提供一路VGA输出,VGA的DA采用电阻分压的方式,分辨率为400×300,并且支持两个任天堂的游戏手柄, 打游戏嘛!手柄肯定不能少。主芯片是一片Spartan 3的FPGA ...… 查看全部问答> |




