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);
}
}