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

注册于 3 years ago

回答
359
文章
26
关注者
17

先不评级你说的对与不对。先看看 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 的时钟源的频率设置成一样的,聪明如你,应该就知道该怎么办了。

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

问题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 以太网描述符的方法。

驱动

链接文件

问题的原因在与:

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'; 即可。

如果我的回答解答了你的疑惑,请帮忙点个采纳,你的采纳是我继续回答的动力。

修改路径:art_pi_factory/packages/btstack-v0.0.1/rtt_adapter/rtt_btstack_gatt_blufi.c

const uint8_t adv_data[] = {
    // Flags general discoverable, BR/EDR not supported
    0x02, BLUETOOTH_DATA_TYPE_FLAGS, 0x05,
    // Name
    0x0b, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'A', 'R', 'T', '-', 'P', 'i', ' ', ' ', ' ', ' ',
    // Incomplete List of 16-bit Service Class UUIDs -- FF10 - only valid for testing!
};

如果我的回答解答了你的疑惑,请帮忙点个采纳,你的采纳是我继续回答的动力。

建议楼主参考 ART-Pi 的工程,ART-Pi 的示例工程都是放在 QSPI FLASH W25Q64 。

第一步,修改链接文件的地址,如下图所示:

image.png

第二步,重新 rebuild 工程,或者 clean 之后在编译一次,编译器检查文件没有修改过,所以不会重新链接。

第三步,检查 DEBUG 目录下的 map 文件或者 解析 elf 文件,就能看到程序的地址已经不是 0x0800 0000 的地址段了

第四步,准备一个 从 0x0800 0000 到 0x9000 0000 的 bootloader 工程,注意开启 QSPI FLASH 的内存映射模式,这个可以参考 ART-Pi 的实现

第五步,准备一个合适的下载算法,目前 RTT Studio 集成的 JLINK 和 STLINK 所需的下载算法不一样,如何制作下载算法可以百度一下,或者去 ART-Pi 的 QQ 技术交流群下载

第六步,根据你使用的仿真器不同在追问把,或者重新发贴,请教专家 @rcp

注意 Q64 的后面的标号,ART-Pi 用的是 JV, 如果你的是 FV 的话,
驱动部分要稍作修改

昨天提交的已经都同意了,没有固定的答案,说出你对 ART-Pi 的理解与期待就行。入群都是人工审核,避免有广告商进群,影响大家的交流体验。

可以麻烦您在申请一次吗?

total memory: 通过你链接文件计算得出的最大可使用的内存总量
used memory : 当前已经使用的内存
maximum allocated memory: 你在申请内存的历史上,单次最多申请的一次,就算你申请了之后立马释放,这个数据也会一直被记录。

很抱歉给您带来麻烦了,请您替换一下 RTT Studio 安装目录下的 ART-Pi SDK 的一个 yaml 文件

我的路径是 C:\RT-ThreadStudio\repo\Extract\Board_Support_Packages\RealThread\STM32H750-RT-ART-Pi\1.2.0

RealThread_STMH750-ART-Pi.yaml

STM32F730 STM32H750 这类的 MCU 片上的 ROM 资源极少,这类 MCU 的价格也相对低一些。这类 MCU 的一般都会外挂 QSPI FLASH 来存储更多的代码。 例如 RT-Thread 推出的开发板选用的 MCU 是 STM32H750 , ROM 只有 128K,但是外挂了一颗 8MB 的 QSPI FLASH。

以下回答 PLC 均表示西门子 PLC,后续不在做说明,这里只是举例。

PLC 本身的 CPU 模块是带有通讯接口的,这些接口都是厂家自己的协议,例如:profibus,profinet,这些协议几乎很难找到开源免费的,一般的做法是买一些网关模块来进行协议转换。有些使用组态屏与PLC 进行通讯也会选择支持 PLC 厂家通讯协议的屏。

RT-Thread 的软件包有提供 MODBUS 的软件包,这个通讯协议在工控领域非常常见,而且很多的 PLC 也支持该协议。

如果楼主表达的意思是想移植 RT-Thread 到 PLC 上,这个目前我还没有看到过相关 CPU 的信息,所以移植的话也不知道如何下手,如果能知道具体的架构,应该是能移植过来的。

另外 RT-Thread 有一个软件包可以支持 codesys 的软 PLC ,如果有兴趣的话,楼主可以去试一试。

很抱歉,这口锅我来背,这个确实会创建失败。

原因是在 sdk-bsp-stm32h750-realthread-artpi\projects\lrs007_lorawan_end_device\packages\ 的目录下有一个 littleled 的软件包缺失导致的,实际上工程中也并没有使用到该软件包。

链接:https://pan.baidu.com/s/14IBXIJKMRRXAsdnhjdIIlw
提取码:8xr3
复制这段内容后打开百度网盘手机App,操作更方便哦

你下载上面的包了之后,在 RTT Studio 中导入新工程测试吧,这个错误我会尽快修复

导入方法:

  1. 点击左上角的 新建
  2. 选择 导入
  3. 选择上面工程的路径

猜测你用的是正点原子的 H743 板子,这个已经有做好的,你想自己移植一下的话,可以拿这个去参考一下。

https://gitee.com/rtthread/rt-thread/tree/gitee_master/bsp/stm32/stm32h743-atk-apollo

如果你用 RTT Studio 可以直接生成,不需要你自己去移植。

发布
问题