问题标签 [stm32h7]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
924 浏览

stm32 - 为什么即使禁用时钟,D2 RAM 也能正常工作?

TL;DR:文档指出,我必须先在微控制器中启用特定的内存区域,然后才能使用它。但是,我可以在启用它之前使用它,甚至在禁用它之后使用它。这怎么可能?


我目前正在为 STM32H743 微控制器开发一个应用程序。我不明白在时钟被禁用时 RAM 是如何正常工作的。

该 MCU 具有多个存储器,分布在多个电源域中:

  • 在 D1 域中,它具有 ITCMRAM + DTCMRAM + AXI SRAM (64 + 128 + 512 kB)
  • 在 D2 域中,它具有 SRAM1 + SRAM2 + SRAM3 (128 + 128 + 32 kB)
  • 在 D3 域中,它具有 SRAM4 + 备份 SRAM (64 + 4 kB)

我想使用SRAM1。在参考手册(RM0433 Rev. 7)中,第 366 页指出:

如果 CPU 想要使用位于 D2 域中的存储器(SRAM1、SRAM2 和 SRAM3),则必须启用它们。

在第 452 页的寄存器设置中描述了如何执行此操作:

RCC AHB2 时钟寄存器 (RCC_AHB2ENR):

SRAM1EN: SRAM1 模块使能
由软件置位和复位。置位时,该位表示 SRAM1 由 CPU 分配。它使 D2 域也考虑 CPU 操作模式,即当 CPU 处于 CRun 时,将 D2 域保持在 DRun。
0:SRAM1 接口时钟被禁用。(复位后默认)
1:SRAM1 接口时钟使能。

因此,默认值(复位后)为 0,表示 SRAM1 接口被禁用。

在STM 社区论坛上的这个帖子中,问题是为什么 D2 RAM 不能正常工作,解决方案是启用 D2 RAM 时钟。执行此操作的“正确”方法是SystemInit()(STM32H7 HAL 的一部分)。在 system_stm32h7xx.c 我们可以找到以下代码部分:

DATA_IN_D2_SRAM因此,要使用 D2 SRAM,应该定义宏(或者您必须使用 手动启用时钟__HAL_RCC_D2SRAM1_CLK_ENABLE())。

但是,我没有定义这个宏,即使我手动禁用时钟,RAM 似乎工作得很好。

我的主要任务(我正在运行 FreeRTOS,这是目前唯一的任务)是这样的:

内存测试用已知数据完全填充 D2 SRAM,然后对其计算 CRC。CRC 是正确的。我已经验证过缓冲区确实放在了 D2 SRAM 中(内存地址 0x30000400 在 SRAM1 的 0x30000000-0x3001FFFF 范围内)。的值RCC->AHB2ENR被确认为 0(禁用所有时钟)。我还确认了地址RCC->AHB2ENR是 0x580244DC,如数据表中所述。

数据缓存被禁用。

我在这里想念什么?为什么时钟被禁用时这个内存是可读写的?


更新:根据要求,这是我的内存测试代码,从中我得出的结论是内存可以成功写入和读取:

0 投票
0 回答
171 浏览

stm32 - LED 闪烁“太快”@ NUCLEO-H755ZI-Q

你好!

根据STM32H755ZI的手册RM0399 §9.5.6(第 377 页),复位后默认时钟应为 64 MHz(HSI)。由于相同的代码在其他设备上运行良好,例如 NUCLEO-F303K8,我预计(红色)LED 以 1 Hz 的频率闪烁。但是,事实并非如此。我还尝试使用预分频器值TIM2->PSC(似乎 ISR 是由其他东西触发的,但是如果我只是禁用TIM2.

如果我改用 TIM6,频率约为 2 Hz,现在修改预分频器值确实很重要。即,如果我假设 128 MHz 而不是 64 MHz,我会得到 1 Hz LED Blinker:

0 投票
1 回答
142 浏览

stm32 - STM32H7 和定时器触发的 DFSDM 转换 - 如何?

在过去的两个晚上,我一直在尝试在 STM32H7A3 MPU 上设置定时器触发的 DFSDM 转换,但没有成功。谷歌搜索我没有一个完整的例子,也许是因为 DFSDM 是更高级的主题。
目标:每 1 秒用 N 个样本填充过滤器缓冲区。
我附上了 CubeMX 设置的屏幕截图。转换在连续模式下按预期工作,因此通道和时钟设置正确。
在代码中,在启动 1s 计时器 ( HAL_TIM_Base_Start()) 之前,我调用HAL_DFSDM_FilterInjectedMsbStart_DMA().
既没有DFSDM1_FLT2_IRQHandler()也没有DMA1_Stream2_IRQHandler()被解雇。
我错过了什么?

过滤器设置

DMA 设置

定时器 7 设置

0 投票
0 回答
82 浏览

stm32 - STM32H7和DFSDM单机运行——如何?

我有带有 DFSDM 接口(我相信)的 STM32H7A3 MPU 正确配置为使用 DMA。
我想在软件触发的请求(例如按下按钮)上获得 N 个连续样本 - 就像示波器“单次运行”一样。
我打电话HAL_DFSDM_FilterRegularMsbStart_DMA(),它工作得很好,但是当我在它完成并HAL_DFSDM_FilterRegConvCpltCallback()执行后再次调用它时,缓冲区包含完全相同的数据。似乎需要重置一些缓冲区指针(?)。
HAL_DFSDM_FilterRegConvCpltCallback()我设置内hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_READY;- 否则会发生 HAL 错误,因为未重置过滤器状态。
启用连续模式,触发器是软件,启用 DMA,DMA 使用正常模式 - 因为我不希望它连续运行。

有没有人尝试过这样的 DFSDM 设置?请指教。
STM32Cube FW_H7 V1.9.0

0 投票
1 回答
273 浏览

ram - STM32H723 - 内存映射模式下的串行 RAM 问题

我正在使用 nucleo – H723ZG 开发板测试 32Mb 串行 QUAD SPI RAM (ISSI – ISS66WVS4M8)。如果我使用所有 QUAD SPI 命令,它工作正常,但我需要在内存映射模式下使用它。当我使用内存映射模式配置时,我注意到写入阶段存在问题。我正在做的测试包括写入内存的一个扇区,然后读取它,检查两个操作是否正常。因此,在设置了内存映射配置后,我尝试在内存中写入 for cycle 128 值。奇怪的是:如果我尝试写入的这 128 个值是“uint64_t”类型,则写入操作可以正常工作。但是如果我使用“uint8_t”或uint32_t”类型,写操作不起作用,并且在内存中读取的一些值不正确。我还注意到使用 64 位变量,

你有什么建议吗?我把代码放在这里

此致,

马蒂亚

0 投票
0 回答
109 浏览

stm32 - STM32H7 HAL_UART_Init 永远阻塞并且失败

我已经开始了一个新项目,使用的是我昨天下载的 STM32CubeIDE,并且检查更新说我是最新的。漂亮而简单的 LED 闪光灯和 UART 上的 Hello world。使用 STM32H753II。

我正在使用 USART2,设置为异步。我尝试过使用和不使用 DMA。禁止我的闪烁代码,一切都是由 CubeIDE 自动生成的。

在所有情况下,程序都会在 MX_USART2_UART_Init() 内部的 HAL_UART_Init(&huart2) 调用中陷入无限循环。

深入挖掘,我发现它卡在 HAL_UART_Init(&huart2) 中的位置是:

里面是它的调用:

TEACK 标志似乎永远不会被重置。令人困惑的是,注释说的是 SET,但函数调用说的是 RESET。我不确定这是否是问题所在。

如果有人能指出我的设置出错的方向,我将不胜感激。我以为建立一个新项目来做一个“hello world”会很简单!

笔记; 我熟悉 STM32,但正在考虑将我的项目从 TrueStudio 转移过来。

链接到我已将项目作为附件上传的 STM32 论坛上的问题。

编辑; 我现在也尝试了 UART4 和 UART8,同样的问题仍然存在。与 IDE 中的 UART_printf 示例项目类似。

0 投票
1 回答
468 浏览

arm - 更改链接描述文件以将数据存储到 DTCM RAM 后的 STM32H7 问题

我正在使用 STM32H755ZI MCU。这个MCU有1MB RAM,其中512KB可以被M7 Core直接访问。我必须存储 45000 个浮点样本,其大小约为 180KB。

我的第一个问题是,在存储了大约 12000 个样本后,我的程序崩溃了......当我只存储 30000 个样本时,程序正常工作......

1-第一个问题:可能是什么原因?

我决定将两个数组存储在 RAM 中,并将第三个数组存储在 DTCMRAM 中。每个阵列的大小约为 60KB,DTCM RAM 的大小为 128KB。我应该更改 linker_script 文件。

这就是我定义数组的方式:

作为局部变量进入主函数:float Data_Set_X[12000]={0}; 浮动 Data_Set_Y[12000]={0};

作为全局变量: attribute ((section(".dtcmram"))) float Data_Set_Z[12000];

这是我使用的内存映射文件 MCU: 在此处输入图像描述

这是默认的链接器脚本:

我检查了从 0x20000000 开始的 DTCMRAM 的地址。现在,在这些更改之后,程序的性能变得更糟,在将 3640 个样本存储到 RAM 后,程序停止工作....它崩溃了....对我来说似乎很奇怪的另一件事是构建分析器显示了128KB ....也许如果我找到增加它的方法,那可以在不使用DTCM RAM的情况下解决我的问题...有人知道这个问题吗? 在此处输入图像描述

为了使用 DTCM RAM,我应该如何更改链接描述文件?有没有其他方法可以解决上述存储 450000 个样本的问题?

对于上述问题,我将不胜感激并提供帮助或反馈。先感谢您。

0 投票
2 回答
43 浏览

stm32 - STM32H743VI在不可闪状态下随机跳

我们在带有 JLink 调试器的定制板上使用 STM32H743VIT6。处理器突然跳到无法再刷新ECU的状态。开发板正在运行,但 JMem 和我们的 IDE(uVision)都无法访问或检测控制器。到目前为止,还有其他人遇到过这种行为吗?谷歌也没有帮助。

0 投票
1 回答
1981 浏览

debugging - STM32CubeProgrammer 上的 ST-LINK 错误:尝试连接时出现问题

在 STM32CubeProgrammer 试图连接到 STM32H7B3LI 上的 ST-Link 模块时,我得到了这个:

我已经尝试在此处安装固件,但没有帮助:https ://www.st.com/en/development-tools/stsw-link007.html

更新:我跳过了固件安装过程中的一个必要步骤。但是,我想连接,因为由于软件弄乱了电源设置,电路板一直拒绝通过其他方式连接,所以还有另一个错误:

选择软件复位时:

0 投票
0 回答
71 浏览

struct - 将任意大小的结构写入 STM32H7

我正在尝试将任何大小的结构写入 STM32H7 的闪存。它只写了 4 个字节的倍数。未写入剩余字节 (1, 2, 3)。我使用临时变量来存储剩余字节。在调试中,temp 的值是正确的,但它没有存储在闪存中。有什么建议如何将剩余字节写入闪存:)?