我们现在来改造 IPG 方式的 Flash 写入函数,首先要修改 deviceconfig 变量将 AWRSeqIndex 指向 PAGEPROGRAM_QUAD 在 LUT 中的位置,然后将 FLEXSPI_TransferBlocking() 函数换成 AHB 写入代码(memcpy 或者指针操作赋值),这时候 src 里的数据就会被自动放在大小为 64 bytes 的 AHB TX Buffer 里,SEQ_CTL 组件处理时会将缓存在 AHB TX Buffer 里的数据全部发送到 Flash 端。

  但这里有一些限制,经实测,利用 memcpy 做 AHB 写,一次仅能写入 1/2/3/4/8 这五种有效长度的数据,其他数据长度不及预期(比如拷贝 5 - 7 字节,实际仅写入前 4 字节;拷贝 8 字节以上,实际仅写入前 8 字节),这其实跟 《i.MXRT中FlexSPI外设对AHB Burst Read特性的支持》 一文里提及的处理器 AHB Burst 策略有关,FlexSPI 每次仅会缓存一次 AHB Burst 写数据进 AHB TX Buffer,而 SEQ_CTL 每工作一次都会使能一次 Flash 器件的数据处理流程(进入 Busy 状态),因此连续的两次 AHB burst 写,后面一次的 burst 行为其实不产生实际 Flash 写入效果。

flexspi_device_config_t deviceconfig = {
    // ... 其他省略
    .AWRSeqIndex          = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD,
    .AWRSeqNumber         = 1,
};

void flexspi_nor_flash_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size)
{
    while (size)
    {
        // Write Enable 子时序
        flexspi_nor_write_enable(base, 0);

uint32_t cpyBytes = 0;
        if (size >= 8)      { cpyBytes = 8; }
        else if (size >= 4) { cpyBytes = 4; }
        else                { cpyBytes = size; }
        memcpy((void *)dstAddr, (void *)src, cpyBytes);
        __DSB();

// Read Status 子时序
        flexspi_nor_wait_bus_busy(base);

dstAddr += cpyBytes;
        src += cpyBytes / 4;
        size -= cpyBytes;
    }

FLEXSPI_SoftwareReset(base);
}
  上面看似鸡肋的 AHB 方式写入 Flash 到底有什么用?底下痞子衡会讲到 XECC 模块,到时你就知道其用处了。

特殊用法(AHB写)相关推荐

  1. python写了代码_Python写代码的用法建议

    1.Mutable and immutable types Python有两种内置或用户定义的类型 可变类型是允许就地修改内容的类型.典型的可变列表是列表和词典:所有列表都有变异方法,如 list.a ...

  2. QCustomPlot的简单用法总结

    QCustomPlot的简单用法总结 第一部分:QCustomPlot的下载与安装 第二部分:QCustomPlot在VS2013+QT下的使用 QCustomPlot的简单用法总结    写在前面, ...

  3. vue foreach用法_两年前端er,JS和Vue,面试被问了哪些问题呢?有点简单啊

    上午跟一个大学学妹聊天,聊起了她近期的一次面试. 她的概况,工作两年不到,薪资要求在8-10K之间,技术栈Vue,想在大一点的团队工作,因为之前都是一个人做前端. 以下是问及的一些问题(我做了一些简单 ...

  4. json java的set函数,JsonConfig的jsonConfig.setExcludes的用法

    JsonConfig的jsonConfig.setExcludes的用法 之前写一个小东西,当用JSONArray.fromObject()方法转一个对象集合时,因为对象中存在一对多的关系,一直抛出异 ...

  5. Hibernate写hql语句与不写hql语句的区别?

    写hql语句与不写hql语句的区别? 写hql语句:书写HQL语句,所有的查询与投影的设计均使用HQL语句完成. 不写hql语句:没有任何查询语句,所有的查询与投影的设计使用面向对象格式完成. 二者选 ...

  6. C++ typename的起源与用法

    目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译 ...

  7. loop和goto用法

    loop和goto用法 之所以写这个博客是因为,我在csDN查loop时搜到的文章都要money ,或者积分,但我不想消耗积分在这上面.

  8. Matlab 中@ 的用法

    Matlab 中@的用法主要有:函数句柄.函数表达式.调用父类以及类文件夹. 前两种有很多介绍,后两种涉及类,介绍的人很少.前2个例子,参考了其它博客,总感觉@用法都写的不全,所以在此基础上,补充了3 ...

  9. slf4j log4j logback关系详解和相关用法 【by Sinte-Beuve】

    slf4j log4j logback关系详解和相关用法 slf4j log4j logback的关系 The Simple Logging Facade for Java是什么? log4j和log ...

最新文章

  1. python打印自动换行如何解决_解决python DataFrame 打印结果不换行问题
  2. 输入三个数,按照由大到小的顺序输出
  3. 工作74:vue带参数跳转其他页面
  4. 1.Redis简介与基本命令
  5. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制
  6. es6 yield表达式
  7. springcloud架构特点_你想了解的「Spring Cloud」都在这里
  8. Android应用内嵌cocos2dx游戏项目
  9. 大学计算机试题在线,大学计算机基础试题选择题.pdf
  10. Java 支付对接之微信/支付宝扫码支付(也就是H5支付)
  11. 面试宝典之深度学习面试题(下)
  12. Java 进制转换函数
  13. jquery 图片左右切换,一长条的显示,点击左右移动。
  14. c语言程序窗口设计,C语言窗口程序设计简介.pdf
  15. 蓝牙sbc怎么解决_简单一文,为你详细解析手机蓝牙的音质之谜
  16. 23位子网掩码是多少_子网掩码划分
  17. w10桌面计算机图标箭头去除,完美W10如何去除桌面图标快捷方式小箭头
  18. 算法设计-实现运动员比赛日程表 C代码
  19. 【第二十四期】golang 一年经验开发 富途
  20. Codeforces 85D Sum of Medians[线段树]

热门文章

  1. TOP计划猿10最佳实践文章
  2. web.xml中的主要元素说明(listener, filter, servlet)
  3. 织梦dede所有标签调用方法大全
  4. 浅谈如何用We7站群平台打造垂直性政务网站
  5. main,tmain,winmain()等函数——UNICODE - sensensen - 博客园
  6. 怎么打开mysql服务_服务器网站打开速度过慢,怎么进行自检?
  7. japidocs怎么设置参数必填_常用的3种拍摄模式,相机参数怎么设置?如何正确曝光?...
  8. python变量的理解_如何理解Python中的变量
  9. 880 芯片组 服务器 cpu,顶级双核处理器对决 皓龙880完胜至强
  10. 网站日志统计查询工具