第二个要点:因为 Flash 进行快速编程的时候不允许对 Flash 进行读取,所以还需要注意快速编程的源数据应该位于 RAM 而
非 Flash,以避免对 Flash 进行数据读取。 因为在 Flash 快速编程的时候,需要将 64 个 word 一个行(256 Bytes)的数据写到目
标地址中,所以也就是说在快速编程的时候,还会去访问源数据,如果源数据放在 Flash 就会导致问题产生。
所以,在这边聊一个移植中遇到的问题。
在从 STM32L4 到 STM32G0 的移植中,直接将 STM32L4 示例代码中定义的源数据的数组代码:/* Table used for fast programming */
static const uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = {
0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333,
0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777,
0x8888888888888888, 0x9999999999999999, 0xAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBB,
0xCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFF,
0x0011001100110011, 0x2233223322332233, 0x4455445544554455, 0x6677667766776677,
0x8899889988998899, 0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD, 0xEEFFEEFFEEFFEEFF,
0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755,
0xAA88AA88AA88AA88, 0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD};
原封不动地拷贝到 STM32G0 的项目中,在测试的时候,总是会发现程序会死在快速编程的过程中。最后检查才发现问题出
现在这个数组的定义上。因为 STM32L4 使用 stm32l452xx_sram.icf 定义了 ROM 的地址为 0x20000000~0x20015FFF,所以
这个 const 关键字的数据实际上也是位于 RAM 中的。但是将这个数组搬到 STM32G0 的项目时,因为使用的是
stm32l452xx_flash.icf,导致这个数组位于 Flash 中,所以在快速编程的时候程序就会去访问 Flash 读取源数据,就导致问题
产生了。所以,需要将数组修改为:
/* Table used for fast programming */
uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = {
0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333,
0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777,
0x8888888888888888, 0x9999999999999999, 0xAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBB,
0xCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFF,
0x0011001100110011, 0x2233223322332233, 0x4455445544554455, 0x6677667766776677,
0x8899889988998899, 0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD, 0xEEFFEEFFEEFFEEFF,
0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755,
0xAA88AA88AA88AA88, 0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD};
这样就可以了。
|