sunsili 发表于 2021-11-7 19:23:47

STM32F103RCT6开发板M3单片机教程02--SysTick

本帖最后由 sunsili 于 2023-12-11 22:18 编辑

STM32F103RCT6开发板M3单片机教程02--SysTick

本教程使用是(光明谷SUN_STM32mini开发板)


程序设计
上节( STM32F103RCT6开发板M3单片机教程01--点亮LED)我们的用void Delay(u32 dly)函数实现延时,这种方式死等不能使用低功耗。
/*******************************************************************************
* 函数名: Delay
* 描述    : 软件延时函数
* 输入    : dly:32位的整形数
* 输出    : 无
* 返回值: 无
* 说明    : 无
*******************************************************************************/
void Delay(u32 dly)         
{
         for(; dly > 0; dly--);
} 现我们使用另一种方式SysTick系统滴答实现延时。
系统可以在空闲,执行其它任务或睡眠。
编写代码

[*]按上节( STM32F103RCT6开发板M3单片机教程01--点亮LED)方法创建工程,或复制上节工程文件夹打开(这个方法比较方便)
[*]新建源文件SysTick.c,添加lSysTick.c到BSP(Grounp)
/**********************************************************************************
* 文件名:SysTick.c
* 描述    :通过系统滴答时钟SysTick中断实现nMs(n毫秒)、nS(n秒)的延时,这样可以跑低功耗      
* 实验平台:Sun_STM32Min系统板
* 硬件连接:无须外接电路      
* 库版本:ST_v3.5

* Version    Date       Auther      Reversed History
----------------------------------------------------------------------------
V1.0.0    2021-11-07Lojam FanFisrt Created

* (C) Sunshine Silicon Corporation
*Website: http://www.sunsili.comhttp://sunsili.taobao.com http://bbs.sunsili.com
*E-Mail : fan@sunsili.com
**********************************************************************************/

#include "SysTick.h"

static u32 SysTickDelayTime;

/*******************************************************************************
* 函数名: SysTick_Init_Config
* 描述    : 初始化系统滴答时钟SysTick
* 输入    : 无
* 输出    : 无
* 返回    : 无
* 说明    : 1)、SystemFrequency / 1000                1ms中断一次
*                        2)、SystemFrequency / 100000      10us中断一次
*                        3)、SystemFrequency / 1000000      1us中断一次
*                        计算方法:(SystemFrequency / Value)个系统时钟节拍中断一次
*******************************************************************************/
void SysTick_Init_Config(void)
{

      while(SysTick_Config(SystemCoreClock / 1000));      //初始化并使能系统滴答时钟,返回1表示计数设置太大                        
      SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;                //失能滴答定时器
}

/*******************************************************************************
* 函数名: Delay_nMs
* 描述    : 延时程序(n毫秒)
* 输入    : nm:延时时间(n毫秒)
* 输出    : 无
* 返回    : 无
* 说明    : 无
*******************************************************************************/
void Delay_nMs(u32 nms)
{
      SysTickDelayTime = nms;               
      SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;      //使能滴答定时器
      while(SysTickDelayTime != 0);                              //等待延时时间到
}

/*******************************************************************************
* 函数名: Delay_S
* 描述    : 延时程序(n秒)
* 输入    : nS:延时时间(n秒)
* 输出    : 无
* 返回    : 无
* 说明    : 无
*******************************************************************************/
void Delay_nS(u32 ns)
{
      SysTickDelayTime = ns*1000;               
      SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;      //使能滴答定时器
      while(SysTickDelayTime != 0);                                        //等待延时时间到
}


/*******************************************************************************
* 函数名: SysTickDelayTime_Counter
* 描述    : 获取节拍程序
* 输入    : 无
* 输出    : 无
* 返回    : 无
* 说明    : 在SysTick中断程序SysTick_Handler()调用(stm32f10x_it.c)
*******************************************************************************/
void SysTickDelayTime_Counter(void)
{
      if (SysTickDelayTime > 0)
      {
                SysTickDelayTime--;
      }
}

/******************* (C) COPYRIGHT SUNSHINE SILICON**************************
********************      END OF FILE SysTick.c      *******************/
[*]新建源文件SysTick.h并编辑
#ifndef __SYSTICK_H
#define __SYSTICK_H

#include "stm32f10x.h"

void SysTick_Init_Config(void);
void Delay_nMs(u32 nms);
void Delay_nS(u32 ns);

#endif


/******************* (C) COPYRIGHT SUNSHINE SILICON**************************
********************      END OF FILE **.c      *******************/
[*]编辑main.c
/**********************************************************************************
* Sun STM32 mini Demo

*   Description
   
    Uart Demo

   
* Version    Date       Auther      Reversed History
----------------------------------------------------------------------------
V1.0.0    2021-11-07Lojam FanFisrt Created

* (C) Sunshine Silicon Corporation
*Website: http://www.sunsili.comhttp://sunsili.taobao.com http://bbs.sunsili.com
*E-Mail : fan@sunsili.com

**********************************************************************************/

#include "stm32f10x.h"
#include "SysTick.h"
#include "led.h"
#include <stdio.h>


/*******************************************************************************
* 函数名: main
* 描述    : 主函数,用户程序从main函数开始运行
* 输入    : 无
* 输出    : 无
* 返回值: int:返回值为一个16位整形数
* 说明    : 无
*******************************************************************************/
int main(void)
{
    LED_GPIO_Config();                //LED IO配置
      SysTick_Init_Config();      //初始化系统滴答时钟SysTick

      while (1)
      {
                LED_ALL_ON();               //点亮LED
                Delay_nMs(500);      //延时500ms
                LED_ALL_OFF();                  //关闭LED
                Delay_nMs(500);      //延时500ms
      }
}



/******************* (C) COPYRIGHT SUNSHINE SILICON**************************
********************      END OF FILE main.c      *******************/
[*]编译调试

[*]编译工程
编辑好源代码后,保存全部,点"build", 稍等出现如下提示,编译成功,不成话,Keil会给提示,哪里不对,按提示修改代码,保存再编译,直到编译成功。
build.JPG (177.4 KB, 下载次数: 0)
下载附件
7 天前 上传
[*]调试Debug

   F5(run),看到板子LED闪烁,实验成功。


与上节是同样效果
下载完整代码包(回复可下载):
**** Hidden Message *****



页: [1]
查看完整版本: STM32F103RCT6开发板M3单片机教程02--SysTick