GD32F303ZET6替代STM32F103ZET6时读写SPI flash W25Q128失败的处理

        今天是第二次来处理GD32F303ZET6读写W25Q128异常的问题了,之前就是因为这个问题耽误了半天的时间,后来不得不换回STM32F103ZET6。

       原STM32F103ZET6读写W25Q128是使用硬件SPI,初始化硬件SPI后会读取W25Q128的ID,在替换成GD32F303ZET6后,直接运行程序,读不到ID,更别说写入和读取数据了。后根据网上搜到的资料(直接搜索比较快),需要把SPI的MISO设置为浮空输入,STM32无要求,不过设置后依然读不到ID,然后又找到这么一条指令:

SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);
//对选中的SPI的接收FIFO的阈值进行配置
//参考:GD32F303 驱动 W25Q64 - 走看看

        but,STM32的头文件中没有,GD的头文件中也没有,查看GD32F30x的用户手册,并没有关于SPI接收阈值的配置寄存器。不得不放弃这个方案。(头大)

       讲真,查找这些硬件接口异常的问题,还是得借助示波器。

       其实在最开始找关于GD替换STM的一些资料时,就提到了频率的问题,所以在改了MISO为浮空输入后,也把SPI的分频系数改大了,降低了SPI时钟频率,原来的分频系数是:

SPI2_SetSpeed(SPI_BaudRatePrescaler_2);

改为

SPI2_SetSpeed(SPI_BaudRatePrescaler_256);

单步调试进入初始化部分时能够读到W25Q128的ID的,但是后面读写数据依然失败,后来顺着程序往后看,在SPI的读写函数SPI2_ReadWriteByte(u8 TxData);中想到了发送和接收的间隔时间是不是不太够,于是乎在发送后加了个100us的延时,额,WC,居然读写正常了。不过带来的问题就是在读写W25Q128时会致使整个程序卡顿约1S,按键体检就不好了。后来使用ucosIII的带可切换任务的延时函数时,貌似没有有效的执行延时,读写还是失败。。。。。。正当焦头烂额之际,想到了有篇文章提到的“GD32驱动W25Q128时不要使用SPI_I2S_FLAG_BSY位来判断W25Q128的状态”,抱着试一试的态度改了一下。。。。。。奇迹发生了,读写正常,按键也不卡顿了,再把SPI的频率改回SPI_BaudRatePrescaler_2后,效果依然好。修改如下:

u8 SPI2_ReadWriteByte(u8 TxData)
{        
    u32 源程序=0;        
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
        {
        retry++;
        if(retry>20000)return 0;
        }              
    SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
    retry=0;
        
    //增加忙标志判断,解决GD32F303ZET6读写W25Q128失败的问题
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
        {
        retry++;
        if(retry>20000)return 0;
        }    
        retry=0;


    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
        {
        retry++;
        if(retry>20000)return 0;
        }                                  
    return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据                        
}

源程序中retry是u8类型,最大值200,改为u32类型,最大值20000,实际调试中,SPI_I2S_FLAG_BSY等待中,retry值很小,基本在个位数,即解决了问题,又不影响整体时效。

<think>好的,我现在要帮用户解决关于GD32F303ZET6STM32型号性能对比的问题。首先,用户提到之前在使用GD32F303ZET6替代STM32F103ZET6遇到了SPI flash读写问题,后来不得不换回STM32。现在用户想找一个性能相当的STM32型号。我需要先了解GD32F303ZET6的参数和性能特点,然后找出STM32中类似的型号。 首先,GD32F303ZET6是基于Cortex-M4内核,主频120MHz,有512KB Flash和64KB RAM,外设包括USB、CAN、SPI、I2C等。而STM32F103ZET6是Cortex-M3,主频72MHz,资源较少。显然,直接替换可能导致性能不匹配,比如主频和内核不同可能影响外设驱动,比如SPI速度,这可能是之前失败的原因之一。 接下来,我需要查找STM32系列中与GD32F303ZET6性能接近的型号。STM32F4系列中的F407和F405是Cortex-M4,主频168MHz,资源更丰富,外设也更先进,可能更适合作为替代。另外,STM32F303系列虽然主频稍低(72MHz),但属于Cortex-M4,可能在某些方面更接近GD32F303的性能,尤其是DSP指令和浮点运算能力。 还要考虑外设兼容性,比如SPI、USART、定器等。GD32F303SPI钟可能更高,如果STM32SPI速度不够,可能导致通信问题,如用户之前遇到的W25Q128读写失败。这候需要查看两者的SPI最大速率是否匹配,或者是否需要在代码中调整分频系数。 另外,用户提到的外部中断问题,GD32的中断处理可能与STM32有所不同,比如中断标志清除机或配置方式,这可能导致频繁进入中断。因此,替换型号需要注意中断控制器的差异,并适当调整代码。 总结下来,STM32F407或F405系列在性能和功能上更接近GD32F303,而STM32F303可能在架构上更相似但主频较低。用户需要根据具体应用需求,比如处理速度、外设要求、功耗等来选择最合适的替代型号。同,替换要注意硬件和软件的适配,比如钟配置、外设初始化和中断处理,可能需要参考官方文档和社区资源进行调整。</think>### GD32F303ZET6STM32性能对比分析 #### 1. GD32F303ZET6关键参数 - **内核**: Cortex-M4,主频**120MHz** - **存储**: 512KB Flash, 64KB RAM - **外设**: USB、CAN、SPI、I2C、ADC等 - **特性**: 支持DSP指令与浮点运算单元(FPU) #### 2. 性能匹配的STM32型号 | STM32型号 | 内核 | 主频 | Flash/RAM | 适用场景 | |------------------|------------|--------|--------------|--------------------------| | **STM32F407ZET6** | Cortex-M4 | 168MHz | 512KB/192KB | 高性能控制、复杂算法 | | **STM32F405RG** | Cortex-M4 | 168MHz | 1MB/192KB | 高速数据处理 | | **STM32F303VCT6** | Cortex-M4 | 72MHz | 256KB/40KB | 中端应用,外设兼容性高 | #### 3. 替代注意事项 1. **钟配置差异** GD32F303钟树与STM32存在差异,需重新验证PLL配置。例如: ```c RCC_PLLConfig(RCC_PLLSource_HSE, 25, 240); // GD32示例配置 ``` 在STM32中需调整为: ```c RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336); // STM32F407典型配置 ``` 2. **外设兼容性问题** - **SPI序**: GD32SPI最大速率可达30MHz,而STM32F407的SPI在APB2总线下可达42MHz[^1]。若接口设备(如W25Q128)要求严格序,需调整分频系数。 - **中断处理**: GD32的外部中断标志清除序可能导致多次触发,需在中断服务中优先清除标志[^3]。 3. **代码迁移建议** - 使用STM32CubeMX重新生成初始化代码 - 替换GD32特有寄存器操作(如`RCU_APB2EN`改为`RCC_APB2ENR`) - 验证关键外设驱动(如DMA、ADC的触发方式) #### 4. 典型替代方案对比 | 需求场景 | 推荐STM32型号 | 优势分析 | |------------------|------------------|----------------------------------| | 高速数据处理 | STM32F407ZET6 | 主频提升40%,RAM增加3倍 | | 低功耗应用 | STM32L496ZG | 集成LCD控制器,运行功耗降低60% | | 成本敏感型项目 | STM32F303VCT6 | 保留Cortex-M4特性,价格低30% |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值