Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32L4
ulog_easyflash
L475移植,包括fal+easyflash+ulog_easyflash
发布于 2020-12-23 15:51:35 浏览:2237
订阅该版
[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. 下载观察现象  ## 2. 添加Fal组件管理片上Flash中 这方面我之前在F4上移植过,但是L4和F4的Flash存储划分是不一样的,还是要看看的,包括512K和256K的还不一样,我用的是256K,如下所示。   ### 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没选择  2.3. fal管理的存储列表在“fal_cfg.h”中,packages的inc文件夹中没有这个文件,程序检索不到,编译会报错,所以将“samples\porting”中的“fal_cfg”复制过来。 2.4. 添加完成你会打开工程你会看到,你想要的内容都在其中,如下:  2.5. 对应的填写fal_cfg.h 中列表如下,这几个名字要与“drv_flash_l4”中一致:  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. 下载验证  3. 添加easyflash 组件,这里要注意一下  3.1. env中开启easyflash组件,这里2048是l4的页大小,我的env存储空间也是2048  3.2. 对应修改“packages\EasyFlash-v3.0.0\SConscript”,为如下  3.3. 修改“ef_fal_port.c”中文件,并在main中加入如下测试代码   ### 3.4. 下载验证  我们看着是成功了,但是问题: **EF_ENV_USING_LEGACY_MODE 我从头到位都没设置呢?** ## 4. ulog_easyflash移植 ### 4.1. env中开启ulog_easyflash组件   ### 4.2. 下载验证  ### 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版本 
撰写答案
登录
注册新账号
关注者
1
被浏览
2.2k
关于作者
zhujie
这家伙很懒,什么也没写!
提问
28
回答
14
被采纳
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
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
YZRD
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部