回答

收藏

STM32F0学习笔记(2)

STMCU STMCU 3299 人阅读 | 0 人回复 | 2012-11-21

本帖最后由 xinxincaijq 于 2012-11-21 11:11 编辑

第二课  让灯闪起来systick应用实例
一、              工程的构成


可以看到,ST官方例子中,一个Systick  Project下分成四组,分别是User,STM32F0-Discovery,STM32F0XX_StdPeriph_Driver和MDK-ARM,在每个组别下面都有一些文件。

其中User文件组下面的文件都是针对这个Project而编写的,也是根据需要可以随时改写的。当然,这些文件的写法也有一些模板可供参考。

STM32F0-Discovery文件夹下是关于这块板硬件的一些定义,如LED接在哪个引脚上,按钮接在哪个引脚上等等。STM32F0XX_StdPeriph_Driver文件夹则是库文件,STM32F0的功能很多,针对不同的功能,库用了不同的文件来描述。如stm32f0xx_gpio.c用来描述有关GPIO引脚的特性,这样的文件一共有10多个,显然,在一个具体的例子中并非所有功能都会用到,因此,在这组文件中只需要挑选用到的文件就行了。MDK-ARM是用来描述ARM核的文件。注意这些文件上都是有一把小钥匙的,显示这些文件是被锁住了,不能更改。

二、              例子的研究

把main.c文件打开,去掉那些注释,我们可以看到,它也就是那么几行:

GPIO_InitTypeDef GPIO_InitStructure;

static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t nTime);

int main(void)

{


  /* Initialize Leds mounted on STM32F0-discovery */

  STM_EVAL_LEDInit(LED3);

  STM_EVAL_LEDInit(LED4);


  /* Turn on LED3 and LED4 */

  STM_EVAL_LEDOn(LED3);

  STM_EVAL_LEDOn(LED4);


  if (SysTick_Config(SystemCoreClock / 1000))

  {

    while (1);

  }


  while (1)

  {

    STM_EVAL_LEDToggle(LED4);//反转LED4的状态(亮/灭互换)


    Delay(50);         //延时50ms


    STM_EVAL_LEDToggle(LED3);//反转LED3的状态(亮/灭互换)


    Delay(100);  //延时100ms

  }

}


void Delay(__IO uint32_t nTime)    //延时函数

{

  TimingDelay = nTime;

  while(TimingDelay != 0);

}


void TimingDelay_Decrement(void)        //用来将TimingDelay变量减1的函数

{

  if (TimingDelay != 0x00)

  {

    TimingDelay--;

  }

}

看了这几行程序,我们要解开的疑惑实在是太多了,LED3,LED4两个符号哪里来的,为什么它们就表示了板上的两个LED?为什么50就是50ms?这是怎么实现的?除开main.c文件外,其他文件有什么用处?如果一一解释,那一篇文章的篇幅就太大了,我们先抓主体,然后抠细节吧。

打开stm32f0xx_it.c文件,去掉一堆我们暂时还不清楚什么用途的代码后,我们找到了这样的一行:


原来它在这里执行了TimingDelay_Decrement()函数。而正是这个函数让变量TimingDelay减1的。而在Delay(…)函数中,

void Delay(__IO uint32_t nTime)    //延时函数

{

  TimingDelay = nTime;

  while(TimingDelay != 0);

}


本文转自czlyzhj的博客——平凡的思考
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条