用惯了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);
}
}
例程代码放在资源链接里面了。