SysTick 倒计时

include “stm32f10x.h”

static __IO u32 Timing;
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIOD->BSRR = GPIO_Pin_2;

}

/**寄存器版的SysTick******(缺点是while(!(SysTick->CTRL & =0X00010000));
在这个时候会浪费CPU*
void Delay_Us(uint32_t nTime)
{
SysTick->LOAD = 72*nTime;//装入定时的次数
* LOAD 重装值寄存器 就是当计数到0的说时候,再次从该数值进行倒计时
**
SysTick->CTRL = 5;// CTRL是控制和状态寄存器
* 16 COUNTFLAG 当计数满的时候自动置为1

      2     CLKSOURCE   当该位是0的时候选择的是72M的时钟
                        当该位是1的时候选择的是9M的时钟
      1     SysTick     当该位是0的时候计数到0的时候不会发送异常处理的标志
                        当该位是1的时候计数到1的时候会发送异常处理的标志
      0     ENABLE      (使能位)当该位为0的时候SysTick不会打开
                        当该位为1的时候打开SysTick;

while(!(SysTick->CTRL&0x00010000));
SysTick->CTRL = 0;
}*/

void SysTick_Handler()
{
if(Timing!=0)
Timing–;
}
void Delay_us(uint32_t us)
{
Timing = us;
SysTick->CTRL |= 0x07;
while(Timing!=0);
SysTick->CTRL |= 0x00;
}

void Delay_ms(uint32_t ms)
{
Delay_us(ms*1000);
}

void Delay_s(uint32_t s)
{
Delay_ms(s*1000);
}

int main()
{
//uint32_t i;
LED_Init();
SysTick_Config(72);
while(1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//输出低电平
Delay_s(1);
GPIO_SetBits(GPIOD,GPIO_Pin_2);//输出高电平
Delay_s(1);
}

}

猜你喜欢

转载自blog.csdn.net/qq_34988341/article/details/53364985