国产数据库FlashDB移植到国产MCU GD32F103RC上的几点经验总结

在移植国产数据库FlashDB到MCU GD32F103RC的过程中,测试了片内Flash和片外SPI Flash两个例程,笔者碰到了几个难以解决的问题,困扰了好些时日,花了很长一段时间才解决。现象和经验总结如下:

一、移植完成后,在测试片外SPI例程时,总是出现以下几点错误:

1)"Error: Can't enable write status."

2)"Error: Can't disable write status."

3)"Error: Flash wait busy has an error."

4)"Error: Flash device reset failed."

上面的几个错误时随机出现的,比较怪异。手中有一块板子,主控为GD32F103RC,板载SPI Flash W25Q16芯片,尝试了很多办法。于是将主控改为STM32F103RC,用STM32的测试例程测试,还是同样的现象。初步怀疑W25Q16接口芯片的管脚定义对应不上,将开发板供应商出厂的原始SPI Flash例程下载到MCU,发现可以正常读写Flash。逐一对比自己写的SPI驱动程序和原厂的驱动程序,并检查原理图,才发现GD32的SPI2引脚复用了JTAG引脚(PB3/JTDO/SPI2_SCK,复位默认为JTDO功能,PB4/NJRST/SPI2_MISO复位默认为NJRST功能,PB5/SPI2_MOSI复位默认功能为PB5,片选PA15/JTDI/SPI2_NSS)。

真是凑巧,SPI2(GD32是SPI2,STM32是SPI3)几个管脚都复用了JTAG信号。其实,只要将SPI的驱动程序修改成下面,将复用功能使能,同时禁用JTAG保留SWD,即可打通SPI的所有通信。

rcu_periph_clock_enable(RCU_GPIOB);

rcu_periph_clock_enable(RCU_GPIOA);

rcu_periph_clock_enable(RCU_AF);

rcu_periph_clock_enable(RCU_SPI2);

gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);

/* SPI2_SCK(PB3), SPI2_MISO(PB4) and SPI2_MOSI(PB5) GPIO pin configuration */

gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5);

/* SPI2_CS(PA15) GPIO pin configuration */

gpio_init(spi2.cs_gpiox, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, spi2.cs_gpio_pin);

二、在第一个步骤完成后,发现驱动FlashDB还是有不成功的地方,后面发现发送函数有一个地方逻辑发生错误

void gd32_spi_transmit(uint32_t spix, const uint8_t *write_buf, uint16_t write_size, uint32_t timeout, uint8_t* error)

{

uint16_t i;

const uint8_t *buffer = write_buf;

//for(i = 0; (i<write_size) && ((*error)!=0); i++)//这里的逻辑有错误,(*error)!=0是错误的,(*error)==0才是正确的逻辑!

for(i = 0; (i<write_size) && ((*error)==0); i++)

{

spi_flash_send_byte(spix, *buffer++, timeout, error);

}

}

三、经验总结

(1)仔细阅读原厂的BSP驱动是多么重要,他们根据板子做好了适配,其驱动程序几乎100%可以跑得通。自己根据手册编写的驱动程序不一定正确,可能需要反复调试。

(2)务必保证函数里各种判断逻辑的正确性,判断为false或者判断为true是两个截然不同的结果。

大家多点点赞和收藏,晚些时候将FlashDB移植到GD32F103RC的片内Flash和片外SPI Flash源码开源出来!

相关推荐
mftang1 小时前
CAN总线控制段:位级结构、DLC编码、代际扩展与错误处理的系统性分析
单片机·嵌入式硬件·can总线·控制段·数据长度代码
Jason_zhao_MR9 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
BSD_CGQ10 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
芯岭技术郦13 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星13 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件
zhangrelay14 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
艾芯微科技14 小时前
钰泰 ETA5055V330DD1E|SOT-223 3.3V LDO,低压差、大电流线性稳压选型分享
网络·单片机·嵌入式硬件·集成测试·51单片机
新晨单片机设计15 小时前
S023A-基于STM32单片机智能插座【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·单片机智能插座
威嵌神州16 小时前
恩智浦 T1022 性能怎么样?QorIQ 架构中端工业嵌入式优势解析
嵌入式硬件
weixin_6906547416 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理