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 
	}
...

果然是和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有关于时钟的介绍:

Zephyr程序初探(1):LED程序及调试过程_第1张图片

Zephyr程序初探(1):LED程序及调试过程_第2张图片

看来就是这里的问题,我的开发板与官方的nucleo_f103rb外部时钟源不同,删除nucleo_f103rb_defconfig中的CONFIG_CLOCK_STM32F10X_HSE_BYPASS=y,重新make并下载到开发板上后LED能够闪烁了,至此我的第一个Zephyr运行成功^_^

你可能感兴趣的:(ARM,Zephyr)