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]