Systick中断延时

       1 功能要求

                       利用SysTick中断使LED每秒闪烁一次

                       LED的连接关系不变,与第一个工程一样

        2 程序实现

           1 算法描述

                  为了通过系统时钟使LED(D2)每隔一秒闪烁一次,必须要做如下工作。

          在stm3210x_it.h中说明一个全局变量,内容如下表示

/*Exported type ---------------*/
extern_IO unit32_t TimingDelay;

                        在mian.c中的定义以下函数和一个全局变量。        

//SysTick 初始化
  void Init_SysTick(void)
   {
        if(SysTick_Config(SystemCoreClock/1000))                //1毫秒的时基
                while(1);


    }
   //延时函数
    _IO unit32_t TimingDelay;                                    //定义全局变量
    void delay_ms(_IO unit32_t  nTime)
   {    
       TimingDelay = nTime;
            while(TimingDelay !=  0)


    }

       在此使用到的SysTick_Config()函数是在库里有的,可参阅v350库帮助系统。它主要集成了优先级、复数计位器、时钟源、时基设置、使能中断、启动计时等等。

        main.c 的主要内容如下:

void SystemInit()            //使用工程模板时该步骤可省略
{    
    unsigned char temp = 0;
    RCC_Delnit();
    RCC->CR|=0x00010000;
    while(!(RCC->CR>>17))
    {
        RCC->CFGR=0x00000400;
        PLL -= 2;
        RCC->CFGR|=PLL<<18;
        RCC->CFGR|=1<<16;
        FLASH->ACR|=0x32;
        RCC->CR|=0x1000000;
        while(!(RCC->CR>>25));
        RCC->CFGR|= 0x00000002;
        while(temp!=0x02)
            {
             temp RCC->CFGR>>2;
             temp&=0x03;   
            }
    }
        
}

//基于stm32f103最小系统板
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2periphClockCmd(RCC_APB2Periph_GPIOC_ENABLE);        //使能pc端口时钟
    GPIO_InitStructure.GPIO_Pin   = GPIO_PIn_8;                    //选择对应的引脚
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;           //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            
    GPIO_Init(GPIOC,&GPIO_InitStructure);                       //初始化PC端口
    GPIO_SetBits(GPIOC,GPIO_Pin_8);                            //关闭LED

}
 //SysTick 初始化--1ms中断的定时参数
void Init_SysTick(void)
{    
       if(SysTick_Config(SystemCoreClock/1000))
            while(1);
        //NVIC_SetPriority(SysTick_IRQn,3);
    
}
//延时函数
//SysTick的时钟源为72M,SystemCoreClock = 72000000Hz
    _IO unit32_t TimingDelay;                                    //定义全局变量

 void delay_ms(_IO unit32_t  nTime)
   {    
       TimingDelay = nTime;
            while(TimingDelay !=  0)


    }
//主函数
 int main(void)
 {
    //配置系统时钟为 72MHz,可省略,在V3.50中就是72MHz
    SystemInit();                //可省略该步骤
    LED_GPIO_Config();           //LED端口初始化
    Init_sysTick();                //配置时基为1ms
        while(1)
    {
          GPIO_SetBits(GPIOC,GPIO_Pin_8);        //设置该口为 1 高电平 灯灭
          delay_ms(1000);                         //延时1 s
          GPIO_RestBits(GPIOC,GPIO_Pin_8);       //设置该口为 0 低电平 灯亮
          delay_ms(1000);                        //延时1s
    }

}

        

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值