可以看到,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);
}
用户377235 2015-7-31 15:01
用户1814892 2015-5-13 10:57
用户377235 2014-3-17 15:06
teach51_109853927 2012-8-6 11:06