Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32L4
ulog_easyflash
L475移植,包括fal+easyflash+ulog_easyflash
发布于 2020-12-23 15:51:35 浏览:2087
订阅该版
[tocm] ## 前言 这几天在搞手持端设备,用的主控是STM32L475RCT6,暂且先不管低功耗,先让设备跑起来。 本来想直接阐述问题,但是想想还是写一下过程,自己脑子不好使老是忘,放在网站上当做日记了,也方便大家,同时如果移植过程中有问题,大佬也会指出。 ## 1. 移植: 1.1. 看好自己板子的晶振,根据自己板子的晶振在STM32CubeMx中设置,并设置shell串口,把CubeMx生成的main.c中的“SystemClock_Config”复制到board.c中替换原有的。 1.2. shell 移植的过程中会发现,RTT提供的“uart_config.h”文件中只有LPUART1、UART1、UART2、UART3,L475明明支持5个串口呢,没办法谁让硬件工程师把调试串口画在了UART5上,增加如下代码段,关于这段代码的添加最好还是配合着看看“dma_config.h”,因为UART上有些DMA接口如果“dma_config.h”中没有,即使添加上也是没有用的。 ```c #if defined(BSP_USING_UART5) #ifndef UART5_CONFIG #define UART5_CONFIG \ { \ .name = "uart5", \ .Instance = UART5, \ .irq_type = UART5_IRQn, \ } #endif /* UART5_CONFIG */ #if defined(BSP_UART5_RX_USING_DMA) #ifndef UART5_DMA_RX_CONFIG #define UART5_DMA_RX_CONFIG \ { \ .Instance = UART5_RX_DMA_INSTANCE, \ .request = UART5_RX_DMA_REQUEST, \ .dma_rcc = UART5_RX_DMA_RCC, \ .dma_irq = UART5_RX_DMA_IRQ, \ } #endif /* UART5_DMA_RX_CONFIG */ #endif /* BSP_UART5_RX_USING_DMA */ #if defined(BSP_UART5_TX_USING_DMA) #ifndef UART5_DMA_TX_CONFIG #define UART5_DMA_TX_CONFIG \ { \ .Instance = UART5_TX_DMA_INSTANCE, \ .request = UART5_TX_DMA_REQUEST, \ .dma_rcc = UART5_TX_DMA_RCC, \ .dma_irq = UART5_TX_DMA_IRQ, \ } #endif /* UART5_DMA_TX_CONFIG */ #endif /* BSP_UART5_TX_USING_DMA */ #endif /* BSP_USING_UART5 */ ``` ### 1.3. 下载观察现象 ![a.png](/uploads/20201223/d610da06b2f44b91c28625dee5d37880.png) ## 2. 添加Fal组件管理片上Flash中 这方面我之前在F4上移植过,但是L4和F4的Flash存储划分是不一样的,还是要看看的,包括512K和256K的还不一样,我用的是256K,如下所示。 ![b.png](/uploads/20201223/1c3c74f864838ff4c7677bf4554cc05e.png) ![c.png](/uploads/20201223/390dd4083975bfc1979623b6b19e4bc7.png) ### 2.1. 首先在board文件夹中的Kconfig中增加如下,不然fal管理还要自己实现read、write、erase函数。 ```c config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n ``` 2.2. 在env中开启fal,我这里用的是片上,所以sfud没选择 ![c1.png](/uploads/20201223/192aebbf4c1c1dfea6cf55441a27d46f.png) 2.3. fal管理的存储列表在“fal_cfg.h”中,packages的inc文件夹中没有这个文件,程序检索不到,编译会报错,所以将“samples\porting”中的“fal_cfg”复制过来。 2.4. 添加完成你会打开工程你会看到,你想要的内容都在其中,如下: ![d.png](/uploads/20201223/afc1247b6642d9e2b26c1bf2852f2b70.png) 2.5. 对应的填写fal_cfg.h 中列表如下,这几个名字要与“drv_flash_l4”中一致: ![e.png](/uploads/20201223/952c28c8fb7a9b6727e8162c57486829.png) 2.6. 在main中添加,如下代码段,这个"fal_test"函数我是直接从正点原子开发板复制过来的。 ``` /*init bsp components ---------------------------------------------------*/ fal_init(); if (fal_test("easyflash") == 0) { LOG_I("Fal partition (%s) test success!", "param"); } else { LOG_E("Fal partition (%s) test failed!", "param"); } ``` 2.7. 下载验证 ![f.png](/uploads/20201223/65a6728a5e74c19ca41bc2ec070dca50.png) 3. 添加easyflash 组件,这里要注意一下 ![g.png](/uploads/20201223/a61c62ed6ea51fcb9c7a5eac2c34bc01.png) 3.1. env中开启easyflash组件,这里2048是l4的页大小,我的env存储空间也是2048 ![h.png](/uploads/20201223/17f96452bc3d7bf22f6792dfb916e785.png) 3.2. 对应修改“packages\EasyFlash-v3.0.0\SConscript”,为如下 ![i.png](/uploads/20201223/b8837bb89df7e36eeedbfc75b7e08b47.png) 3.3. 修改“ef_fal_port.c”中文件,并在main中加入如下测试代码 ![j.png](/uploads/20201223/e87a674d82b9641e44569109126024f3.png) ![k.png](/uploads/20201223/2a26a7d78d6772be582856cf92b5fdb5.png) ### 3.4. 下载验证 ![l.png](/uploads/20201223/208a95ffee05a9547dc47ba533c08254.png) 我们看着是成功了,但是问题: **EF_ENV_USING_LEGACY_MODE 我从头到位都没设置呢?** ## 4. ulog_easyflash移植 ### 4.1. env中开启ulog_easyflash组件 ![m.png](/uploads/20201223/7b76dd183ee91e9f03a43accc59177f1.png) ![n.png](/uploads/20201223/084e12c3a0175c755aee87533ba912e8.png) ### 4.2. 下载验证 ![o.png](/uploads/20201223/5c1ba5134cf29c45908ff0d50e843c59.png) ### 4.3. 问题分析 这个时候,ulog的存储在flash上就有问题了,报警的问题是8字节对齐,和写入错误,查看drv_flash_l4.c 中的write发现了,如下: ```c int stm32_flash_write(rt_uint32_t addr, const uint8_t *buf, size_t size) { size_t i, j; rt_err_t result = 0; rt_uint64_t write_data = 0, temp_data = 0; if ((addr + size) > STM32_FLASH_END_ADDRESS) { LOG_E("ERROR: write outrange flash size! addr is (0x%p)\n", (void*)(addr + size)); return -RT_EINVAL; } if(addr % 8 != 0) { LOG_E("write addr must be 8-byte alignment"); return -RT_EINVAL; } HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); if (size < 1) { return -RT_ERROR; } for (i = 0; i < size;) { if ((size - i) < 8) { for (j = 0; (size - i) > 0; i++, j++) { temp_data = *buf; write_data = (write_data) | (temp_data << 8 * j); buf ++; } } else { for (j = 0; j < 8; j++, i++) { temp_data = *buf; write_data = (write_data) | (temp_data << 8 * j); buf ++; } } /* write data */ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, write_data) == HAL_OK) { /* Check the written value */ if (*(uint64_t*)addr != write_data) { LOG_E("ERROR: write data != read data\n"); result = -RT_ERROR; goto __exit; } } else { result = -RT_ERROR; goto __exit; } temp_data = 0; write_data = 0; addr += 8; } __exit: HAL_FLASH_Lock(); if (result != 0) { return result; } return size; } ``` 就是说,写入的时候是8字节对齐,但是作为后端的设备,我不能保证每次写入都是8字节对齐呢。 ## 问题 - 1. EF_ENV_USING_LEGACY_MODE 我从头到位都没设置呢? - 2. ulog_easyflash是不是不能在L4的片上flash使用,还是我思考的有问题呢,有大佬路过麻烦指点一下。
查看更多
6
个回答
默认排序
按发布时间排序
RemyShi
2021-01-26
这家伙很懒,什么也没写!
遇到同样的问题。之前移植EasyFlash时,作者提示过STM32L4系列只能用V3版本。不知道ulog_easyflash有没有在L4系列上经过测试,地址对齐的问题我解决了部分。 在`ulog_easyflash_be.c`中 ``` static void ulog_easyflash_backend_output(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, size_t len) { /* write some '\r' for word alignment */ // 原代码为char write_overage_c[4] = { '\r', '\r', '\r', '\r'}; char write_overage_c[8] = { '\r', '\r', '\r', '\r', '\r', '\r', '\r', '\r'}; size_t write_size_temp = 0; EfErrCode result = EF_NO_ERR; /* saving level filter for flash log */ if (level <= log_saving_lvl) { /* calculate the word alignment write size */ // 源代码为write_size_temp = RT_ALIGN_DOWN(len, 4); write_size_temp = RT_ALIGN_DOWN(len, 8); result = ef_log_write((uint32_t *) log, write_size_temp); /* write last word alignment data */ if ((result == EF_NO_ERR) && (write_size_temp != len)) { memcpy(write_overage_c, log + write_size_temp, len - write_size_temp); ef_log_write((uint32_t *) write_overage_c, sizeof(write_overage_c)); } } } ``` 能存储一部分log,之后亦出现写入错误问题。如果楼主解决问题,麻烦交流下经验。
borrow1988
2021-02-22
这家伙很懒,什么也没写!
L151能用不?
jerry2cool
2021-11-01
这家伙很懒,什么也没写!
看到你们也卡在这个8字节对齐的问题上,我也就释然了。。。
xiakangshun
2021-11-19
这家伙很懒,什么也没写!
我在stm32g0上也遇到了这个问题,g0一次要写入64位数据,后面我也用了EF_ENV_USING_LEGACY_MODE ,但是这个模式貌似只能存储字符串,满足不了需求,也不知道为什么没有实现64位宽度,后面放弃了使用EasyFlash了。
青荇草
2022-09-16
这家伙很懒,什么也没写!
-
zx595
2023-08-22
这家伙很懒,什么也没写!
L4想用easyflash的话可以试下选择V3版本 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230822/122cbcd042cdf4f9f0342b00cbf77633.png.webp)
撰写答案
登录
注册新账号
关注者
1
被浏览
2.1k
关于作者
zhujie
这家伙很懒,什么也没写!
提问
27
回答
13
被采纳
2
关注TA
发私信
相关问题
1
ulog_easyflash部分函数接口未实现问题
2
ulog_easyflash存储log时,出现扇区头错误,如下图,请大佬指点。
3
关于easylogger和easyflash
4
ulog_filter保存不了
5
ulog无法掉电保存过滤等级
6
env配置ulog+easyflash
7
ulog_easyflash 存满后去读取日志,系统重启
8
ulog_easyflash 若在写log的过程中掉电,上电后会擦除所有的log,有掉电保护开关吗?
9
Easylogger 日志扇区标头错误
10
easyflash和ulog存储日志提示分区超出索引
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部