【 】【华大测评】+FLASH读写及字库构建测试
在HC32F460的开发板上,提供了一个SPI接口的W25Q64存储芯片,由于其存储容量较大,故适宜做字库或图库来使用。
W25Q64的接口原理图见图1所示,其占用的MCU引脚如下:
SCLK---PC6
SL-- PC7
IO0-- PD8
IO1-- PD9
IO2-- PD10
IO3-- PD11
图1 W25Q64接口
在结合OLED 屏及独立按键的情况下,我们可以将其构建为一个中文字库。
OLED 屏的接口原理图如图2所示,其占用的MCU引脚如下:
SCL---PD0
SDA--- PD1
图2 OLED 屏接口
独立按键的接口原理图如图3所示,其占用的MCU引脚如下:
KEY0---PD12
KEY1---PD13
KEY2---PD14
KEY3---PA4
图3 独立按键接口
实现FLASH读写及字库构建测试的关键程序如下:
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32F460 TEST",16);
- OLED_ShowString(0,2,"OLED & W25Q64",16);
- Ddl_Delay1ms(1000u);
- OLED_Clear();
- OLED_ShowCHinese(0,0,3);
- OLED_ShowCHinese(16,0,4);
- OLED_ShowCHinese(32,0,5);
- OLED_ShowCHinese(48,0,6);
- OLED_ShowCHinese(64,0,7);
- OLED_ShowCHinese(0,2,8);
- OLED_ShowCHinese(16,2,9);
- OLED_ShowCHinese(32,2,10);
- OLED_ShowCHinese(48,2,11);
- OLED_ShowCHinese(64,2,12);
- PORT_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcPortInit);
- SPI_NSS_HIGH();
- Sw2_Init();
- Spi_Config();
- bufferLen = (uint16_t)sizeof(txBuffer);
- while (1)
- {
- if (1u == u8ExIntFlag)
- {
- OLED_Clear();
- u8ExIntFlag = 0u;
- LED0_OFF();
- LED1_OFF();
- memset(rxBuffer, 0l, sizeof(rxBuffer));
- SpiFlash_Erase4KbSector(flashAddr);
- SpiFlash_WritePage(flashAddr, (uint8_t*)&txBuffer[0], bufferLen);
- SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], bufferLen);
- if (memcmp(txBuffer, rxBuffer, (uint32_t)bufferLen) != 0)
- {
- LED0_ON();
- OLED_ShowString(0,2,"W25Q64 NO ",16);
- }
- else
- {
- LED1_ON();
- OLED_ShowString(0,2,"W25Q64 OK ",16);
- Ddl_Delay1ms(1000u);
- for(i=0;i<16;i++)
- {
- OLED_ShowChar(i*8,0,txBuffer[i],16);
- }
- for(i=0;i<16;i++)
- {
- OLED_ShowChar(i*8,2,txBuffer[16+i],16);
- }
- }
- Ddl_Delay1ms(1000u);
- OLED_Clear();
- flashAddr += FLASH_SRCTOR_SIZE;
- if (flashAddr >= FALSH_MAX_ADDR)
- {
- flashAddr = 0u;
- }
- memset(rxBuffer, 0l, sizeof(rxBuffer));
- SpiFlash_Erase4KbSector(flashAddr);
- for(i=0;i<160;i++)
- {
- rxBuffer[i]=Hzk[i/16+6][i%16];
- }
- SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
- SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
- for(i=0;i<5;i++)
- {
- for(j=0;j<32;j++)
- {
- Hzm[j]=rxBuffer[i*32+j];
- }
- OLED_ShowCHinesel(i*16,0);
- }
- for(i=0;i<160;i++)
- {
- rxBuffer[i]=Hzk[i/16+16][i%16];
- }
- flashAddr=flashAddr+160;
- SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
- SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
- for(i=0;i<5;i++)
- {
- for(j=0;j<32;j++)
- {
- Hzm[j]=rxBuffer[i*32+j];
- }
- OLED_ShowCHinesel(i*16,2);
- }
- }
- }
复制代码
经编译下载,该程序的运行效果如图4~图7所示。
图4 起始界面
图5 W25Q64基本测试
图6 信息读写测试
图7 字库读写测试
实现一维数组汉字显示的函数为:
- void OLED_ShowCHinesel(uint8_t x, uint8_t y)
- {
- uint8_t t;
- OLED_Set_Pos(x,y);
- for(t=0;t<16;t++)
- {
- OLED_WR_Byte(Hzm[t],OLED_DATA);
- }
- OLED_Set_Pos(x,y+1);
- for(t=0;t<16;t++)
- {
- OLED_WR_Byte(Hzm[16+t],OLED_DATA);
- }
- }
复制代码
赞 (0)