问题标签 [stm32-hal]

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 回答
16545 浏览

stm32 - 如何写入STM32 Flash

我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我用过stm32f4xx_hal_flash.c图书馆。我首先使用以下代码擦除扇区:

程序在到达HAL_FLASHEx_Erase(&pEraseInit,0);函数时挂起。我的分散文件如下所示:

我必须先做些什么才能让这个功能起作用吗?

0 投票
5 回答
2017 浏览

stm32 - STM32F HAL 库太大

我的微控制器项目的闪存用完了。如何减少 HAL 库的大小或以其他方式减少我项目的大部分内容?

0 投票
0 回答
451 浏览

usb - 如何在停止模式下保持 USB 连接

我在 STM32F4 上配置了一个自动启动的 USB CDC 外设。我还启用了 STOP 电源模式,但 USB 设备在进入 STOP 时断开连接,并且在设备唤醒时不会重新连接。我需要做什么才能让设备在唤醒时成功重启?

我可以通过调用 USB_LL_Start / HAL_PCD_Start 函数重新启动 USB 设备,但我想防止它断开连接,我不知道该怎么做。

0 投票
2 回答
1052 浏览

c - STM32 串行 DMA - 查找流的开头

我有一个通过 DMA 捕获的已知串行流格式。它有页眉和页脚字节。但有时 MCU 在流的中间开始捕获,然后同步结束,因为 DMA 正在寻找一组字节数。我读过有人使用循环缓冲区,但我一直在努力掌握这个概念。

相反,我正在考虑禁用 DMA 并在 MCU 启动时启用串行中断。然后循环遍历中断捕获的每个字节以找到起始字节。然后,一旦我找到了起始字节,就禁用串行中断捕获并启用 DMA 来接管流的捕获。

这听起来可行吗?感谢您的任何意见。

我将 STM32 HAL 库与包含 STM32 CubeMX 的新 STM32 IDE 一起使用。

0 投票
1 回答
814 浏览

c - STM32H743 核板,在轮询模式下一次使用 3 个 ADC(一次 1 个 ADC);不工作

我正在研究一个涉及 STM32H743 核板和使用 16 个 ADC 输入的项目。

显然,这些模拟输入一次使用一次;通过轮询机制读取值并配置下一个输入...配置 ADC 通道,启动 ADC,通过轮询读取值并配置下一个输入...每 1 毫秒 16 次,作为实时行为。

我发现的问题是我无法启动 3 个 ADC 中的任何一个,它卡在 stm32h7xx_hal_adc.h 的这条线上(我认为我错误地配置了时钟或其他类型的东西):

这一行在函数中:

这被称为:

提前感谢您的帮助,下面提供了源代码。

源代码文件为:

主程序

hwdrvlib.c(包含配置函数的文件)

FUNCTION FILE(包含要执行的函数的函数,用于读取模拟输入数据)

0 投票
0 回答
252 浏览

stm32 - STM32F4通过UART写内部flash

我想使用 HAL 库在 STM32F4 中编写 OTA 函数。我已经有一个LTE模块下载升级二进制文件并通过UART转发到STM32F4。问题是我知道我可以使用 HAL_UART_Receive_DMA() 将二进制文件接收到 RAM,并且我知道我可以使用 HAL_FLASH_Program() 将数据从 RAM 写入内部闪存。我真的不想以这种方式实现,因为 STM32F4 的 RAM 很小。有什么办法可以直接从UART写入内部闪存?

谢谢

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 投票
1 回答
1954 浏览

stm32 - STM32 ADC DMA 双/多缓冲器示例

根据文档,许多 STM32 支持双缓冲区(或也称为多缓冲区)模式下的 DMA。在 HAL 中,这个特性有两个函数:HAL_DMAEx_MultiBufferStartHAL_DMAEx_MultiBufferStart_ITstm32xxxx_hal_adc_ex文件中。但在任何 SDK(H7、F7、F4 等)中,都没有使用这两个功能的单一示例。如何让这个双缓冲 DMA 与 ADC 一起工作?

0 投票
1 回答
129 浏览

stm32 - HAL_NVIC_SetPendingIRQ 是否调用 ISR 执行?

我对STM32世界真的很陌生,所以我在阅读时遇到了这个:

这将导致中断触发,因为它是由硬件生成的。Cortex-M 处理器的一个显着特点是可以在另一个中断的 ISR 例程中以编程方式触发一个中断。

我从Mastering STM32(Carmine Noviello 第 208 页)一书中得到了这个。由此我了解到,如果我们甚至从主函数设置这个挂起位,那么就会产生中断。所以为了试试这个,我写了这段代码:

连同这个回调函数

我已将 GPIO_PIN_0 编程为中断源,当我按下连接到 PA0 的按钮时,中断工作正常,即执行 ISR。令我惊讶的是, HAL_NVIC_SetPendingIRQ函数不会产生中断。我不明白为什么?

更多信息:

  • 我正在使用 STM32F411VET6 DISCO 板
  • 我正在使用 STM32CubeIDE 对板子进行编程
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