* @param
* @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us
* @retval 无
*/
void Delay_us(__IO uint32_t nTime)
{
/* 清零计数器并使能滴答定时器 */
SysTick-》VAL = 0;
SysTick-》CTRL |= SysTick_CTRL_ENABLE_Msk;
for( ; nTime 》 0 ; nTime--)
{
/* 等待一个延时单位的结束 */
while(SysTick_GetFlagStatus() != SET);
}
/* 关闭滴答定时器 */
SysTick-》CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
检验Delay_us执行时间中用到的GPIO(gpio.h、gpio.c)的配置
#ifndef __GPIO_H
#define __GPIO_H
#include “stm32f10x.h”
#define LOW 0
#define HIGH 1
/* 带参宏,可以像内联函数一样使用 */
#define TX(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_0);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_0)
void GPIO_Config(void);
#endif
#include “gpio.h”
/**
* @brief 初始化GPIO
* @param 无
* @retval 无
*/
void GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
在main函数中检验Delay_us的执行时间
#include “systick.h”
#include “gpio.h”
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
GPIO_Config();
/* 配置SysTick定时周期为1us */
SysTick_Init();
for(;;)
{
TX(HIGH);
Delay_us(1);
TX(LOW);
Delay_us(100);
}
}
示波器的观察结果
可见Delay_us(100),执行了大概102us,而Delay_us(1)执行了2.2us。
更改一下main函数的延时参数
int main(void)
{
/* LED 端口初始化 */
GPIO_Config();
/* 配置SysTick定时周期为1us */
SysTick_Init();
for(;;)
{
TX(HIGH);
Delay_us(10);
TX(LOW);
Delay_us(100);
}
}
示波器的观察结果