打印
[应用相关]

工作在XIP(执行内存)模式下

[复制链接]
1082|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
初级工程渣|  楼主 | 2024-3-20 07:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是初始化AT32F435芯片的QSPI(四线SPI)接口,以驱动W25Q128JV闪存芯片,并使其工作在XIP(执行内存)模式下的示例代码:


#include "AT32f4xx.h"

// 初始化QSPI
void QSPI_Init() {
    // 使能QSPI时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_QSPI, ENABLE);
   
    // 配置GPIO引脚
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; // QSPI引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
   
    // 配置QSPI参数
    QSPI_InitTypeDef QSPI_InitStructure;
    QSPI_InitStructure.QSPI_RP = 0x10; // 时钟极性为0
    QSPI_InitStructure.QSPI_CP = 0x00; // 时钟相位为0
    QSPI_InitStructure.QSPI_BaudRatePrescaler = 0x01; // 波特率分频为2
    QSPI_InitStructure.QSPI_FIFOThresh = 0x08; // FIFO阈值为8
    QSPI_InitStructure.QSPI_DFS = 0x00; // 数据帧大小为8位
    QSPI_Init(QSPI, &QSPI_InitStructure);
   
    // 使能QSPI
    QSPI_Cmd(QSPI, ENABLE);
}

// 初始化W25Q128JV
void W25Q128JV_Init() {
    // 发送命令,使W25Q128JV进入XIP模式
    // 命令格式:0x38 (Fast Read Dual Output)
    QSPI_DataLoad(QSPI, 0x38); // 发送命令
    while(QSPI->CR&0x80); // 等待传输完成
}

int main() {
    // 初始化QSPI
    QSPI_Init();
   
    // 初始化W25Q128JV,使其进入XIP模式
    W25Q128JV_Init();
   
    while(1) {
        // 程序主循环
    }
}
这个示例代码假设QSPI的引脚已经连接到了PC10、PC11、PC12和PC13,并且已经正确配置为复用推挽输出模式。

在QSPI_Init函数中,首先配置了QSPI的GPIO引脚,然后配置了QSPI的各项参数,包括时钟极性、时钟相位、波特率分频等,并最终使能了QSPI。

在W25Q128JV_Init函数中,发送了一个命令(0x38)给W25Q128JV闪存芯片,该命令将使闪存芯片进入XIP模式(执行内存模式)。

你需要根据实际硬件连接和需要修改GPIO引脚配置和QSPI参数,并确保W25Q128JV芯片可以正确接收到并处理发送的命令。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

516

帖子

0

粉丝