打印
[STM32F3]

预取缓冲区和缓存系统

[复制链接]
382|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
初级工程渣|  楼主 | 2024-9-30 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 STM32 的嵌入式系统中,Flash 写入速度对于某些高性能应用来说至关重要。Flash 存储的写入过程本身较慢,特别是在频繁写入大数据时,如果不加以优化,可能会成为系统性能的瓶颈。以下是一些可以用来优化 STM32 Flash 写入速度的技巧

使用特权

评论回复
沙发
初级工程渣|  楼主 | 2024-9-30 18:08 | 只看该作者
使用预取缓冲区 (Prefetch Buffer) 和指令缓存 (Instruction Cache)
STM32 系列 MCU 一般带有预取缓冲区和缓存系统,这有助于提高系统在执行代码时的速度,特别是在从 Flash 读取代码执行的场合。虽然这并不会直接加速 Flash 的写入过程,但它可以减少 CPU 等待时间,在 Flash 写操作期间使程序执行更高效。

使用特权

评论回复
板凳
初级工程渣|  楼主 | 2024-9-30 18:08 | 只看该作者
启用预取缓冲区
STM32 中的预取缓冲区允许 CPU 在读取 Flash 时提前获取指令,从而减少指令执行中的等待时间。可以通过设置控制寄存器启用该功能:

c

使用特权

评论回复
地板
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
// 启用预取缓冲区和指令缓存
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
__HAL_FLASH_DATA_CACHE_ENABLE();

使用特权

评论回复
5
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
这些功能在应用程序运行时可能带来一定的加速效果,尤其是在 Flash 写操作导致 CPU 被阻塞时,缓存系统能帮助其他操作更快进行。

使用特权

评论回复
6
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
分页写入 (Page Write)
STM32 的 Flash 写入操作需要对整个页进行擦除,然后再写入数据。为了优化速度,可以通过减少擦除次数和写入的次数来提升效率:

减少擦除操作:由于 Flash 的擦除操作是最耗时的,所以应尽量减少擦除次数。可以通过在 Flash 页上分散多次写入,或者在擦除之前检查是否真的需要擦除来减少频率。
批量写入:尽量一次性写入尽可能多的数据,而不是逐字节写入,这样可以减少调用 HAL Flash 写入 API 的次数,从而降低函数调用带来的开销。

使用特权

评论回复
7
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
示例:批量写入
c

void Flash_Write_Buffer(uint32_t startAddress, uint32_t* data, uint32_t length)
{
    HAL_FLASH_Unlock();

    for (uint32_t i = 0; i < length; i++)
    {
        // 每次写入一个 32 位字
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, startAddress + i * 4, data[i]);
    }

    HAL_FLASH_Lock();
}

使用特权

评论回复
8
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
通过这种方式,可以减少单次写入的时间,批量操作通常比一次写入单个字节快得多。

使用特权

评论回复
9
初级工程渣|  楼主 | 2024-9-30 18:09 | 只看该作者
使用ART加速器 (Adaptive Real-Time Accelerator)
STM32F7、H7 等系列具有一个称为 ART 加速器的模块,它可以加速从 Flash 中读取数据的过程。虽然它主要用于代码执行的加速,但它在 Flash 写入时也能间接提升系统效率,降低由于 Flash 写入延迟而带来的总体性能影响。

在 STM32F7/H7 中,ART 加速器的配置通常在系统初始化时通过 HAL 库完成,无需用户手动操作。它通过在读取时使用零等待状态加速系统的响应。

使用特权

评论回复
10
初级工程渣|  楼主 | 2024-9-30 18:10 | 只看该作者
使用双缓冲 (Double Buffering)
当你需要在嵌入式系统中同时进行 Flash 写入和其他实时任务时,可以使用双缓冲技术来减少 Flash 写入带来的阻塞时间。即在执行写入操作时,另一个缓冲区继续处理其他数据,从而避免 CPU 的等待。

在写入过程中,Flash 存储操作通常会暂停系统执行,因此为了最大程度减少对 CPU 的阻塞,最好能够让 CPU 在执行其他任务时,Flash 写入在后台进行。虽然 STM32 没有直接的硬件双缓冲机制用于 Flash,但通过软件层面实现可以有效地模拟这种行为。

使用特权

评论回复
11
初级工程渣|  楼主 | 2024-9-30 18:10 | 只看该作者
使用DMA加速 (DMA for Memory Copy)
DMA (Direct Memory Access) 是在嵌入式系统中常用的加速器,用于将数据从一个存储位置转移到另一个存储位置。STM32 不支持直接用 DMA 写入 Flash,但 DMA 可以加速在 RAM 和 Flash 之间的数据准备过程。

使用特权

评论回复
12
初级工程渣|  楼主 | 2024-9-30 18:10 | 只看该作者
禁用中断 (Disable Interrupts) 优化时间敏感的写操作
在执行 Flash 写入操作时,特别是在高频率中断的情况下,CPU 可能被频繁中断,导致 Flash 写入操作效率下降。

使用特权

评论回复
13
初级工程渣|  楼主 | 2024-9-30 18:10 | 只看该作者
你可以在写入过程中临时禁用中断,减少由于中断带来的写入延迟:

c

__disable_irq();  // 禁用中断

// 执行 Flash 写入操作
Flash_Write_Buffer(startAddress, dataBuffer, dataLength);

__enable_irq();   // 恢复中断


禁用中断时要小心,只应在时间敏感的操作中临时禁用中断,以免影响其他任务的执行。

使用特权

评论回复
14
初级工程渣|  楼主 | 2024-9-30 18:10 | 只看该作者
优化 Flash 页的选择和分布
在 STM32 的应用中,将经常写入的数据尽量放在 Flash 的不同扇区中,以便每次擦除操作不会影响到大量的数据。通过对 Flash 页的合理划分和数据分布,可以减少写操作带来的擦除频率。

使用特权

评论回复
15
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
使用外部高速 Flash 存储 (External Flash)
如果应用程序对 Flash 写入速度有更高的要求,可以考虑使用外部高速 Flash 存储。外部 SPI 或 Quad-SPI (QSPI) Flash 通常具有比内部 Flash 更快的写入速度和更高的存储容量。STM32 的 HAL 库支持 QSPI Flash 的配置,这为大规模存储和高频写入提供了更多可能性。

使用特权

评论回复
16
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
利用 Flash 写入结束标志 (Flash Write Completion Flag)
当执行 Flash 写入时,STM32 提供了一个状态寄存器用于监控写入操作是否完成。

使用特权

评论回复
17
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
可以通过检查 FLASH_SR_BSY 位来判断是否正在进行 Flash 操作,优化程序等待时间。

c
复制代码
while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
{
    // 等待 Flash 操作完成
}
通过监控这个标志,可以在确保写入完成后进行后续操作,从而避免程序在等待期间过多的空闲循环。

使用特权

评论回复
18
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
优化电源管理
Flash 写入时电压要求较为严格。确保 MCU 处于良好的供电状态,电压波动可能会导致 Flash 写入延迟或失败,从而影响整体写入速度。因此,优化电源管理(例如保持 MCU 在适当的工作电压下)有助于提升 Flash 写入效率。

使用特权

评论回复
19
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
通过以上技巧,可以优化 STM32 Flash 写入速度

使用特权

评论回复
20
初级工程渣|  楼主 | 2024-9-30 18:11 | 只看该作者
启用预取缓冲区和指令缓存:减少程序在 Flash 写入期间的等待时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

667

帖子

0

粉丝