STM32普通定时器实现延时函数

发布者:星辰古泉最新更新时间:2017-01-17 来源: eefocus关键字:STM32  定时器  延时函数 手机看文章 扫描二维码
随时随地手机看文章

/* SystemFrequency / 1000    1ms中断一次

 * SystemFrequency / 100000     10us中断一次

 * SystemFrequency / 1000000 1us中断一次

 */


#define SYSTICKPERIOD                    0.000001

#define SYSTICKFREQUENCY            (1/SYSTICKPERIOD)


/**

  * @brief  定时器2的初始化,,定时周期1ms

  * @param  无

  * @retval 无

  */

void TIM2_Init(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


    /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    

    /* Time base configuration */         

    TIM_TimeBaseStructure.TIM_Period = 999;

    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/SYSTICKFREQUENCY -1;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    

    TIM_ARRPreloadConfig(TIM2, ENABLE);

    

    /* 设置更新请求源只在计数器上溢或下溢时产生中断 */

    TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global); 

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

}


/**

  * @brief   ms延时程序,1ms为一个单位

  * @param  

  *        @arg nTime: Delay_ms( 10 ) 则实现的延时为 10 * 1ms = 10ms

  * @retval  无

  */

void Delay_ms(__IO uint32_t nTime)

{     

    /* 清零计数器并使能滴答定时器 */  

    TIM2->CNT   = 0;  

    TIM_Cmd(TIM2, ENABLE);     


    for( ; nTime > 0 ; nTime--)

    {

     /* 等待一个延时单位的结束 */

     while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);

     TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    }


    TIM_Cmd(TIM2, DISABLE);

}


关键字:STM32  定时器  延时函数 引用地址:STM32普通定时器实现延时函数

上一篇:S3C2440的LCD虚拟显示测试
下一篇:获取单片机代码运行时间的方法

推荐阅读最新更新时间:2024-03-16 15:31

STM32外设寄存器地址定义
一直都是用STM32做项目中的主控芯片,在编程的时候,之前一直忽视了一个问题,那就是寄存器的位置是如何定义的,为什么用一个USART1- CR操作就能够给这个CR寄存器赋值?其实这是一个比较底层的问题,不懂这方面的知识也并不影响使用STM32,因为底层的定义工作,厂家一般都会做好,但是多了解一点原理性的东西,对自己还是很有帮助的。 这里我就以STM32F407的USART寄存器为例,介绍一下ST厂家是如何做寄存器定义的。 首先在stm32f4xx.h中 typedef struct { __IO uint16_t SR; /*! USART Status register, Address
[单片机]
STM8 TIM2 定时器的问题
所用的芯片为STM8S103F3P6,编译器为IAR ,程序代码如下: // #include iostm8s105c6.h #include iostm8s103F3.h // Very importtant void DelayMS(unsigned int ms) { unsigned char i; while(ms != 0) { for(i=0;i 250;i++) { } for(i=0;i 75;i++) { } ms--; } } ////GPIO口初始化 void GPIO_init(void) { PA_DDR = 0x08; // 配置PD端口的方
[单片机]
MSP430 精准延时定时器 TIMERA 0.5实现LED闪烁
在经历过上一章的粗暴for()循环进行延时和简单的delay_ms(),delay_us()精准延时之后,本章介绍另一种精准延时定时器 定时器基本可以分为四种定时器 本章为大家着重介绍定时器timerA进行定时 Timer_A是一个16位计时器/计数器,有三个捕获/比较寄存器。分别为CCR0,CCR1,CCR2。 Timer_A可以支持多个捕获/比较、PWM输出和间隔计时。Timer_A还具有广泛的中断功能。在溢出条件下,可以从计数器和每个捕获/比较寄存器中生成中断 1 定时器A的时钟源和分频比 定时器A的时钟源可以是TACLK,ACLK,SMCLK,INCLK,四种时钟。使用ID_X进行1/2/4/8分频 2 定时器模式 1
[单片机]
MSP430 精准<font color='red'>延时</font>之<font color='red'>定时器</font> TIMERA 0.5实现LED闪烁
如何使用STM32的USB非控制端点发送多个数据包
以下是网友提出的问题和我对这个问题的说明。 SMT32F103,根据例程Custom_HID修改,利用EP1 以EP_INTERRUPT 的方式发送包,原来的例程每次发送2个字节,现在修改后包的长度不超过64字节时发送是正常的,但当一个包长超过64字节时就发送失败,没有数据出来(程序没有死机),该改的地方都已经修改了,不知道哪个地方还没有改到位,谢谢! 现象就是 超过63字节的包死活也发不出去,而且发送包的大小 还与 CustomHID_ConfigDescriptor里面的 EP1 IN endpoint 描述里包大小有关 ,没道理啊,其他的MCU 这地方设置为8 照样发送256B 以上的包。 在Custom_HI
[单片机]
STM32_TEST.axf: Error: L6218E: Undefi
STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 此问题错误提示已经十分清楚的告诉你错在哪里了,Undefined symbol SystemInit ,翻译过来就是:SystemInit 这个符号没有定义,随后的小括号告诉你了,是在startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_
[单片机]
关于stm32的USB学习笔记之USB_HW.c
view plaincopyprint? #include stm32f10x_lib.h #include stm32f10x_map.h #include usbreg.h #include usbuser.h #include usbcore.h #include usb_hw.h #define _DEBUG_ #include debug.h #define USB_EP_NUM 4 /*端点缓冲区的开始地址 *因为每个缓冲块都需要一个端点描术表 *而所有的端点描述表放在,USB缓冲区的首部 *此地址是相对于USB缓冲区的地址,我认为加上Offset更好些 *这里使用2
[单片机]
STM32按键程序
u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(KEY3==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
[单片机]
STM32中电源各引脚说明分析
一、数字电路中,电源符号 VCC:C=circuit,表示电路的意思,即接入电路的电压; VDD:D=Device,表示器件的意思,即器件的工作电压; VSS:S=Series,表示公共连接的意思,通常指电路公共接地端电压。 总结来说,VCC接电路的电源(±),VSS接电路的地,VDD接器件的电源引脚(±)。 二、STM32中电源各引脚说明 VDDA:A=Analog,表示模拟的意思,所以就是表示模拟器件的工作电压; VSSA:表示模拟器件的公共端地。 VBAT:给后备区域供电,维持包括RTC/BKP寄存器等在内的一些数据的保存。 100引脚的封装中: VREF-:A/D的参考,当需要使用时,必须绑定到VSSA(使得所有模拟器
[单片机]
<font color='red'>STM32</font>中电源各引脚说明分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved