0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F407入门开发: 滴答定时器配置

DS小龙哥-嵌入式技术 ? 来源:DS小龙哥-嵌入式技术 ? 作者:DS小龙哥-嵌入式技 ? 2022-05-30 09:17 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

第一章 介绍滴答定时器的章节

滴答定时器和普通的定时器功能其实差不多,都是定时器;滴答定时器是24位的,单次计时的时间更加长,平时滴答定时器主要作为系统心跳使用。 比如:RTOSUCOS实时操作系统的心跳值、LWIP、UIP网络协议栈的心跳值等等。 如果项目里没有操作系统这些系统库,可以将滴答定时器用来作为延时函数的时间基准,方便给项目提供精确的延时;下面介绍了滴答定时器的基本使用之后,也会介绍滴答定时器作为延时函数的封装方法,提供高精度的延时函数。

STM32F407参考手册中第10章介绍了滴答定时器的校准值。

M4 权威指南介绍滴答定时器的章节,M3 权威指南中与M4 权威指南中的介绍一样。


第二章 滴答定时器的示例代码

在sys.c文件中增加滴答定时器的代码,测试定时效果

下面的例子代码是演示滴答定时器的使用效果,直接设置了一个固定的超时时间,时间到达之后就会进入到中断,改变LED状态。

/*
函数功能:滴答时钟初始化配置
注意:SysTick->LOAD是一个24位的寄存器,单次最大延时时间为894.7848ms
*/
void SysTickInit(void)
{	
	SysTick->CTRL&=~(1<<2);  //选择外部时钟源	
	SysTick->CTRL|=1<<1;     //开启中断
	SysTick->LOAD=18750*800;//重装载寄存器,最大24位,最大值:16777215
	SysTick->VAL=0; 	     //清除CNT计数值
	SysTick->CTRL|=1<<0;     //SysTick 定时器的使能位
}

/*
函数功能:滴答时钟中断服务函数
*/
void SysTick_Handler(void)
{
  LED0=!LED0;
  LED1=!LED1;
}
复制代码

第三章 使用滴答定时器编写延时函数

3.1 在delay.c文件增加以下代码

/*
函数功能:延时函数初始化
*/
void DelayInit(void)
{
	SysTick->CTRL&=~(1<<2);  //选择外部时钟源	
	SysTick->CTRL&=~(1<<1);  //关闭中断
}


/*
函数功能:延时毫秒的函数
函数参数:毫秒的时间
*/
void DelayMs(u32 time)
{
	u32 stat;
	SysTick->LOAD=18750*time; //重装载寄存器,最大24位,最大值:16777215
	SysTick->VAL=0; 			   //清除CNT计数值
	SysTick->CTRL|=1<<0;     //SysTick 定时器的使能位
	do
	{
           stat=SysTick->CTRL;  //获取状态位
	}while((!(stat&1<<16))&&(stat&1<<0));
	SysTick->CTRL=0x0; 
}


/*
函数功能:延时微秒的函数
函数参数:毫秒的时间
*/
void DelayUs(u32 time)
{
	u32 stat;
	SysTick->LOAD=18.750*time; //重装载寄存器,最大24位,最大值:16777215
	SysTick->VAL=0; 			   //清除CNT计数值
	SysTick->CTRL|=1<<0;     //SysTick 定时器的使能位
	do
	{
			stat=SysTick->CTRL;  //获取状态位
	}while((!(stat&1<<16))&&(stat&1<<0));
	SysTick->CTRL=0x0; 
}
复制代码

3.2 闪光灯示例

在主函数里加上逻辑代码,使用刚才编写的延时函数完成延时,实现闪光灯效果。

#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
#include "exti.h"
int main(void)
{
	LED_Init();
	KEY_Init();
	USART1_Init(84,115200);
	KEY_EXTI_Init();
	while(1)
	{
		DelayUs(100);
		LED0=!LED0;
		LED1=!LED1;
	}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6068

    文章

    45037

    浏览量

    652433
  • STM32
    +关注

    关注

    2295

    文章

    11035

    浏览量

    366011
  • 定时器
    +关注

    关注

    23

    文章

    3302

    浏览量

    119449
  • STM32F407
    +关注

    关注

    15

    文章

    188

    浏览量

    30754
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    stm32f407无法配置定时器2为全部dma怎么解决?

    本人使用定时器2配置为4个通道的dma捕获时,出现stream6和stream7这两个对应的通道无法同时存在,在都配置的情况下,只要这两个对应的通道一接入外部信号,就会出现所有dma无法产生中
    发表于 06-11 06:49

    stm32F407平台上使用freertos,使用pvPortMalloc申请内存,发现内存中的数据总被修改,怎么解决?

    如题,我现在在stm32F407平台上打开FREERTOS,然后使用pvPortMalloc动态申请内存的时候,发现这块内存中的数据总是变化,后面改为malloc申请,内存中的数据就符合预期了,我已经按照网上的流程配置了freertos,不知道是什么原因导致这种现象?
    发表于 03-07 09:03

    STM32Cube配置RTOS时定时器如何选择?

    STM32Cube配置RTOS时定时器如何选择
    发表于 03-07 08:47

    stm32f407这个STM32_RCC_PERIPHCLK_SDMMC是哪里定义的?

    stm32f407这个STM32_RCC_PERIPHCLK_SDMMC 是哪里定义的 函数调用这个会报错 Error[Pe020]: identifier \"
    发表于 03-07 07:34

    STM32F407的高速USB,采用的是虚拟串口方式,VCP驱动有linux系统的吗?

    STM32F407使用高速USB的Device模式,使用的是虚拟串口VCP方式,网站上有Window7和Window8的驱动,是否也有linux系统下的驱动?
    发表于 03-07 06:42

    求一份在STM32F407的CS1239的驱动程序

    求一份STM32F407的CS1239的驱动程序,目前没有调试通,读不到数据,邮箱:298487317@qq.com谢谢?
    发表于 02-10 16:52

    STM32F407输出的2片ADC的转换值与输入ADC的电压值相同了,不知道是何原因?

    采用STM32F407 控制2片ADS125550sps速率进行ADC采样,使用外部基准,单元上电后偶然会出现STM32F407 输出的2片ADC的转换值,较输入ADC的电压值大20%的现象,测量
    发表于 01-22 08:15

    STM32F405xx和STM32F407xx微控制数据手册

    电子发烧友网站提供《STM32F405xx和STM32F407xx微控制数据手册.pdf》资料免费下载
    发表于 01-03 14:49 ?2次下载

    STM32F407和ADS8684进行SPI通信,寄存怎么配置

    通过STM32F407和ADS8684进行SPI通信,阅读了ADS8684的手册,配置STM32F407为主,CPOL为0,CPHA为1,这样对吗? 配置好后应该先设置ADS8684
    发表于 12-20 06:25

    STM32 F407无传感控制PLL

    电子发烧友网站提供《STM32 F407无传感控制PLL.zip》资料免费下载
    发表于 12-19 14:10 ?1次下载

    STM32F407可以同时输出四路信号吗?

    使用STM32F407驱动DAC7615输出单路信号时没有问题,现在想同时输出四路信号时,就出现了问题,请问这个该怎么实现了? 现在采取的四路是,先利用地址和REG引脚分别更新A、B、C、D四个
    发表于 12-13 06:23

    STM32F407 MCU使用SD NAND?不断电初始化失效解决方案

    STM32F407微控制单元(MCU)与SD NAND的结合提供了强大的存储解决方案。然而,不断电初始化失效问题可能会导致系统稳定性和数据完整性受损。我们将STM32F407与SD NAND集成时可能遇到的初始化问题,并提供专
    的头像 发表于 12-11 10:51 ?1022次阅读
    <b class='flag-5'>STM32F407</b> MCU使用SD NAND?不断电初始化失效解决方案

    详解CKS32F107xx系列的定时器同步功能

    CKS32F107xx系列部分定时器在内部是相连的,可用于定时器同步或链接,方便用户配置不同的同步模式,以便在电机控制、数据采集和PWM信号生成等应用中,实现复杂的时间序列和多通道的同
    的头像 发表于 11-26 17:51 ?1100次阅读
    详解CKS32<b class='flag-5'>F</b>107xx系列的<b class='flag-5'>定时器</b>同步功能

    如何基于STM32F407通过SPI控制ADS8361?

    如何基于STM32F407通过SPI控制ADS8361?
    发表于 11-19 08:23

    STM32F407输出I2S信号给TAS5719始终无声,偶尔会有干扰噪声,为什么?

    STM32F407输出I2S信号给TAS5719,始终无声,偶尔会有干扰噪声。外接其他DAC声音正常。TAS57XX GDE产生的配置文件。喇叭始终没有音乐。不知道哪里有问题。
    发表于 10-30 06:41