mirror of
				https://github.com/IcedRooibos/py32f0-template.git
				synced 2025-10-31 01:42:04 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "main.h"
 | |
| #include "py32f0xx_bsp_clock.h"
 | |
| #include "py32f0xx_bsp_printf.h"
 | |
| 
 | |
| #define FLASH_USER_START_ADDR     0x0800F800
 | |
| 
 | |
| const uint32_t DATA[64] =
 | |
| {
 | |
|   0x01010101, 0x23456789, 0x3456789A, 0x456789AB, 0x56789ABC, 0x6789ABCD, 0x789ABCDE, 0x89ABCDEF,
 | |
|   0x9ABCDEF0, 0xABCDEF01, 0xBCDEF012, 0xCDEF0123, 0xDEF01234, 0xEF012345, 0xF0123456, 0x01234567,
 | |
|   0x01010101, 0x23456789, 0x3456789A, 0x456789AB, 0x56789ABC, 0x6789ABCD, 0x789ABCDE, 0x89ABCDEF,
 | |
|   0x9ABCDEF0, 0xABCDEF01, 0xBCDEF012, 0xCDEF0123, 0xDEF01234, 0xEF012345, 0xF0123456, 0x01234567,
 | |
|   0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA,
 | |
|   0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA,
 | |
|   0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA,
 | |
|   0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA,
 | |
| };
 | |
| 
 | |
| static void APP_FlashErase(void);
 | |
| static void APP_FlashProgram(void);
 | |
| static void APP_FlashEraseVerify(void);
 | |
| static void APP_FlashWriteVerify(void);
 | |
| 
 | |
| 
 | |
| int main(void)
 | |
| {
 | |
|   BSP_RCC_HSI_PLL48MConfig();
 | |
| 
 | |
|   BSP_USART_Config(115200);
 | |
|   printf("Flash Read&Write Demo\r\nClock: %ld\r\n", SystemCoreClock);
 | |
| 
 | |
|   // Unlock flash
 | |
|   LL_FLASH_Unlock();
 | |
|   // Erase flash
 | |
|   APP_FlashErase();
 | |
|   APP_FlashEraseVerify();
 | |
|   printf("Erase verif: succ\r\n");
 | |
| 
 | |
|   // Write to flash
 | |
|   APP_FlashProgram();
 | |
|   // Lock
 | |
|   LL_FLASH_Lock();
 | |
|   // Write verification
 | |
|   APP_FlashWriteVerify();
 | |
|   printf("Write verif: succ\r\n");
 | |
| 
 | |
|   while (1);
 | |
| }
 | |
| 
 | |
| static void APP_FlashErase(void)
 | |
| {
 | |
|   uint32_t SECTORError = 0;
 | |
|   FLASH_EraseInitTypeDef EraseInitStruct;
 | |
|   // Erase type = sector
 | |
|   EraseInitStruct.TypeErase   = FLASH_TYPEERASE_SECTORERASE;
 | |
|   // Erase address start
 | |
|   EraseInitStruct.SectorAddress = FLASH_USER_START_ADDR;
 | |
|   // Number of sectors
 | |
|   EraseInitStruct.NbSectors  = 1;
 | |
|   // Erase
 | |
|   if (LL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != SUCCESS)
 | |
|   {
 | |
|     APP_ErrorHandler();
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void APP_FlashProgram(void)
 | |
| {
 | |
|   uint32_t flash_program_start = FLASH_USER_START_ADDR ;
 | |
|   uint32_t flash_program_end = (FLASH_USER_START_ADDR + sizeof(DATA));
 | |
|   uint32_t *src = (uint32_t *)DATA;
 | |
| 
 | |
|   while (flash_program_start < flash_program_end)
 | |
|   {
 | |
|     // Write to flash
 | |
|     if (LL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, flash_program_start, src) == SUCCESS)
 | |
|     {
 | |
|       // Move flash point to next page
 | |
|       flash_program_start += FLASH_PAGE_SIZE;
 | |
|       // Move data point
 | |
|       src += FLASH_PAGE_SIZE / 4;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void APP_FlashEraseVerify(void)
 | |
| {
 | |
|   uint32_t addr = 0;
 | |
| 
 | |
|   while (addr < sizeof(DATA))
 | |
|   {
 | |
|     if (0xFFFFFFFF != HW32_REG(FLASH_USER_START_ADDR + addr))
 | |
|     {
 | |
|       printf("erase verification error\r\n");
 | |
|     }
 | |
|     addr += 4;
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void APP_FlashWriteVerify(void)
 | |
| {
 | |
|   uint32_t addr = 0;
 | |
| 
 | |
|   while (addr < sizeof(DATA))
 | |
|   {
 | |
|     if (DATA[addr / 4] != HW32_REG(FLASH_USER_START_ADDR + addr))
 | |
|     {
 | |
|       printf("write verification error\r\n");
 | |
|     }
 | |
|     addr += 4;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void APP_ErrorHandler(void)
 | |
| {
 | |
|   while (1);
 | |
| }
 | |
| 
 | |
| #ifdef  USE_FULL_ASSERT
 | |
| void assert_failed(uint8_t *file, uint32_t line)
 | |
| {
 | |
|   while (1);
 | |
| }
 | |
| #endif /* USE_FULL_ASSERT */
 | 
