STM32中SysTick在3.5固件库中的应用(1)

发布者:码字探险最新更新时间:2016-10-17 来源: eefocus关键字:STM32  SysTick  固件库 手机看文章 扫描二维码
随时随地手机看文章
一、SysTick
STM32内核中有一个系统定时器,它是一个24位递减计数器。工作原理是系统时基定时器设定初值并使能后,每经过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会重新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。
在很早的固件库中,提供了很多函数,来对SysTick进行设置,但是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。
在CMSIS中提供的函数是  SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。
其中这个函数定义在Core_cm3.h中 ,源代码如下所示:
   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;                                                 /* Load the SysTick Counter Value */
   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                    SysTick_CTRL_TICKINT_Msk   | 
                    SysTick_CTRL_ENABLE_Msk;                           /* 使能Systick中断,和Systick 定时器*/
   return (0);                                               
 }
从上面的函数中可以看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。大大简化了程序。
其中ticks 代表的是初值。例如系统时钟是72Mhz 那么要产生1ms的时基,那么我们可以这样去写。
SysTick_Config(SystemCoreClock/1000);  当然也可以写成:SysTick_Config(72000);
了解了这些,我们可以用它来做一个简单的延时函数delay_ms(u16 time);
代码如下:
            void delay_ms(u16 time)
             {
                          nTime=time ;                      /nTime 是个全局变量 可设 extern u16 nTime;/
                          while(nTime);
             }
在 中断函数中直接  加入nTime--;
在主函数 初始化过程中 加入  SysTick_Config(72000);
二、利用库函数和中断实现延时
/**在Systick的控制下, PB.5每1ms闪烁一次 
     SysTick被配置为1ms一次中断。
*/

/***主函数***/
 #include "stm32f10x.h"

 __IO uint32_t TimingDelay;

void GPIO_Configuration(void);
void Delay(__IO uint32_t nTime);

int main(void)
 {
   GPIO_Configuration();  
   while (SysTick_Config(72000)); /* 设置SysTick定时器产生1ms中断 */
   //设置的值小于0x00FFFFFF就继续往下执行...
   while (1)
   {
     GPIO_SetBits(GPIOB, GPIO_Pin_5); 
     Delay(1); //延时1ms
     GPIO_ResetBits(GPIOB, GPIO_Pin_5);       
     Delay(1); //延时1ms
   }
 }

void GPIO_Configuration(void)
 { 
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure); 
 }

/* 功能:延时nTime个ms. */
void Delay(__IO uint32_t nTime)
 { 
   TimingDelay = nTime;
   while(TimingDelay);
 }
 
 

/***stm32f10x_it.c***/

#include "stm32f10x_it.h" 

extern __IO uint32_t TimingDelay;

void SysTick_Handler(void)
 {
   TimingDelay--;
 }

关键字:STM32  SysTick  固件库 引用地址:STM32中SysTick在3.5固件库中的应用(1)

上一篇:STM32端口时钟
下一篇:STM32中的结构体是如何组织同类寄存器的

推荐阅读最新更新时间:2024-03-16 15:15

单片机与计算机通信(上位机)——基于VS2017和stm32
**程序说明:**VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。 直接先贴代码 //32与单片机通信,差不多成功了 #include iostream #include cstdlib #include windows.h #include stdlib.h using namespace std; HANDLE hComm; OVERLAPPED OverLapped; COMSTAT Comstat; DWORD dwCommEvents; char g_UartRxBuffer = { 0x0d,1,2,3,4,0x
[单片机]
单片机与计算机通信(上位机)——基于VS2017和<font color='red'>stm32</font>
STM32步进电机驱动的算法
在脉冲模式下,步进电机启动器的脉冲频率与速度成正比,函数void CalculateSModelLine(float fre , unsigned short period , float len, float fre_max, float fre_min, float flexible)主要目的就是生成每一个细分步加速的速度。芯片用的是stm32f103c8t6,驱动器用的是2DM420。 程序流程如下: STM32硬件基本初始化,主要是针对定时器 调用函数CalculateSModelLine()生 成每一个细分步定时器的自动重装载值(实际就是改变脉冲的周期) 打开定时器 更新中断发生,将数组中的数据赋值给定时器的
[单片机]
基于Keil、STM32,用C++编写流水灯程序
通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil、STM32,用C++编写流水灯程序的一些内容。 1、为什么很少用C++开发单片机 不知道大家对面向过程和面向对象的理解有多少? C语言面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,代码量更小,运行效率更高。 所以,C语言相比C++具有更小代码量、更快的运行速度。 当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。可以参看文章:用 汇编 和 C语言 写流水灯程序有什么不一样? 因为单片机的RAM和Flash资源
[单片机]
大型车辆内轮差危险区域双向示警系统设计
摘 要:大型车辆由于自身车长,轴距长等特点在转弯过程中前轮与后轮轨迹不重合,形成“内轮差”区域。大型车辆发生的恶性 交通事故 中,由于“内轮差”引发的事故占70%以上。针对大型车辆转弯视觉盲区“内轮差”问题,本设计提出一套大型车辆 内轮差危险区域 双向示警系统的设计方案。整个系统模拟真实车辆转向过程。主控模块采用 STM32 进行控制,通过连接电路、实验调试后,该系统可以模拟真实车辆转向过程,并计算“内轮差”危险区域,进行相关 双向声光示警 ,能够达到预期目标,对有效减少大型车辆“内轮差”事故的发生提供解决方案。 *本项目获得“2020全国大学生集成电路创新创业大赛·创新实践项目组”辽宁省一等奖、东北赛区二等奖、国家级三等奖。
[汽车电子]
大型车辆内轮差危险区域双向示警系统设计
STM32的ADC获取电池电压
adc.c #include adc.h void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M //PA4 作为模拟通道输入引脚
[单片机]
STM32 FSMC 详解
LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。(这里原作者应该是搞反了,应该是
[单片机]
STM32基础入门(二)——STM32入坑指南
1. 开发板的选择 学习STM32,不能绕开的第一件事,那就是开发板。 开发板的意义: 开发板提供了动手的机会。学习网上课程后,自己动手编程,并下载到开发板中,观察是否与预期结果一致,如果不一致,可以调试寻找原因。试错的经历是学习过程中最宝贵的经历。 开发板提供了足够的资源,包含硬件资源和软件资源 。硬件资源,即开发板上自带的LED、蜂鸣器、显示屏、以及其他芯片,可以让我们学习某一部件的时候可以直接上手;软件资源,即开发板配套的课程、例程。这些都是厂家根据这款开发板的特性设计的,新手很适合这样一步一步学习。 开发板调试外设非常方便。在后续自己做项目的时候,自己需要用到的很多东西,可以借助开发板来测试。举个例子,如果
[单片机]
<font color='red'>STM32</font>基础入门(二)——<font color='red'>STM32</font>入坑指南
STM32电源管理系统浅谈
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。 STM32的电源管理系统主要分为: 1、备份域 2、调压器供电电路 3、ADC电源电路 备份域电路 STM32的备份域包括LSE振荡器、RTC、备份寄存器及备份SRAM这些器件,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电
[单片机]
<font color='red'>STM32</font>电源管理系统浅谈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved