2015-02-13 48 views
8

Tôi đang cố gắng sử dụng đèn flash bên trong của STM32F405 để lưu trữ một loạt các byte có thể cài đặt của người dùng vẫn còn sau khi khởi động lại.Phân bổ bộ nhớ trong Flash cho dữ liệu người dùng (STM32F4 HAL)

Tôi đang sử dụng:

uint8_t userConfig[64] __attribute__((at(0x0800C000)));

để cấp phát bộ nhớ cho dữ liệu tôi muốn lưu trữ.

Khi chương trình bắt đầu, tôi kiểm tra để xem nếu byte đầu tiên được thiết lập để 0x42, nếu không, tôi đặt nó bằng cách sử:

HAL_FLASH_Unlock(); HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42); HAL_FLASH_Lock();

Sau đó tôi kiểm tra giá trị trong userConfig[0] và tôi thấy 0x42 ... Tuyệt vời!

Khi tôi nhấn reset tuy nhiên, và nhìn vào vị trí một lần nữa, nó không phải 0x42 nữa ...

Bất kỳ ý tưởng nơi tôi sẽ sai? Tôi cũng đã thử:

#pragma location = 0x0800C00 volatile const uint8_t userConfig[64]

nhưng tôi nhận được kết quả tương tự ..

Trả lời

14

rồi tôi tìm thấy một câu trả lời trên the ST forums nhờ clive1. Ví dụ này hoạt động cho một STM32F405xG.

tiên chúng ta cần phải sửa đổi cách bố trí bộ nhớ trong file linker script (file .ld)

Sửa đổi FLASH hiện có và thêm một dòng mới cho DATA. Ở đây tôi đã phân bổ tất cả section 11.

MEMORY 
{ 
    FLASH (RX)  : ORIGIN = 0x08000000, LENGTH = 1M-128K 
    DATA (RWX)  : ORIGIN = 0x080E0000, LENGTH = 128k 
    ... 
    ... 
} 

Manual for editing linker files on the sourceware website

Trong cùng một tập tin, chúng ta cần thêm:

.user_data : 
{ 
    . = ALIGN(4); 
    *(.user_data) 
    . = ALIGN(4); 
} > DATA 

này tạo ra một section gọi .user_data rằng chúng ta có thể giải quyết trong mã chương trình.

Cuối cùng, trong file .c của bạn thêm:

__attribute__((__section__(".user_data"))) const uint8_t userConfig[64] 

này quy định rằng chúng ta muốn lưu trữ các biến userConfig trong phần .user_dataconst đảm bảo địa chỉ của userConfig được giữ tĩnh.

Bây giờ, để ghi vào khu vực flash này trong thời gian chạy, bạn có thể sử dụng trình điều khiển flash stmlib std32f4 hoặc HAL.

Trước khi bạn có thể viết thư cho đèn flash, nó phải được xoá hoàn toàn (tất cả các byte thiết lập để 0xFF) Các hướng dẫn cho các thư viện HAL nói gì về việc này vì một lý do ...

HAL_FLASH_Unlock(); 

__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); 

FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3); 

HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[index], someData); 

HAL_FLASH_Lock();