Stm32CubeMX 生成设备树
使用STM32CubeMX配置Stm32设备树
一、前期准备
1. Stm32CubeMX下载
官网下载, 需要先注册st账号:
Stm32CubeMX
我的核心板使用的是正点原子的即 STM32MP135D-AE
二、创建项目
打开Stm32CubeMX
在这里是可以选择其他芯片型号的,可以根据自己的板子
1. 选择 MP1x 型号
可以根据自己的芯片型号,如果是st公司的板子 也可以选择旁边的Board Selector
进行选择
选择后,将会自动下载资源,然后弹出选项,这里默认OpenSTLinux
就可以了
2. 填写项目的基本信息
3. DDR 配置
这里配置后,暂时还会报错,现不必理会,等后面配置完时钟后错误就会消失
DMA, GIC, MDMA 使用默认的配置就可以,DDR 配置如下:
4. RCC 配置
Analog 模块暂时不需要
5. Timer 模块配置
这里 RTC 使用默认配置即可,需要勾选Activate Clock Source
TAMP 需要要设置Tamper 2 设置为 Active Input,其余不用管
6. Connectivity
(1) SDMMC1 配置
SDMMC1 是sd卡
SDMMC2 是emmc
(2)Uart4 配置
(3) USB_OTG_HS 配置
7. 安全模块配置
默认配置: BSEC, ETZPC
TF-A配置: HASH1, RNG1
OPTEE配置: HASH1, RNG1,
需要将对应项中选中 Actived,才能启用该项
8. Computing配置
其他可以先不配置
9.检查串口GPIO配置
这里需要根据硬件手册进行配置,将uart4修改为上拉
10 选择 GPIO 功能复用
- 如果某引脚和自己板子的不同
- 先搜索自己所需引脚
- 对应引脚闪烁,点击展示可复用功能
- 选择复用功能
11. 时钟配置
授人以鱼不如授人以渔,我将举例展示修改这里的参数是如何对应于设备树时钟配置,如有不对,还请指正
这里细节展示只是部分,最后会展示一个全部的
在这里选择Yes
,或者点击上面的Resolve Clock Issues
,可以自动配置出正确的时钟
也可以选择No
暂不理会
(1) 为设备选择时钟源
满足以下规则,其他设备时钟源的
CLK_设备_时钟源
(2) 时钟分频
将时钟树对应分频配置减一个等级,就是代码中的实际参数
不完全都是减1,APB5DIV
这里分频系数是1 2 4 8 16
这里选择4分频,代码中体现为2
(3) PLL(Phase-Locked Loop) 锁相环配置
这里以 PLL4 为例:PLL4 选择 HSE 作时钟源 DIVM4 使用 2分频, DIVN4 使用 50倍频,代码中将数字减一个等级,这里都是连续的,所以都是减1,下面的DIVP4 DIVQ4 DIVP4亦是如此
其他的如是而已
(4) 时钟树总览
关于CKPER Clock Mux
我没有暂时找到在那里配置,我发现不配置此时钟,MPU无法正确配置
那么只能手动更改,将optee代码中 CLK_CKPER_DISABLED
修改为
CLK_CKPER_HSE
理论上只要不报错(红框),怎么配置都是没问题的,只是会影响设备的使用,除非板子上的外设有严格的时钟要求,比如网卡等等
全部配置完毕后,生成代码
12. 生成设备树代码
如果安装了STM32CubeIDE,可以选择使用它打开项目
三、对生成代码手动补充
生成的代码还需增加内容, 根据此连接中nextcloud网盘文件查看需要补充的内容
参考:
example
注意链接中
这个是我的 stm32mp135d:
这个是st官方板子的具体配置流程,需要的话直接拿来用吧:
No serial driver found 问题解决
这是在bringup官方板子时,出现的一个问题:
配置完成后,启动板子如果遇到以下问题:
U-Boot 2022.10-stm32mp-r1 (Aug 22 2023 - 17:22:08 +0200)In Uboot source code file drivers/serial/serial_stm32.c, function stm32_serial_probe(), 150 µs is
not enough:
CPU: STM32MP135F Rev.Y
Model: STMicroelectronics custom STM32CubeMX board - openstlinux-6.1-yocto-mick1
Board: stm32mp1 in trusted mode (st,stm32mp135f-yao13cubemx690-mx)
Board: MB1635 Var1.0 Rev.E-02
DRAM: 512 MiB
optee optee: OP-TEE: revision 3.19 (6cc4c1a2)
Clocks:
- MPU : 650 MHz
- AXI : 266.500 MHz
- PER : 0 MHz
- DDR : 533 MHz
No serial driver found
resetting ...
I/TC: Forced system reset
原因:
修改u-boot源码中的此文件drivers/serial/serial_stm32.c
的function stm32_serial_probe()
函数中,这里的150 µs 是不够的:
/*
* before uart initialization, wait for TC bit (Transmission Complete)
* in case there is still chars from previous bootstage to transmit
*/
ret = read_poll_timeout(readl, isr, isr & USART_ISR_TC, 10, 150,
plat->base + ISR_OFFSET(stm32f4));
if (ret) {
clk_disable(&clk);
return ret;
}
这个时候OPTEE还在打印信息,探测串口还太早了,需要多等一下(For cases cases where UART is probed early (OPTEE is sending message), 150 µs is only for 2 bits of 115200 bps, not long enough to see a TC (Transfer Complete) event.)
解决:
将150修改为1500 (Change 150 µs to 1500 µs which is long enough for one byte under 115200 bps)
四、关于内核设备树
对于 stm32mp13x,内核设备树
- 可以与 U-Boot 设备树文件相同
- 可以有更多节点,以支持更多外部外设
五、其他节点配置
如果需要其他外设节点,可以在Stm32CubeMX配置:
- Watch dog
- Can be activated starting from TFA
- Ethernet
- Can be activated starting from UBOOT
- LCD / TouchPad
- Can be activated starting from UBOOT
- LED+Button
- Can be activated starting from UBOOT
- Low Power mode and WAKEUP pin
- Only in OPTEE
- Protection on GPIO
- Only in OPTEE
- ADC monitoring
- TAMP
至此 STM32CubeMX 使用流程已经完成
能力一般,水平有限,希望能帮到您