给STM32工程加入类似Arduino编程里的micros()、millis()函数

想给STM32工搞一个已经开机时长,和执行一段函数所需要的时间,用一个定时器去计时又浪费。在其他平台有类似的函数可以实现,STM32也搞一个。找了一圈没发现前人的脚步(有人做出来了没公开发表而已),倒是发现一个标题党。最终在crazepony飞控代码中发现了蛛丝马迹。我要开始栽树了。
下面开始移植
平台 :stm32f407
函数库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
IDE:IAR
先在stm32f4xx_it.c中添加要用的变量

// cycles per microsecond
static volatile uint32_t usTicks = 0;
// current uptime for 1kHz systick timer. will rollover after 49 days. hopefully we won't care.
volatile uint32_t sysTickUptime = 0;

在stm32f4xx_it.c中添加下面函数,利用嘀嗒定时器中断计数实现

void SysTick_Handler(void)
{
  sysTickUptime++;
}

///循环计数器初始化
void cycleCounterInit(void)
{
    RCC_ClocksTypeDef clocks;
    RCC_GetClocksFreq(&clocks);
    usTicks = clocks.SYSCLK_Frequency / 1000000;
    SysTick_Config(clocks.HCLK_Frequency / 1000);  //SysTick开启系统tick定时器并初始化其中断,1ms
}

// Return system uptime in microseconds (rollover in 70minutes)
//返回 us
uint32_t micros(void)
{
    register uint32_t ms, cycle_cnt, usTicks_t;
    do {
        ms = sysTickUptime;
        cycle_cnt = SysTick->VAL;
    } while (ms != sysTickUptime);
    usTicks_t = usTicks;
    return (ms * 1000) + (usTicks_t * 1000 - cycle_cnt) / usTicks_t;;
}

// Return system uptime in milliseconds (rollover in 49 days)
uint32_t millis(void)
{
    return sysTickUptime;
}

调用cycleCounterInit();初始化后就OK了。
注意:不可以再去更改嘀嗒定时器里面相关计数寄存器,不然会打乱嘀嗒的计数。
delay延时同样使用micros()来实现,不可以用改嘀嗒计数寄存来写了
delay代码如下

/**************************实现函数********************************************
*函数原型:		void delay_us(u32 nus)
*功  能:		微秒级延时  延时nus 
*******************************************************************************/		    								   
void Delay_us(u32 nus)
{
		uint32_t t0=micros();
		while(micros() - t0 < nus);		
}

/**************************实现函数********************************************
*函数原型:		void delay_ms(u16 nms)
*功  能:		毫秒级延时  延时nms
*******************************************************************************/
void Delay_ms(u16 nms)
{
		uint32_t t0=micros();
		while(micros() - t0 < nms * 1000);
}

/**************************实现函数********************************************
*函数原型:		void Delay_s(u16 ns)
*功  能:		微秒级延时  延时ns
*******************************************************************************/		    								   
void Delay_s(u16 ns)
{
		uint32_t t0=micros();
		while(micros() - t0 < ns*1000000)			
}

再把没有声明的函数声明一下,没包含的头文件包含进来(有哪些没声明没包含的,编译一下不久都知道了)
例程在这里
https://download.csdn.net/download/u011597120/11222460](https://download.csdn.net/download/u011597120/11222460)

你可能感兴趣的:(给STM32工程加入类似Arduino编程里的micros()、millis()函数)