教你如何点亮STM32F0DISCOVERY的LED(程序++)
点个LED看似简单,实际上它是在了解ST的编程特点及寄存器控制基础上的。
一、启动
ST的公司的例程中,使用startup_stm32f030x8.s文件作为启动时执行的第一步。在这个文件里要执行的工作是:
n 初始化SP;
n 初始化PC指针 --- 指向iar_program_start
n 设置中断向量表各exception的地址
n 配置系统时钟
n 转向C语言的main函数
复位入口的指令为:
Reset_Handler
LDR R0, =SystemInit
BLX R0 // 调用SystemInit()函数。这个函数在
// system_stm32f0xx.c文件中。
LDR R0, =__iar_program_start
BX R0 // 跳转主程序
可见,ST公司的方法,对系统时钟等的初始化,并不是在main()函数中执行的。
SystemInit()函数中,设置RCC的几个寄存器,初始化系统时钟。
…………
#ifdefined (PLL_SOURCE_HSI)
/* At this stage the HSI is already enabled */
…………
#else
#if defined (PLL_SOURCE_HSE)
/* Enable HSE */
…………
#endif
二、延时函数
在早期的单片机应用中,一般使用循环来延时,而M0有SYSTICK,使用它延时就可不占CPU时间。
1、配置Systick
使用SysTick_Config()函数完成。
2、在中断SysTick_Handler中实现计数
void SysTick_Handler(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
三、IO控制
stm32f030的IO功能主要有
l 输入悬空
l 输入上拉
l 输入下拉
l 模拟信号
l 输出开漏加上拉或下拉
l 输出推挽加上拉或下拉
l 其它功能推挽上拉或下拉
l 其它功能开漏上拉或下拉
IO的控制寄存器实现以上功能。有端口上(下)拉控制寄存器、置位寄存器、清0寄存器、切换寄存器等12个控制寄存器。对LED的控制,使用数据输出寄存器。
四、程序
int main(void)
{
LEDInit(LED3);
LEDInit(LED4);
/*Turn on LED3 and LED4 */
LEDOn(LED3);
LEDOn(LED4);
if(SysTick_Config(SystemCoreClock / 1000))
{
/*Capture error */
while(1);
}
for(;;)
{
/* Toggle LED4 */
LEDToggle(LED4);
/* Insert 50 ms delay */
Delay(50);
/* Toggle LED3 */
LEDToggle(LED3);
/* Insert 100 ms delay */
Delay(100);
}
}
我顶我顶我顶我顶