硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12434|回复: 35
收起左侧

[NUCLEO-H743ZI] 【STM32H743实验例程】实验11:程序在ITCM执行,中断向量表和所有变量全部放在DTCM,方法很简单--原创

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-4-14 17:31:32 | 显示全部楼层 |阅读模式
实验介绍
开发平台:官方STM32H743 NUCLEO板子
开发环境:MDK5.25正式版
软件版本:
(1)CMSIS软件包 V5.3.0
(2)H7的HAL库版本 V1.2.0
例程下载: 实验11:程序运行在ITCM,中断向量表和所有变量使用DTCM.7z (1.08 MB, 下载次数: 1076)


    昨天有网友问了这个问题,今天就花了点时间研究了下,现在将其分享出来。实现方法比较简单,基于MDK的Option选项设置下即可,无需操作分散加载。使用分散加载的好处是灵活,在设置复杂工程的内存映射方面比较方便。

    实现这个功能的关键是要把所有程序都下载到Flash,系统上电后让MDK中的库函数去将所需的程序加载到RAM里面,用户不要自己去加载,太麻烦。如果用户自己去加载就得搞个bootloader加载应用程序到ITCM。这里所说的库函数是MDK里面的__main封装起来了。

知识点普及:
    TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于指令,DTCM用于数据,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。很多时候我们希望将需要实时性的程序和变量分别放在ITCM和DTCM里面执行。本帖就是解决这个问题。

1、添加ITCM空间


2、设置DTCM空间,前0x400大小的空间用于中断向量表,所以这里从0x20000400开始


3、右击所有MDK分组,选择使用ITCM,而进入main函数之前的所有代码,含main函数所在的文件main.c切不要设置,这个之前的代码我们都需要在flash里面执行。这些代码仅执行一次以后不会执行,所以不用管他们,之后的所有代码全部放在ITCM里面。


特别注意,直接右击分组选择设置



4、前面三步设置完毕后,将中断向量表从flash中复制到DTCM,主要存储的DTCM地址要0x200对齐。




通过上面四步就完成了此功能,是不是超级简单。









回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-4-14 17:32:43 | 显示全部楼层
QQ截图20180414172705.png
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
发表于 2018-4-15 02:26:07 | 显示全部楼层
谢谢硬汉大哥!最近1050正在想这个问题,我去尝试下!
硬汉大哥,咱们这h7有没有开始呢?
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
发表于 2018-4-15 02:30:42 | 显示全部楼层
硬汉大哥,提个问题!如果代码小的话,其实没必要加载到itcm里了吧!行为cache就够用了吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-4-15 02:56:34 | 显示全部楼层
qiousanxi 发表于 2018-4-15 02:30
硬汉大哥,提个问题!如果代码小的话,其实没必要加载到itcm里了吧!行为cache就够用了吧?

Cache有个命中率的问题,安全关键,时间关键的程序,直接搞到TCM
回复

使用道具 举报

4

主题

531

回帖

543

积分

金牌会员

积分
543
发表于 2018-4-15 08:49:26 | 显示全部楼层
eric2013 发表于 2018-4-15 02:56
Cache有个命中率的问题,安全关键,时间关键的程序,直接搞到TCM

嗯,例如jpeg解码,可以放到itcm。整体的效率也应该会提高,我回来试试!我用的f7的硬解码,刷照片800*480的能到11帧!我看了主要在解码和刷屏上!我用的mcu的屏刷一贞32ms,解码也30多ms。
从解码到显示完成83ms左右
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-4-16 19:01:47 | 显示全部楼层
666,几天没来,这么多东西了
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

27

主题

91

回帖

172

积分

初级会员

积分
172
发表于 2018-6-11 15:58:01 | 显示全部楼层
好文章啊
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2018-6-11 22:52:27 | 显示全部楼层
本帖最后由 roguebear 于 2018-6-11 22:59 编辑

好东西。看了半天也看不懂。。。。我实在想不出我需要把哪个弄里面。。。干脆把一个简单的求平均滤波放里面。。。
硬汉你的H7核心板一定要加QSPI的flash。一个扇区4K,擦写10w次。 校准数据之类分扇区存放,太方便了。塞不下的话放背面。。。
W25Q256....代码都现成验证过的。。不过程序风格稀烂。。需要统一一下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-6-12 00:51:49 | 显示全部楼层
roguebear 发表于 2018-6-11 22:52
好东西。看了半天也看不懂。。。。我实在想不出我需要把哪个弄里面。。。干脆把一个简单的求平均滤波放里面 ...

回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-9-20 11:32:25 | 显示全部楼层
硬汉大哥,这样设置的话,程序中的那些全局变量是在哪里执行?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-9-20 12:08:43 | 显示全部楼层
易水萧风 发表于 2018-9-20 11:32
硬汉大哥,这样设置的话,程序中的那些全局变量是在哪里执行?

这个程序里面是用的DTCM。
回复

使用道具 举报

11

主题

91

回帖

124

积分

初级会员

积分
124
发表于 2018-10-5 13:39:41 | 显示全部楼层
eric2013 发表于 2018-9-20 12:08
这个程序里面是用的DTCM。

刚刚用F407试了一下,冒似不行,那个库函数的加载程序指令在哪里看的?
33.png

444.png

不知道是哪里出问题了?

回复

使用道具 举报

11

主题

91

回帖

124

积分

初级会员

积分
124
发表于 2018-10-7 17:35:51 | 显示全部楼层
是不是f407的CCM不能这样使用的?
回复

使用道具 举报

11

主题

91

回帖

124

积分

初级会员

积分
124
发表于 2018-10-11 07:42:24 | 显示全部楼层
你这个中断向量表好像不是放在DTCM了,而是放在D1_AXISRAM_BASE区,
回复

使用道具 举报

2

主题

69

回帖

75

积分

初级会员

积分
75
发表于 2018-10-13 14:59:51 | 显示全部楼层
支持一下.                  
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-11-5 22:43:16 | 显示全部楼层
硬汉大哥,如果我用h750外部qspi来存储程序(程序超过128k),但是希望在内部ram中运行程序,也可以采用你这种方式吧,不需要手动的拷贝到内部的sram中吧。还有h7不支持从外部qspi flash启动吧,那我是不是还得内部flash中有程序从内部flash启动,然后运行到外部qspi,内部flash当作boot程序,外部aspi flash当作APP程序,这样理解对吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-11-6 01:29:09 | 显示全部楼层
伪装者 发表于 2018-11-5 22:43
硬汉大哥,如果我用h750外部qspi来存储程序(程序超过128k),但是希望在内部ram中运行程序,也可以采用你 ...

没问题的。
回复

使用道具 举报

0

主题

68

回帖

68

积分

初级会员

积分
68
发表于 2019-5-29 14:28:44 | 显示全部楼层
原来你早就实现了呀
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2019-5-30 12:13:43 | 显示全部楼层
这个应该算是程序运行最快的配置了。如果这时再开cache是不是会更快一点呢?
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2019-5-30 12:15:01 | 显示全部楼层
实际应用的话,还是得用sct文件来配置
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-5-30 14:07:18 | 显示全部楼层
jplzl10000 发表于 2019-5-30 12:13
这个应该算是程序运行最快的配置了。如果这时再开cache是不是会更快一点呢?

用不到Cache了,已经是最高性能。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-5-30 14:08:09 | 显示全部楼层
jplzl10000 发表于 2019-5-30 12:15
实际应用的话,还是得用sct文件来配置

不用,这种方式就行,简单省事,因为本质也是SCT,只是配置更方便。
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2019-5-30 16:28:39 | 显示全部楼层
eric2013 发表于 2019-5-30 14:07
用不到Cache了,已经是最高性能。

所以我就有一点没太明白,
I-CACHE/D-CACHE是指M7内核内的吧,但这个ITCM/DTCM是在内核里面还是内核外面呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-1 16:17:13 | 显示全部楼层
jplzl10000 发表于 2019-5-30 16:28
所以我就有一点没太明白,
I-CACHE/D-CACHE是指M7内核内的吧,但这个ITCM/DTCM是在内核里面还是内核外面 ...

TCM区域也是Cortex-M内核定义的。
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2019-6-3 09:18:19 | 显示全部楼层
本帖最后由 jplzl10000 于 2019-6-3 09:19 编辑
eric2013 发表于 2019-6-1 16:17
TCM区域也是Cortex-M内核定义的。

这意思就是说,M7内核内并无RAM,M7内核使用的CACHE地址也只是在TCM区域内进行分配?
这样倒好像也是这样的哦,M7内核应该就是运算单元,除了寄存外,应并无实际的存储单元
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-3 09:24:33 | 显示全部楼层
jplzl10000 发表于 2019-6-3 09:18
这意思就是说,M7内核内并无RAM,M7内核使用的CACHE地址也只是在TCM区域内进行分配?
这样倒好像也是这 ...

可以这么理解。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-10-30 10:43:00 | 显示全部楼层
正在测试这个程序,其他功能正常,为什么DMA不能正常工作呢?哪里有问题吗
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-10-30 10:43:56 | 显示全部楼层
正在测试这个程序,其他功能都正常,为什么不能正常使用DMA呢?哪里有坑啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-30 10:53:12 | 显示全部楼层
pray 发表于 2019-10-30 10:43
正在测试这个程序,其他功能都正常,为什么不能正常使用DMA呢?哪里有坑啊

DMA的使用注意事项很多,通用DMA是不能访问DTCM和ITCM空间的。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2021-4-30 10:21:28 | 显示全部楼层
中断向量表为什么要放在DTCM中,不能直接放在ITCM中吗?
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
发表于 2021-12-29 13:44:26 | 显示全部楼层
我在第四步, 使用memcpy复制向量表出问题了, 我改用for循环每次以
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
发表于 2021-12-29 13:48:03 | 显示全部楼层
我在第四步里出问题了, 使用memcpy来拷贝向量表, 拷贝一半多就莫名卡死了.

    uint32_t  *pSrc = (uint32_t*)NORFLASH_APP_IVT_ADDR_START;
    uint32_t  *pDst = (uint32_t*)DTCM_IVT_ADDR_START;
   
    for (uint32_t  i = 0; i < (SYS_IVT_SIZE / sizeof(uint32_t)); i ++)
    {
        *pDst++ = *pSrc++;
    }

我改用这样拷贝就正常运行了.

memcpy里面是字节为单位进行拷贝, 我这里是以字为单位拷贝, 除此之外我想不出什么区别了.
请问大家使用中有遇到问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-12-29 16:31:46 | 显示全部楼层
hjhj7591418 发表于 2021-12-29 13:48
我在第四步里出问题了, 使用memcpy来拷贝向量表, 拷贝一半多就莫名卡死了.

    uint32_t  *pSrc = (uint ...

memcpy不是简单的字节复制,代码里面有优化。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-5-1 02:41:40 | 显示全部楼层
请问版主,有没有IAR的例程,用F7不正常
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-5-1 15:52:41 | 显示全部楼层
liuquan3000 发表于 2023-5-1 02:41
请问版主,有没有IAR的例程,用F7不正常

有,此贴是正式版

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至95章(2022-04-11)
https://www.armbbs.cn/forum.php? ... 6980&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 05:10 , Processed in 0.304374 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表