在Keil软件让STM32单片机实现Arduino的miliis()毫秒运行时间函数

用惯了arduino的时间函数,用keil后发现没有类似函数。自己写了一个试验了下。毫秒级还是很顺畅的,实现微秒的话会卡顿,希望有高人指点可以优化实现微秒micros()函数。
STM32F10x_CONF.H记得要加入这个 #include “stm32f10x_tim.h”
代码如下:

double  millis(void)
	{
		return T;
}
/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 Handler.
*******************************************************************************/
void TIM2_IRQHandler(void)
{
    static uint8_t display;
	T++;
	if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) 
	{
		TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
   
     }	
}
/*******************************************************************************
* Function Name  : TIM_Configuration
* Description    : TIM_Configuration program.
*******************************************************************************/
void TIM_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
  TIM_DeInit(TIM2);
  TIM_TimeBaseStructure.TIM_Period=1;			/* 1毫秒自动重装载寄存器周期的值(计数值) */
																	/* 累计 TIM_Period个频率后产生一个更新或者中断 */
  TIM_TimeBaseStructure.TIM_Prescaler= (36000 - 1);				    /* 时钟预分频数   例如:时钟频率=72MHZ/(时钟预分频+1) */
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV2; 			/* 采样分频 */
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 		/* 向上计数模式 */
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);							    /* 清除溢出中断标志 */
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM2, ENABLE);											/* 开启时钟 */
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configuration the nested vectored interrupt controller.
*******************************************************************************/
void NVIC_Configuration2(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 
	 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  													
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

main.c运行代码:

#include "stm32f10x.h"
#include "delay.h"
#include "Lcd_Driver.h"
#include "GUI.h"
int main(void)
{
	char text[20];
		NVIC_Configuration2();
	TIM_Configuration();

  delay_init(72);//Delay init.
	
	Lcd_Init();
	LCD_LED_SET;//通过IO控制背光亮	
	Lcd_Clear(BLACK);
	
 while(1)
  {  

		sprintf(text,"%20.3f",millis()/1000);
	  Gui_DrawFont_GBK24(16,30,RED,GRAY0,text);
	  delay_ms(100);
  }

}

例程代码放在资源链接里面了。

你可能感兴趣的:(STM32)