谷动谷力

 找回密码
 立即注册
查看: 2674|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2021-11-7 19:23:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunsili 于 2023-12-11 22:18 编辑

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

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


程序设计
上节( STM32F103RCT6开发板M3单片机教程01--点亮LED)我们的用void Delay(u32 dly)函数实现延时,这种方式死等不能使用低功耗。
  1. /*******************************************************************************
  2. * 函数名  : Delay
  3. * 描述    : 软件延时函数
  4. * 输入    : dly:32位的整形数
  5. * 输出    : 无
  6. * 返回值  : 无
  7. * 说明    : 无
  8. *******************************************************************************/
  9. void Delay(u32 dly)         
  10. {
  11.            for(; dly > 0; dly--);
  12. }
复制代码
现我们使用另一种方式SysTick系统滴答实现延时。
系统可以在空闲,执行其它任务或睡眠。
编写代码
  • 按上节( STM32F103RCT6开发板M3单片机教程01--点亮LED)方法创建工程,或复制上节工程文件夹打开(这个方法比较方便)
  • 新建源文件SysTick.c,添加lSysTick.c到BSP(Grounp)
    1. /**********************************************************************************
    2. * 文件名  :SysTick.c
    3. * 描述    :通过系统滴答时钟SysTick中断实现nMs(n毫秒)、nS(n秒)的延时,这样可以跑低功耗      
    4. * 实验平台:Sun_STM32Min系统板
    5. * 硬件连接:无须外接电路      
    6. * 库版本  :ST_v3.5

    7. * Version    Date       Auther      Reversed History
    8.   ----------------------------------------------------------------------------
    9.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    10.   
    11. * (C) Sunshine Silicon Corporation
    12. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    13. *  E-Mail : fan@sunsili.com
    14. **********************************************************************************/

    15. #include "SysTick.h"

    16. static u32 SysTickDelayTime;

    17. /*******************************************************************************
    18. * 函数名  : SysTick_Init_Config
    19. * 描述    : 初始化系统滴答时钟SysTick
    20. * 输入    : 无
    21. * 输出    : 无
    22. * 返回    : 无
    23. * 说明    : 1)、SystemFrequency / 1000                1ms中断一次
    24. *                        2)、SystemFrequency / 100000        10us中断一次
    25. *                        3)、SystemFrequency / 1000000        1us中断一次
    26. *                        计算方法:(SystemFrequency / Value)个系统时钟节拍中断一次
    27. *******************************************************************************/
    28. void SysTick_Init_Config(void)
    29. {

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

    33. /*******************************************************************************
    34. * 函数名  : Delay_nMs
    35. * 描述    : 延时程序(n毫秒)
    36. * 输入    : nm:延时时间(n毫秒)
    37. * 输出    : 无
    38. * 返回    : 无
    39. * 说明    : 无
    40. *******************************************************************************/
    41. void Delay_nMs(u32 nms)
    42. {
    43.         SysTickDelayTime = nms;                 
    44.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;        //使能滴答定时器
    45.         while(SysTickDelayTime != 0);                                //等待延时时间到
    46. }

    47. /*******************************************************************************
    48. * 函数名  : Delay_S
    49. * 描述    : 延时程序(n秒)
    50. * 输入    : nS:延时时间(n秒)
    51. * 输出    : 无
    52. * 返回    : 无
    53. * 说明    : 无
    54. *******************************************************************************/
    55. void Delay_nS(u32 ns)
    56. {
    57.         SysTickDelayTime = ns*1000;                 
    58.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;        //使能滴答定时器
    59.         while(SysTickDelayTime != 0);                                        //等待延时时间到
    60. }


    61. /*******************************************************************************
    62. * 函数名  : SysTickDelayTime_Counter
    63. * 描述    : 获取节拍程序
    64. * 输入    : 无
    65. * 输出    : 无
    66. * 返回    : 无
    67. * 说明    : 在SysTick中断程序SysTick_Handler()调用(stm32f10x_it.c)
    68. *******************************************************************************/
    69. void SysTickDelayTime_Counter(void)
    70. {
    71.         if (SysTickDelayTime > 0)
    72.         {
    73.                 SysTickDelayTime--;
    74.         }
    75. }

    76. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    77. ********************        END OF FILE SysTick.c        *******************/
    复制代码

  • 新建源文件SysTick.h并编辑
    1. #ifndef __SYSTICK_H
    2. #define __SYSTICK_H

    3. #include "stm32f10x.h"

    4. void SysTick_Init_Config(void);
    5. void Delay_nMs(u32 nms);
    6. void Delay_nS(u32 ns);

    7. #endif


    8. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    9. ********************        END OF FILE **.c        *******************/
    复制代码

  • 编辑main.c
    1. /**********************************************************************************
    2. * Sun STM32 mini Demo

    3. *   Description
    4.    
    5.     Uart Demo

    6.    
    7. * Version    Date       Auther      Reversed History
    8.   ----------------------------------------------------------------------------
    9.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    10.   
    11. * (C) Sunshine Silicon Corporation
    12. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    13. *  E-Mail : fan@sunsili.com

    14. **********************************************************************************/

    15. #include "stm32f10x.h"
    16. #include "SysTick.h"
    17. #include "led.h"
    18. #include <stdio.h>


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

    31.         while (1)
    32.         {
    33.                 LED_ALL_ON();                 //点亮LED
    34.                 Delay_nMs(500);        //延时500ms
    35.                 LED_ALL_OFF();                  //关闭LED
    36.                 Delay_nMs(500);        //延时500ms
    37.         }
    38. }



    39. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    40. ********************        END OF FILE main.c        *******************/
    复制代码

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

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


与上节是同样效果
下载完整代码包(回复可下载):
游客,如果您要查看本帖隐藏内容请回复




+10

本帖被以下淘专辑推荐:

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-11-24 16:47 , Processed in 0.428988 second(s), 44 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表