本帖最后由 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的博客——平凡的思考
|