Skip to content

Commit 6388d8c

Browse files
authored
Merge pull request #180 from lizimu2020/master
补充完UF2数据flash读写部分并修复一个BUG
2 parents 0992349 + df181c9 commit 6388d8c

File tree

18 files changed

+2242
-104
lines changed

18 files changed

+2242
-104
lines changed

projects/uf2_boot/Core/Inc/flash.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#define __FLASH_H__
44

55
extern void flash_init(void);
6-
extern void flash_read(uint32_t WriteAddr, uint8_t *pData, uint32_t Size);
6+
extern void flash_read(uint32_t ReadAddr, uint8_t *pData, uint32_t Size);
77
extern void flash_write(uint32_t WriteAddr, uint8_t *pData, uint32_t Size);
88

99
#endif
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
#ifndef __W25Q128JV_H__
3+
#define __W25Q128JV_H__
4+
5+
#include <stdint.h>
6+
7+
#define W25Q128JV_FLASH_SIZE (8 * 1024 * 1024)
8+
#define W25Q128JV_BLOCK_SIZE (0x10000)
9+
#define W25Q128JV_SECTOR_SIZE (0x1000)
10+
#define W25Q128JV_PAGE_SIZE (0x100)
11+
12+
#define SPI_ERROR (-1)
13+
#define SPI_OK (0)
14+
15+
#define W25Q128JV_WRITE_ENABLE (0x06)
16+
#define W25Q128JV_READ (0x03)
17+
#define W25Q128JV_PAGE_PROGRAM (0x02)
18+
#define W25Q128JV_STATUS_REG1 (0x05)
19+
#define W25Q128JV_ENABLE_RESET (0x66)
20+
#define W25Q128JV_RESET_DEVICE (0x99)
21+
#define W25Q128JV_DEVICE_ID (0x90)
22+
#define W25Q128JV_ID_NUMBER (0x4b)
23+
#define W25Q128JV_ERASE_SECTOR (0x20)
24+
25+
extern void SPI_W25Q128JV_Reset(void);
26+
extern void SPI_W25Q128JV_DeviceID(uint8_t *v);
27+
extern void SPI_W25Q128JV_IDNumber(uint8_t *v);
28+
extern int SPI_W25Q128JV_EraseSector(uint32_t SectorAddress);
29+
extern int SPI_W25Q128JV_Read(uint8_t *pData, uint32_t ReadAddr, uint32_t Size);
30+
extern int SPI_W25Q128JV_PageProgram(uint8_t *pData, uint32_t ReadAddr, uint32_t Size);
31+
extern int SPI_W25Q128JV_Write(uint8_t *pData, uint32_t WriteAddr, uint32_t Size);
32+
33+
#endif

projects/uf2_boot/Core/Inc/w25q64jv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ extern int QSPI_W25Q64JV_DeviceID(uint8_t *v);
2525
extern int QSPI_W25Q64JV_IDNumber(uint8_t *v);
2626
extern int QSPI_W25Q64JV_EraseSector(uint32_t SectorAddress);
2727
extern int QSPI_W25Q64JV_Read(uint8_t *pData, uint32_t ReadAddr, uint32_t Size);
28-
extern int QSPI_W25Q64JV_PageProgram(uint8_t *pData, uint32_t ReadAddr, uint32_t Size);
28+
extern int QSPI_W25Q64JV_PageProgram(uint8_t *pData, uint32_t WriteAddr, uint32_t Size);
2929
extern int QSPI_W25Q64JV_Write(uint8_t *pData, uint32_t WriteAddr, uint32_t Size);
3030
extern int QSPI_W25Q64JV_EnableMemoryMappedMode(void);
3131

projects/uf2_boot/Core/Src/app.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "usb_device.h"
99

1010
#include "w25q64jv.h"
11+
#include "w25q128jv.h"
1112
#include "uf2.h"
1213
#include "flash.h"
1314

@@ -52,6 +53,20 @@ void user_main(void)
5253
}
5354
printf(" \r\n");
5455

56+
uint8_t w25q128jv_device_id[2];
57+
uint8_t w25q128jv_id_number[12];
58+
59+
SPI_W25Q128JV_Reset();
60+
SPI_W25Q128JV_DeviceID(w25q128jv_device_id);
61+
printf("Manufacturer / Device ID: 0x%x 0x%x \r\n", w25q128jv_device_id[0], w25q128jv_device_id[1]);
62+
SPI_W25Q128JV_IDNumber(w25q128jv_id_number);
63+
printf("Unique ID Number: ");
64+
for (int i = 4; i < 12; i++)
65+
{
66+
printf("0x%02x ", w25q128jv_id_number[i]);
67+
}
68+
printf(" \r\n");
69+
5570
if (HAL_GPIO_ReadPin(BOOT_KEY_GPIO_Port, BOOT_KEY_Pin) == GPIO_PIN_RESET)
5671
{
5772
uf2_init();

projects/uf2_boot/Core/Src/flash.c

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "flash.h"
77
#include "w25q64jv.h"
8+
#include "w25q128jv.h"
89

910
static uint8_t flash_page_bitmap[W25Q64JV_FLASH_SIZE / W25Q64JV_PAGE_SIZE / 8];
1011

@@ -15,6 +16,7 @@ static int get_bitmap(uint32_t bitNo);
1516
void flash_init(void)
1617
{
1718
QSPI_W25Q64JV_Reset();
19+
SPI_W25Q128JV_Reset();
1820
for (int i = 0; i < (W25Q64JV_FLASH_SIZE / W25Q64JV_PAGE_SIZE / 8); i++)
1921
{
2022
set_bitmap(i);
@@ -29,12 +31,17 @@ void flash_init(void)
2931
//}
3032
}
3133

32-
void flash_read(uint32_t WriteAddr, uint8_t *pData, uint32_t Size)
34+
void flash_read(uint32_t ReadAddr, uint8_t *pData, uint32_t Size)
3335
{
34-
if (WriteAddr & 0x90000000)
36+
if ((ReadAddr & 0x90000000) == 0x90000000)
3537
{
36-
WriteAddr -= 0x90000000;
37-
QSPI_W25Q64JV_Read(pData, WriteAddr, Size);
38+
ReadAddr -= 0x90000000;
39+
QSPI_W25Q64JV_Read(pData, ReadAddr, Size);
40+
}
41+
else if ((ReadAddr & 0xA0000000) == 0xA0000000)
42+
{
43+
ReadAddr -= 0xA0000000;
44+
SPI_W25Q128JV_Read(pData, ReadAddr, Size);
3845
}
3946
}
4047

@@ -43,7 +50,7 @@ void flash_write(uint32_t WriteAddr, uint8_t *pData, uint32_t Size)
4350
uint32_t sector_num;
4451
uint32_t page_num;
4552

46-
if (WriteAddr & 0x90000000)
53+
if ((WriteAddr & 0x90000000) == 0x90000000)
4754
{
4855
WriteAddr -= 0x90000000;
4956
page_num = WriteAddr / W25Q64JV_PAGE_SIZE;
@@ -61,6 +68,24 @@ void flash_write(uint32_t WriteAddr, uint8_t *pData, uint32_t Size)
6168
page_num = WriteAddr / W25Q64JV_PAGE_SIZE;
6269
set_bitmap(page_num); // 设置page位图,表示此page已经被使用.
6370
}
71+
else if ((WriteAddr & 0xA0000000) == 0xA0000000)
72+
{
73+
WriteAddr -= 0xA0000000;
74+
page_num = WriteAddr / W25Q128JV_PAGE_SIZE;
75+
if (get_bitmap(page_num)) // 检测page是否pageprogram.
76+
{
77+
sector_num = WriteAddr / W25Q128JV_SECTOR_SIZE; // 计算出page所在sector的首地址
78+
page_num = sector_num * (W25Q128JV_SECTOR_SIZE / W25Q128JV_PAGE_SIZE); // 被擦除的sector对应的page首地址
79+
SPI_W25Q128JV_EraseSector(sector_num * W25Q128JV_SECTOR_SIZE);
80+
for (uint32_t i = page_num; i < (page_num + W25Q128JV_SECTOR_SIZE / W25Q128JV_PAGE_SIZE); i++)
81+
{
82+
clr_bitmap(i); // 清除被擦除page的位图
83+
}
84+
}
85+
SPI_W25Q128JV_Write(pData, WriteAddr, Size);
86+
page_num = WriteAddr / W25Q128JV_PAGE_SIZE;
87+
set_bitmap(page_num); // 设置page位图,表示此page已经被使用.
88+
}
6489
}
6590

6691
static void clr_bitmap(uint32_t bitNo)

projects/uf2_boot/Core/Src/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ int main(void)
9090
/* Initialize all configured peripherals */
9191
MX_GPIO_Init();
9292
MX_QUADSPI_Init();
93-
// MX_SPI1_Init();
93+
MX_SPI1_Init();
9494
MX_UART4_Init();
9595
// MX_USB_DEVICE_Init();
9696
/* USER CODE BEGIN 2 */

projects/uf2_boot/Core/Src/spi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void MX_SPI1_Init(void)
3737
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
3838
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
3939
hspi1.Init.NSS = SPI_NSS_SOFT;
40-
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
40+
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
4141
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
4242
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
4343
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

projects/uf2_boot/Core/Src/uf2.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ typedef struct
5050
uint32_t size;
5151
} __attribute__((packed)) DirEntry;
5252

53+
// #define READ_UF2
54+
5355
#ifndef READ_UF2
5456
#define CODE_BIN_SIZE (8 * 1024 * 1024)
5557
#define DATA_BIN_SIZE (16 * 1024 * 1024)
@@ -198,22 +200,22 @@ static inline bool is_uf2_block(UF2_Block const *bl)
198200
*------------------------------------------------------------------*/
199201
void uf2_init(void)
200202
{
201-
//printf("SECTOR_PER_FAT(0x%x) \r\n", SECTOR_PER_FAT);
202-
//printf("START_FAT(0x%x) \r\n", START_FAT);
203-
//printf("FAT_SECTORS(0x%x) \r\n", FAT_SECTORS);
204-
//printf("START_ROOT(0x%x) \r\n", START_ROOT);
205-
//printf("ROOT_SECTORS(0x%x) \r\n", ROOT_SECTORS);
206-
//printf("START_DATA(0x%x) \r\n", START_DATA);
207-
//printf("DATA_SECTORS(0x%x) \r\n", DATA_SECTORS);
203+
printf("SECTOR_PER_FAT(0x%x) \r\n", SECTOR_PER_FAT);
204+
printf("START_FAT(0x%x) \r\n", START_FAT);
205+
printf("FAT_SECTORS(0x%x) \r\n", FAT_SECTORS);
206+
printf("START_ROOT(0x%x) \r\n", START_ROOT);
207+
printf("ROOT_SECTORS(0x%x) \r\n", ROOT_SECTORS);
208+
printf("START_DATA(0x%x) \r\n", START_DATA);
209+
printf("DATA_SECTORS(0x%x) \r\n", DATA_SECTORS);
208210

209211
// init info
210212
static uint32_t cluster = 2; // 簇号0,1为系统保留.
211213
for (int i = 0; i < (sizeof(info) / sizeof(TextFile)); i++)
212214
{
213215
info[i].start_cluster = cluster;
214216
cluster += info[i].clusters;
215-
//printf("info[%d].start_cluster(0x%x) \r\n", i, info[i].start_cluster);
216-
//printf("info[%d].clusters(0x%x) \r\n", i, info[i].clusters);
217+
printf("info[%d].start_cluster(0x%x) \r\n", i, info[i].start_cluster);
218+
printf("info[%d].clusters(0x%x) \r\n", i, info[i].clusters);
217219
}
218220
}
219221

0 commit comments

Comments
 (0)