Zephyr程序初探(1):LED程序及调试过程
编译环境搭建好后开始尝试我的第一个Zephyr程序编译和运行,手里有一块stm32f103c8t的开发板,Zephyr支持nucleo_f103rb开发板,所以以此来编译我的第一个程序。
在Zephyr根目录执行
source zephyr-env.sh
例子samples\basic\blinky是一个LED闪烁的程序,先修改boards\arm\nucleo_f103rb\board.h,设置正常的LED PIN脚。
进入samples\basic\blinky目录执行
make BOARD=nucleo_f103rb
最终输出
... AR kernel/lib.a CC src/main.o LD src/built-in.o AR libzephyr.a LINK zephyr.lnk IRQ isr_tables.c CC isr_tables.o LINK zephyr.elf BIN zephyr.bin
编译成功,使用STLINK下载到开发板上运行没反应,通过ST提供的工具查看MCU运行状态,反复run和halt, CPU始终停止在0x8000824上下,一定是这里出现了死循环,根据以往调试的经验判断应该就是时钟设置的不对,到out目录下查看有什么可以参考的文件,打开zephyr.lst,哇,就是它,所有的地址对应的代码都在这里,并且是以源码的形式呈现,我还以为会是汇编形式的文件,完全超乎我的预期。
找到这样一段:
#ifdef CONFIG_CLOCK_STM32F10X_PLL_SRC_HSE /* wait for to become ready */ rcc->cr.bit.hseon = 1; 800081a: 6823 ldr r3, [r4, #0] 800081c: f443 3380 orr.w r3, r3, #65536 ; 0x10000 8000820: 6023 str r3, [r4, #0] while (rcc->cr.bit.hserdy != 1) { 8000822: 6823 ldr r3, [r4, #0] 8000824: 0399 lsls r1, r3, #14 8000826: d5fc bpl.n 8000822 <stm32f10x_clock_control_init+0x5a> } ...
果然是和HSE有关,上下文中还有这样的判断#ifdef CONFIG_CLOCK_STM32F10X_HSE_BYPASS
查看nucleo_f103rb_defconfig文件中有这样的定义和描述:
# use HSE as PLL input CONFIG_CLOCK_STM32F10X_PLL_SRC_HSE=y # however, the board does not have an external oscillator, so just use # the 8MHz clock signal coming from integrated STLink CONFIG_CLOCK_STM32F10X_HSE_BYPASS=y
再看STM32F103的reference manual有关于时钟的介绍:
看来就是这里的问题,我的开发板与官方的nucleo_f103rb外部时钟源不同,删除nucleo_f103rb_defconfig中的CONFIG_CLOCK_STM32F10X_HSE_BYPASS=y,重新make并下载到开发板上后LED能够闪烁了,至此我的第一个Zephyr运行成功^_^