CH579-Flash
1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : Main.c 3 * Author : WCH 4 * Version : V1.0 5 * Date : 2018/12/15 6 * Description : 片上flash演示:包括Code区,DataFlash区的擦/读/写 7 *******************************************************************************/ 8 9 #include "CH57x_common.h" 10 11 #define TEST_CODESIZE 100 12 #define TEST_CODEADDR 0x00006000 13 #define TEST_DATAFLASHSIZE 4 14 #define TEST_DATAFLASHADDR 0x0400 15 16 UINT32 TestBuf[ TEST_CODESIZE ]; 17 18 void DebugInit(void) 19 { 20 GPIOA_SetBits(GPIO_Pin_9); 21 GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); 22 GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); 23 UART1_DefInit(); 24 } 25 26 /******************************************************************************* 27 * Function Name : CodeFlash_BlockErase 28 * Description : CodeFlash 块擦除,一次擦除512B 29 * Input : addr: 32位地址,需要512对齐 30 * Return : FAILED - 错误 31 SUCCESS - 成功 32 *******************************************************************************/ 33 UINT8 CodeFlash_BlockErase(UINT32 addr) 34 { 35 UINT8 status = 0; 36 37 EnableCodeFlash(); 38 status = Flash_BlockErase( addr ); 39 LockFlashALL(); 40 41 return ( status ); 42 } 43 44 45 /******************************************************************************* 46 * Function Name : CodeFlash_WriteDW 47 * Description : CodeFlash 双字写,地址需4字节对齐 48 * Input : addr: 32位地址,需要4对齐 49 dat: 32位写入数据 50 * Return : FAILED - 错误 51 SUCCESS - 成功 52 *******************************************************************************/ 53 UINT8 CodeFlash_WriteDW(UINT32 addr, UINT32 dat) 54 { 55 UINT8 status = 0; 56 57 EnableCodeFlash(); 58 status = Flash_WriteDW( addr, dat ); 59 LockFlashALL(); 60 61 return ( status ); 62 } 63 64 /******************************************************************************* 65 * Function Name : CodeFlash_WriteBuf 66 * Description : CodeFlash 连续多个双字写入 67 * Input : addr: 32位地址,需要4对齐 68 pdat: 待写入数据缓存区首地址 69 len: 待写入数据字节长度 70 * Return : FAILED - 错误 71 SUCCESS - 成功 72 *******************************************************************************/ 73 UINT8 CodeFlash_WriteBuf(UINT32 addr, PUINT32 pdat, UINT16 len) 74 { 75 UINT32 add = addr; 76 PUINT32 p32 = pdat; 77 UINT8 status = 0; 78 UINT16 i; 79 80 EnableCodeFlash(); 81 for(i=0; i<len; i+=4) 82 { 83 status = Flash_WriteDW( add, *p32++ ); 84 if( status != SUCCESS ) break; 85 add += 4; 86 } 87 LockFlashALL(); 88 89 return ( status ); 90 } 91 92 /******************************************************************************* 93 * Function Name : DataFlash_BlockErase 94 * Description : DataFlash 块擦除,一次擦除512B 95 * Input : addr: 32位地址,需要512对齐 96 * Return : FAILED - 错误 97 SUCCESS - 成功 98 *******************************************************************************/ 99 UINT8 DataFlash_BlockErase(UINT32 addr) 100 { 101 UINT8 status = 0; 102 103 if( addr >= DATA_FLASH_SIZE ) return FAILED; 104 addr = addr + DATA_FLASH_ADDR; 105 106 EnableDataFlash(); 107 status = Flash_BlockErase( addr ); 108 LockFlashALL(); 109 110 return ( status ); 111 } 112 113 /******************************************************************************* 114 * Function Name : DataFlash_WriteDW 115 * Description : DataFlash 双字写,地址需4字节对齐 116 * Input : addr: 32位地址,需要4对齐 117 dat: 32位写入数据 118 * Return : FAILED - 错误 119 SUCCESS - 成功 120 *******************************************************************************/ 121 UINT8 DataFlash_WriteDW(UINT32 addr, UINT32 dat) 122 { 123 UINT8 status = 0; 124 125 if( addr >= DATA_FLASH_SIZE ) return FAILED; 126 addr = addr + DATA_FLASH_ADDR; 127 128 EnableDataFlash(); 129 status = Flash_WriteDW( addr, dat ); 130 LockFlashALL(); 131 132 return ( status ); 133 } 134 135 136 137 int main() 138 { 139 UINT16 i; 140 PUINT32 p32; 141 UINT8 buf[8]; 142 PUINT16 p16; 143 144 /* 配置串口调试 */ 145 DebugInit(); 146 PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID ); 147 148 /* */ 149 PRINT( "GetUniqueID: "); 150 GetUniqueID( buf ); 151 p16 = (PUINT16)buf; 152 if( *(p16+3) == (*(p16+0) + *(p16+1) + *(p16+2)) ) // 判断校验和 153 { 154 for(i=0; i<6; i++) 155 { 156 PRINT("%02x ", buf[i]); 157 }PRINT("\n"); 158 } 159 else 160 { 161 PRINT( "UniqueID is error or none !!! \n"); 162 } 163 164 165 /* 获取网络MAC地址 */ 166 PRINT( "GetMACAddress: "); 167 GetMACAddress( buf ); 168 for(i=0; i<6; i++) 169 { 170 PRINT("%02x ", buf[i]); 171 }PRINT("\n"); 172 173 #if 1 174 /* 测试 code 擦写读 */ 175 p32 = (PUINT32)TEST_CODEADDR; 176 PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); 177 for(i=0; i<TEST_CODESIZE; i++) 178 { 179 PRINT("%08lx ",*p32++); 180 }PRINT("\n"); 181 182 p32 = (PUINT32)TEST_CODEADDR; 183 PRINT( "Earse addr=0x%08lx : ", (UINT32)p32 ); 184 i = CodeFlash_BlockErase( (UINT32)p32 ); 185 if( i == SUCCESS ) PRINT("success..\n"); 186 else PRINT("failed..\n"); 187 188 p32 = (PUINT32)TEST_CODEADDR; 189 PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); 190 for(i=0; i<TEST_CODESIZE; i++) 191 { 192 PRINT("%08lx ",*p32++); 193 }PRINT("\n"); 194 195 for(i=0; i<TEST_CODESIZE; i++) 196 { 197 TestBuf[i] = i; 198 TestBuf[i] = (TestBuf[i]<<8) | i; 199 TestBuf[i] = (TestBuf[i]<<8) | i; 200 TestBuf[i] = (TestBuf[i]<<8) | i; 201 } 202 203 p32 = (PUINT32)TEST_CODEADDR; 204 PRINT( "Write addr=0x%08lx : ", (UINT32)p32 ); 205 i = CodeFlash_WriteBuf( (UINT32)p32, TestBuf, TEST_CODESIZE*4 ); 206 if( i == SUCCESS ) PRINT("success..\n"); 207 else PRINT("failed..\n"); 208 209 p32 = (PUINT32)TEST_CODEADDR; 210 PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); 211 for(i=0; i<TEST_CODESIZE; i++) 212 { 213 PRINT("%08lx ",*p32++); 214 }PRINT("\n"); 215 216 #endif 217 218 #if 1 219 /* 测试 dataflash 擦写读 */ 220 p32 = (PUINT32)(TEST_DATAFLASHADDR + DATA_FLASH_ADDR) ; 221 PRINT( "Read dataflash addr=0x%08lx :\n", (UINT32)p32 ); 222 for(i=0; i<TEST_DATAFLASHSIZE; i++) 223 { 224 PRINT("%08lx ",*p32++); 225 }PRINT("\n"); 226 227 p32 = (PUINT32)(TEST_DATAFLASHADDR); 228 PRINT( "Earse dataflash addr=0x%08lx : ", (UINT32)p32 ); 229 i = DataFlash_BlockErase( (UINT32)p32 ); 230 if( i == SUCCESS ) PRINT("success..\n"); 231 else PRINT("failed..\n"); 232 233 for(i=0; i<TEST_DATAFLASHSIZE; i++) 234 { 235 TestBuf[i] = (i+0x31); 236 TestBuf[i] = (TestBuf[i]<<8) | (i+0x31); 237 TestBuf[i] = (TestBuf[i]<<8) | (i+0x31); 238 TestBuf[i] = (TestBuf[i]<<8) | (i+0x31); 239 } 240 241 p32 = (PUINT32)(TEST_DATAFLASHADDR); 242 PRINT( "Write dataflash addr=0x%08lx : ", (UINT32)p32 ); 243 for(i=0; i<TEST_DATAFLASHSIZE; i++) 244 { 245 if( DataFlash_WriteDW( (UINT32)p32++, TestBuf[i])!=SUCCESS ) 246 { 247 break; 248 } 249 } 250 if( i==TEST_DATAFLASHSIZE ) PRINT("success..\n"); 251 else PRINT("failed..\n"); 252 253 p32 = (PUINT32)(TEST_DATAFLASHADDR + DATA_FLASH_ADDR); 254 PRINT( "Read dataflash addr=0x%08lx :\n", (UINT32)p32 ); 255 for(i=0; i<TEST_DATAFLASHSIZE; i++) 256 { 257 PRINT("%08lx ",*p32++); 258 }PRINT("\n"); 259 260 #endif 261 262 263 while(1); 264 }
Start @ChipID=79
GetUniqueID: UniqueID is error or none !!!
GetMACAddress: d1 30 01 e4 c2 84
Read addr=0x00006000 :
00000000 01010101 02020202 03030303 04040404 05050505 06060606 07070707 08080808 09090909 0a0a0a0a 0b0b0b0b 0c0c0c0c 0d0d0d0d 0e0e0e0e 0f0f0f0f 10101010 11111111 12121212 13131313 14141414 15151515 16161616 17171717 18181818 19191919 1a1a1a1a 1b1b1b1b 1c1c1c1c 1d1d1d1d 1e1e1e1e 1f1f1f1f 20202020 21212121 22222222 23232323 24242424 25252525 26262626 27272727 28282828 29292929 2a2a2a2a 2b2b2b2b 2c2c2c2c 2d2d2d2d 2e2e2e2e 2f2f2f2f 30303030 31313131 32323232 33333333 34343434 35353535 36363636 37373737 38383838 39393939 3a3a3a3a 3b3b3b3b 3c3c3c3c 3d3d3d3d 3e3e3e3e 3f3f3f3f 40404040 41414141 42424242 43434343 44444444 45454545 46464646 47474747 48484848 49494949 4a4a4a4a 4b4b4b4b 4c4c4c4c 4d4d4d4d 4e4e4e4e 4f4f4f4f 50505050 51515151 52525252 53535353 54545454 55555555 56565656 57575757 58585858 59595959 5a5a5a5a 5b5b5b5b 5c5c5c5c 5d5d5d5d 5e5e5e5e 5f5f5f5f 60606060 61616161 62626262 63636363
Earse addr=0x00006000 : success..
Read addr=0x00006000 :
ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
Write addr=0x00006000 : success..
Read addr=0x00006000 :
00000000 01010101 02020202 03030303 04040404 05050505 06060606 07070707 08080808 09090909 0a0a0a0a 0b0b0b0b 0c0c0c0c 0d0d0d0d 0e0e0e0e 0f0f0f0f 10101010 11111111 12121212 13131313 14141414 15151515 16161616 17171717 18181818 19191919 1a1a1a1a 1b1b1b1b 1c1c1c1c 1d1d1d1d 1e1e1e1e 1f1f1f1f 20202020 21212121 22222222 23232323 24242424 25252525 26262626 27272727 28282828 29292929 2a2a2a2a 2b2b2b2b 2c2c2c2c 2d2d2d2d 2e2e2e2e 2f2f2f2f 30303030 31313131 32323232 33333333 34343434 35353535 36363636 37373737 38383838 39393939 3a3a3a3a 3b3b3b3b 3c3c3c3c 3d3d3d3d 3e3e3e3e 3f3f3f3f 40404040 41414141 42424242 43434343 44444444 45454545 46464646 47474747 48484848 49494949 4a4a4a4a 4b4b4b4b 4c4c4c4c 4d4d4d4d 4e4e4e4e 4f4f4f4f 50505050 51515151 52525252 53535353 54545454 55555555 56565656 57575757 58585858 59595959 5a5a5a5a 5b5b5b5b 5c5c5c5c 5d5d5d5d 5e5e5e5e 5f5f5f5f 60606060 61616161 62626262 63636363
Read dataflash addr=0x0003ec00 :
31313131 32323232 33333333 34343434
Earse dataflash addr=0x00000400 : success..
Write dataflash addr=0x00000400 : success..
Read dataflash addr=0x0003ec00 :
31313131 32323232 33333333 34343434