这里主要是使用Systick 时钟来实现精准延迟,它本质也是一个定时器,使用时只需复制粘贴使用,这里是使用72M的STM32F103ZET6,不同型号需要自行修改对应参数。
#include "stm32f10x.h"
static uint8_t D_us=0; //微妙系数
static uint16_t D_ms=0; //毫秒系数
void Delay_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
D_us = SystemCoreClock/8000000;
D_ms = (uint16_t)D_us * 1000;
}
void Delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->CTRL = 0x00; //关闭SysTick定时器
SysTick->LOAD = nus*D_us; //延时重装载值
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL|= 0x01 ; //启动SysTick定时器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延时结束
SysTick->CTRL = 0x00; //关闭SysTick定时器
SysTick->VAL = 0X00; //清空计数器
}
void Delay_ms(uint32_t nms)
{
uint32_t temp;
SysTick->CTRL = 0x00; //关闭SysTick定时器
SysTick->LOAD = nms*D_ms; //延时重装载值
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL|= 0x01 ; //启动SysTick定时器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延时结束
SysTick->CTRL = 0x00; //关闭SysTick定时器
SysTick->VAL = 0X00; //清空计数器
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_0); //将LED端口拉高,熄灭所有LED
}
int main( void )
{
Delay_Init();
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
Delay_ms(500);
}
}
--END--
收录于合集 **#**STM32
14个
上一篇STM32|外部中断下一篇STM32|通用定时器
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
定时器
+关注
关注
23文章
3237浏览量
114432 -
Systick
+关注
关注
0文章
62浏览量
13042 -
STM32F103ZET6
+关注
关注
9文章
67浏览量
21090
发布评论请先 登录
相关推荐
如何实现PTP协议的精准同步时钟?
尊敬的技术大牛们,你们好!
现有一项目需要用到贵公司的STM32F4系列产品,由于业务场景对时钟同步精度要求很高。所以需寻求你们的技术支撑,提供关于STM32F4系列的PTP协议或IEEE1588协议的参考代码!以便实现PTP的时间精准
发表于 03-26 07:57
请问STM32 USB通信延迟有多大?
STM32作为从机,接收来自PC的实时IO信号,大约每秒100次,那每次信号只有20ms的间隔我用串口做,主机发送到从机接收到,延迟很不稳定,大约从10ms-40ms,从机执行的IO信号的时候很不均匀。。
不知道USB通信能做到多低的延
发表于 04-18 08:26
TMS570是否有延迟指令
Hello Ken,
请问一下,我有一个指令需要延迟0.1s 才执行,但使用for 又无法精准的控制。
TMS570除了使用中断以外,有更方便的延迟指令可以用吗?
谢谢您
Shunfan
发表于 06-21 10:23
stm32使用外部精准时钟
使用外部精准时钟#include "rcc_driver.h"//1.硬件初始化:72MHzvoid rcc_init(void){//0.将RCC设置为缺省状态
发表于 08-19 06:30
STM32精准延时是什么意思
延时,就是停在那,啥都不干,发呆。精准延时,就是发呆多长时间,是精确的。比如,要求某个IO口维持低电平1毫秒后,再维持高电平3毫秒,就需要把IO口拉高,然后延时1毫秒,再拉低,再维持3毫秒。类似这种
发表于 12-07 09:08
最简单的延时到最精准延时函数的各种写法及原理
对于STM32系列的延时函数有着不同的写法,本章将给大家带来最简单的延时到最精准延时函数的各种写法及原理。在STM32系列中要学会用好systick定时器,这很重要一.普通延时函数原理:用C中累加
发表于 01-14 06:43
具突破性的 0.5ppm INL、1Msps、无延迟 SAR ADC实现了真正的 20 位精准度
具突破性的 0.5ppm INL、1Msps、无延迟 SAR ADC实现了真正的 20 位精准度
发表于 03-21 12:00
•11次下载
STM32 PWM输出延迟问题
事件原因:PWM正常初始化,监听串口数据,根据上位机通讯协议,更改PWM的频率和占空比,达到控制外围输出效果。调试效果:PWM在更改后,大概延迟5-10s才能正常输出波形。解决方法:在更改完PWM
发表于 12-24 18:57
•12次下载
评论