whj467467222
whj467467222 - 认证专家
This guy hasn't written anything yet

注册于 3 years ago

回答
359
文章
26
关注者
17

如果还需要大家手动的去添加文件,那就是 RT-Thread 制作 ENV 工具的失败。

如何实现自动添加工程呢?RT-Thread 有一个 ENV工具,点击就是下载地址。

关于 ENV 工具的使用,可以查看官方的ENV使用说明

这个宏是如何产生的?
RT-Thread 的组件依赖最终都会在 rtconfig.h 产生一个宏,这个宏是 ENV 工具去解析用的配置选项之后自动生成的。

自己制作的 BSP 在 ENV 里面没有配置项怎么办?
那就需要你自己去稍作修改 kconfig ,当然是有官方说明的。另外就是我比较喜欢去已经支持的 BSP 去复制粘贴。已楼主的问题为栗子,就可以去这里抄一下。

如果我的回答帮到你了,请点击采纳。如果还有问题请继续追问。

目前论坛关于 gui_engine 的资料确实不多,我目前也没有过多的研究。我知道一些地方能获取到一些资料,可以参考一下,希望能帮到你。

驱动

网络音乐播放器

ART-Pi-Persimmon

这些资料都是由本论坛 HappyTime 提供

问题原因已经在 github 上分析得出了结论,开启了动态模块都导致结构体发生变化,进而导致数据的错位,最终导致了上面的问题。问题记录地址

楼主列了这么多,可以稍微对比一下:

emWin:

ST 拿到授权的叫 STemwin ,非 ST 产品不能用。 emwin 本身并不是一个免费产品。

TouchGFX:

被 ST 收购,非 ST 产品无法使用。

Qt:

QT For MCU 是商业组件,不掏钱不能用。

LVGL:

开源,具体的开源协议是什么,有没有商业风险,我没看不知道,欢迎大佬补充。

Persimmon:

商业组件,不掏钱不能用。RTT 有模块卖,购买地址,直接买模块,你用 JS 开发就无需考虑资源占用问题了,如果想了解更多,我就不知道了,建议直接问淘宝客服。

先不评级你说的对与不对。先看看 drv_spi.c 当时的设计意图, 当时设计通用的驱动的时候, ST 推出了 HAL 库,在 F 系列上适配的确实非常好,但是随着型号越来越多,有些就不是那么通用了,典型的就是时钟源的问题。

下图是 STM32F4 系列的时钟图:

image.png

从上图可以看出来,外设时钟基本是由 APB1 和 APB2 提供, 这样在写驱动的时候,就比较方便的去动态的计算分频系数。

再看下 H7 的时钟图,太多了,只能截图部分:

image.png

从图中明确的可以看到 SPI4 的时钟源有 6 种提供方式。具体用户使用哪一种这是一个哲学问题了。

然后来总结一下前面的问题:

  • 当时 H7 的 SPI 驱动是我对接的,因为考虑到 H7 SPI 都是多路可选择的(SPI1 2 3 也是多路 上图能看到),我没有办法去确定用户用哪个时钟源,一千个用户就有一千个哈姆雷特。
  • 竟然这个驱动灵活性这么大,还要上传提交了,因为玩 H7 的用户都是高手,这么简单的调节问题应该难不到他们。

最后说结论:

你的理解是错的,请根据你的实际情况来设置不同的时钟源获取函数来进行分频计算。当你的程序中存在多个 SPI 的时候,可以采用一个取巧的方式就是把所有 SPI 的时钟源的频率设置成一样的,聪明如你,应该就知道该怎么办了。

码字不易,帮到你了,请点一下采纳。

检查一下 ART-Pi SDK 的版本,确认一下是 V1.2.1 版本的

问题1 :请你仔细看,是16M 还是 8M,你的图中很明显的写的是 8M
希望你注意看看,逐字母对比查看
image.png

问题2: FTP 是以库的方式提供的。因为不可描述的原因没有提供源码,实际上软件包已经开源,希望不要纠结这个问题。

问题3:系统重启后 bootloader 会从 download 分区读取出来,并写入指定的地址,具体实现请自行查看源码

问题4: H7的 RAM 的一些情况,看下图
image.png

对于一些外设总线就不再贴图了,聪明的你,应该能找到 ST 手册中的描述

问题5:H7 就是这么热,为什么热,你应该去问 ST

问题6: https://art-pi.gitee.io/website/

最后想说一句,一口气解答了你这么多问题,能够多赞赏一些积分给我,这也是我回答问题的动力。

rtt-studio修改lds链接文件

举个栗子,

#elif defined ( __GNUC__ )
uint16_t ADCxValues[3] __attribute__((section(".ADCArraySection")));
#endif

rtt-studio 用的是 GCC 编译器, 所以前面增加 GNUC

下面描述就是将 ADC 的数组指定到某个区域去,这个区域的指定,需要修改链接文件 lds。

/* Program Entry, set to mark it as "used" and avoid gc */
MEMORY
{
ROM (rx) : ORIGIN =0x08000000,LENGTH =2048k
RAM (rw) : ORIGIN =0x24000000,LENGTH =512k
ADCArraySection (rw) : ORIGIN =0x30020000,LENGTH =128k
}

这样还不够,在修改一下

    .ADCArraySection (NOLOAD) : ALIGN(4)
    {
    . = ALIGN(4);
    *(.ADCArraySection)
    *(.ADCArraySection.*)
    . = ALIGN(4);
    __ADCArraySection_free__ = .;
    } > ADCArraySection

这样就可以了,楼主赶紧去试试吧。

另外也可以参考一下 ART-Pi 以太网描述符的方法。

驱动

链接文件

详细的原因请查看此链接

如果回答帮到你了,请采纳我的答案。

可以一步一步的来分析:

libmodbus 会去 open 一个 uart5 的设备,你可以在命令行去输入命令 list_device 去查看 uart5 是否已经成功的注册到了设备。

另外也可以关心一下 libmodbusopen 时候的返回值。

欢迎继续追问。

问题的原因在与:

ulog_formater 里面是没有对 传递进来的数据进行补 \0
开启了 RT_USING_DEVICE 之后使用的是

rt_device_write(dev, 0, log, len); 

这个会发送指定的长度, 未开启的情况下使用的是 rt_hw_console_output(log); 这个里面使用了 strlen 来判断字符串的长度,
因为前面没有 \0,所以他每次都会查找到 log_buf_th[ULOG_LINE_BUF_SIZE + 1] 历史最长的字符串的 \0

解决办法:

需要在

RT_WEAK rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *tag, rt_bool_t newline,const char *format, va_list args)

这个函数 return 的上一句增加 log_buf[log_len] = '\0'; 即可。

全志 T3 是多核的 ,这里的多核移植正好是基于这个芯片的 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/smp/smp

T3 的 BSP 应该是商业版的,可以看这里的说明 https://www.rt-thread.com/products/T3-46.html

这个没有开源出去,需要的话请联系商务,或者自己来移植一份,可以参考

发布
问题