关于STM32学习分享
第四章 Systick系统滴答定时器
前言
单片机的Systick系统滴答定时器。
一、系统滴答定时器函数
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register /
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); / set Priority for Cortex-M0 System Interrupts /
SysTick->VAL = 0; / Load the SysTick Counter Value /
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; / Enable SysTick IRQ and SysTick Timer /
return (0); / Function successful */
}
二、代码
1.systick.c
代码如下(示例):
#include "bsp_systick.h"
/*
定时器的完成是相对于外部时实的
当计数完成就做指令
*/
#define SystemCoreClock 72000000
uint32_t TimingDelay;
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
//us延时
void SysTick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);//系统时钟
//循环一次为1微妙
for(i=0;i<us;i++)
{
//连续扫描控制与状态寄存器,等待计数完成
while(!(SysTick->CTRL &(1<<16)));
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
//ms延时
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);//系统时钟
//循环一次为1毫秒
for(i=0;i<ms;i++)
{
//连续扫描控制与状态寄存器,等待计数完成
while(!(SysTick->CTRL &(1<<16)));
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
///系统时钟初始化,中断延时/
void Systick_Init(void)
{
//每100us进行一次中断,判断数值是否符合规则
if(SysTick_Config(SystemCoreClock/10000)){//SystemCoreClock/10000=7200
/* Capture error *///捕获错误
while(1);//死循环
}
}
void TimingDelay_Decrement(void)
{
if(TimingDelay!= 0x00){
TimingDelay--;
}
}
void Delay_us(__IO u32 nTime)//纳秒延时
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
2.systick.h
代码如下(示例):
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"
void SysTick_Delay_ms(uint32_t ms);
void SysTick_Delay_us(uint32_t us);
void TimingDelay_Decrement(void);
void Delay_us(__IO u32 nTime);
void Systick_Init(void);
#endif /*_SYSTICK_H*/
3.stm32f10x_it.c
代码如下(示例):
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
3.main.c
代码如下(示例):
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_systick.h"
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
Systick_Init();
while(1)
{
//绿蓝红三种颜色的流水点亮
LED(ON);
SysTick_Delay_ms(100);
LED(OFF);
}
}
该处使用的url网络请求的数据。
@https://blog.csdn.net/FuYYZ/article/details/114346235
总结
希望能给你有所收获!本文章知识点的学习来自野火教程,更多的知识在野火平台值得初学者去看看!一定有收获的!谢谢!