二、如何使用zephyr创建本地工程

(1)搭建好 Zephyr 环境后。

明确自己使用的硬件属于哪一类,

这里以stm32h723zg为例:

如图中的配置,注意当环境搭建好后,及时保留备份。

(2)进入 Zephyr 中

创建属于自己的工程,如:我当前使用的 my_file_project。

工程是通过复制

该工程到自己的工程目录下。

为了快速使用:这里就省去一些无关紧要的细节,只从使用角度进行说明。

进入下面文件夹,没有就创建文件夹添加 app.overlay(当明确自己的硬件时直接使用硬件命名也可)。这里为了简洁就删除了原本的文件,只保留自己当前硬件的文件。

记住之后操作,基本围绕 xx.overlay、prj.conf、xxx.dts、main.c 等几个文件进行操作。

首先,硬件如何确认是否存在?如当前的 nucleo_h723zg,本质就是一个最小系统板。在如下路径这里的 dts 文件需要提前备份,因为 dts 文件配置需要结合你自己的实际硬件进行细微调整。

如何调整dts文件,结合cubemx软件,主要调整系统时钟。

根据这张图就能调整,dts里的时钟了。

如下就是根据上面这张图进行的调整。

c 复制代码
&clk_lsi {
	status = "okay";
};

&clk_hsi48 {
	status = "okay";
};
&gpiog {
	status = "okay";
};
&clk_hse {
	/*hse-bypass;*/
	clock-frequency = <DT_FREQ_M(25)>; /* STLink 8MHz clock */
	status = "okay";
};

&clk_lse {
	status = "okay";
};

&pll {
	div-m = <2>;
	mul-n = <44>;
	div-p = <1>;
	div-q = <2>;
	div-r = <2>;
	clocks = <&clk_hse>;
	status = "okay";
};

&pll2 {
	div-m = <32>;
	mul-n = <129>;
	div-p = <2>;
	div-q = <2>;
	div-r = <2>;
	clocks = <&clk_hse>;
	status = "disabled";
};

&rcc {
	clocks = <&pll>;
	clock-frequency = <DT_FREQ_M(550)>;
	d1cpre = <1>;
	hpre = <2>;    /* HCLK: 275   MHz */
	d1ppre = <2>;  /* APB1: 137.5 MHz */
	d2ppre1 = <2>; /* APB2: 137.5 MHz */
	d2ppre2 = <2>; /* APB3: 137.5 MHz */
	d3ppre = <2>;  /* APB4: 137.5 MHz */
};

这里调整基本就不用动了,折后根据自己的项目需求再做调整。

当不知道某些外设如何调整时

也可参照其他的dts对相关外设进行配置调整,

另外需要注意:如下的dtsi这里也是硬件描述相关的,里面有对应的外设描述

即寄存器地址,中断,dma,timer ,iic等等外设的一下基本属性配置信息。

关于prj.conf文件基本是由:

CONFIG_xxxxxx=y/n 组成的,至于这些CONFIG_有哪些,可通过

这里Kconfig文件进行查看与配置,基本上Kconfig文件打开就有相关的配置说明。

之后就是对mian.c的编辑。

如:

c 复制代码
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000

/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)

/*
 * A build error on this line means your board is unsupported.
 * See the sample documentation for information on how to fix this.
 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{
	int ret;
	bool led_state = true;

	if (!gpio_is_ready_dt(&led)) {
		return 0;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return 0;
	}

	while (1) {
		ret = gpio_pin_toggle_dt(&led);
		if (ret < 0) {
			return 0;
		}

		led_state = !led_state;
		printf("LED state: %s\n", led_state ? "ON" : "OFF");
		k_msleep(SLEEP_TIME_MS);
	}
	return 0;
}

这个任务就是使用了外设led(gpio输出),串口(输出调试信息)两个外设实现的。

要想使用自己对应或指定的外设就配置,对应app.overlay文件如:

c 复制代码
/ {
	chosen {
		zephyr,console = &usart1;
		zephyr,shell-uart = &usart1;
	};

	leds: leds {
		compatible = "gpio-leds";
		green_led: led_0 {
			gpios = <&gpiog 7 GPIO_ACTIVE_HIGH>;
			label = "User LD1";
		};
	};
	aliases {
		led0 = &green_led;
	};
}
&gpiog {
	   status = "okay";
};
&usart1 {
	pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;
	pinctrl-names = "default";
	current-speed = <115200>;
	status = "okay";
};

对应的prj.conf

c 复制代码
CONFIG_GPIO=y
CONFIG_SHELL=y
CONFIG_UART_SHELL=y   

在my_file_project下执行

west build -p auto -b nucleo_h723zg //仅仅对修改的地方进行编译,耗时短

west build -p always -b nucleo_h723zg //全部重新编译,耗时久

成功就输出类似如下信息。

后面时硬件板子的型号,本质没差。

west flash 烧写,

或使用

烧写编译好的文件。

文件路径如下:

到此基本上就算是可以使用zephyr了。