RT1020 —— BootLoader 中烧写 APP 到指定位置的方法

        把数组数据放到指定的 Flash 自定义 section 中:

        数组定义与声明:

#define LOCATION_EXTFLASH_ATTRIBUTE __attribute__ ((section ("Myapp"))) __attribute__ ((aligned(4)))const unsigned char _aclwip_ping_bm[0x12880] LOCATION_EXTFLASH_ATTRIBUTE = {
0, 0, 0,
};

        修改 scf 文件:

;Define new block m_text_data, place it at the beginning of the scf file
#define m_text_data_start              0x60030000
#define m_text_data_size               0x00013000;Place at the end of the scf file, as a new block of m_text_data
LR_m_data_text m_text_data_start m_text_data_size{ ER_m_data_text m_text_data_start FIXED m_text_data_size { ; load address = execution address*.o(Myapp)}
}

        添加 flexspi 操作函数文件到工程中。

        在主函数所在文件中添加:

#include "fsl_flexspi.h"
#include "app.h"
#include "fsl_cache.h"
/************************************************FlexSPI********************************************************************/
//add FlexSPI Functions
/* Program data buffer should be 4-bytes alignment, which can avoid busfault due to this memory region is configured asDevice Memory by MPU. */
SDK_ALIGN(static uint8_t s_nor_program_buffer[256], 4);
static uint8_t s_nor_read_buffer[256];extern status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
extern status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src);
extern status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);
extern status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base);
extern status_t flexspi_nor_erase_chip(FLEXSPI_Type *base);
extern void flexspi_nor_flash_init(FLEXSPI_Type *base);
/******************************************************************************** Code******************************************************************************/
flexspi_device_config_t deviceconfig = {.flexspiRootClk       = 133000000,.flashSize            = FLASH_SIZE,.CSIntervalUnit       = kFLEXSPI_CsIntervalUnit1SckCycle,.CSInterval           = 2,.CSHoldTime           = 3,.CSSetupTime          = 3,.dataValidTime        = 0,.columnspace          = 0,.enableWordAddress    = 0,.AWRSeqIndex          = 0,.AWRSeqNumber         = 0,.ARDSeqIndex          = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,.ARDSeqNumber         = 1,.AHBWriteWaitUnit     = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,.AHBWriteWaitInterval = 0,
};const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {/* Normal read mode -SDR *//* Normal read mode -SDR */[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x03, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Fast read mode - SDR */[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0B, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),/* Fast read quad mode - SDR */[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x06, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04),/* Read extend parameters */[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x81, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),/* Write Enable */[4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Erase Sector  */[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x20, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),/* Page Program - single mode */[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x02, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Page Program - quad mode */[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Read ID */[4 * NOR_CMD_LUT_SEQ_IDX_READID] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),/* Enable Quad mode */[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x01, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),/* Enter QPI mode */[4 * NOR_CMD_LUT_SEQ_IDX_ENTERQPI] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Exit QPI mode */[4 * NOR_CMD_LUT_SEQ_IDX_EXITQPI] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xF5, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),/* Read status register */[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),/* Erase whole chip */[4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
};/************************************************FlexSPI********************************************************************/uint8_t flespi_test()
{/************************************************FlexSPI********************************************************************/	uint32_t i = 0;status_t status;uint8_t vendorID = 0;flexspi_nor_flash_init(EXAMPLE_FLEXSPI);PRINTF("\r\nFLEXSPI example1 started!\r\n");/* Get vendor ID. */status = flexspi_nor_get_vendor_id(EXAMPLE_FLEXSPI, &vendorID);if (status != kStatus_Success){return status;}PRINTF("Vendor ID: 0x%x\r\n", vendorID);PRINTF("Enter quad mode 1\n");/* Enter quad mode. */status = flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI);if (status != kStatus_Success){return status;}PRINTF("Enter quad mode 2\n");for(int i = 0; i<= sizeof(_aclwip_ping_bm)/SECTOR_SIZE; i++){/* Erase sectors. */PRINTF("Erasing Serial NOR over FlexSPI...\r\n");status = flexspi_nor_flash_erase_sector(EXAMPLE_FLEXSPI, APP_BASE_ADDRESS + SECTOR_SIZE * i);if (status != kStatus_Success){PRINTF("Erase sector failure !\r\n");return -1;}}for(int j = 0; j<= sizeof(_aclwip_ping_bm)/FLASH_PAGE_SIZE; j++){if(j>sizeof(_aclwip_ping_bm)/256-1){memset(s_nor_program_buffer, 0xFFU, sizeof(s_nor_program_buffer));DCACHE_InvalidateByRange(EXAMPLE_FLEXSPI_AMBA_BASE + APP_BASE_ADDRESS + FLASH_PAGE_SIZE * j, FLASH_PAGE_SIZE);memcpy(s_nor_program_buffer, &_aclwip_ping_bm[(j)*256], sizeof(_aclwip_ping_bm)%256);}else{DCACHE_InvalidateByRange(EXAMPLE_FLEXSPI_AMBA_BASE + APP_BASE_ADDRESS + FLASH_PAGE_SIZE * j, FLASH_PAGE_SIZE);memcpy(s_nor_program_buffer, &_aclwip_ping_bm[(j)*256], sizeof(s_nor_program_buffer));}status =flexspi_nor_flash_page_program(EXAMPLE_FLEXSPI, APP_BASE_ADDRESS + FLASH_PAGE_SIZE*(j), (void *)s_nor_program_buffer);if (status != kStatus_Success){PRINTF("Page program failure !\r\n");return -1;}}return 0;
}
/************************************************FlexSPI********************************************************************/

 跳转函数代码:

/*******************************************Jump Function********************************************************/
#define APP_ADDR 0x60010000	//APP1 : 0x60010000 APP2 : 0x60030000typedef void (*pFunc)(void);volatile uint32_t AppAddr;
volatile uint32_t app_start_address;
pFunc JumpToApp;void jump_to_application(uint32_t applicationAddress)
{app_start_address = applicationAddress + 0x00002000;PRINTF("App Start Address : 0x%x\r\n",app_start_address);SCB->VTOR = app_start_address;AppAddr = *(uint32_t*)app_start_address;PRINTF("App Top of Stack : 0x%x\r\n",AppAddr);__set_MSP(AppAddr);AppAddr = *(uint32_t*)(app_start_address + 4);JumpToApp = (pFunc)AppAddr;JumpToApp();
}
/*******************************************Jump Function********************************************************/

 主函数:

/*!* @brief Main function*/
int main(void)
{char ch;/* Init board hardware. */BOARD_ConfigMPU();BOARD_InitBootPins();BOARD_InitBootClocks();BOARD_InitDebugConsole();/* Just enable the trace clock, leave coresight initialization to IDE debugger */SystemCoreClockUpdate();CLOCK_EnableClock(kCLOCK_Trace);PRINTF("hello world.\r\n");PRINTF("0x = %x\r\n",_aclwip_ping_bm[0]);flespi_test();jump_to_application(APP_ADDR);while (1){

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/233405.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL InnoDB Cluster

MySQL InnoDB Cluster 一、InnoDB Cluster 基本概述 MySQL InnoDB Cluster 为 MySQL 提供了一个完整的高可用解决方案。通过使用 MySQL Shell 提供的 AdminAPI,你可以轻松地配置和管理一组至少由3个MySQL服务器实例组成的 InnoDB 集群。 InnoDB 集群中的每个 MySQL 服务器实例…

河道水质在线监测系统:守护河流的生命力

随着工业和城市化的快速发展&#xff0c;水资源的污染问题日益严重。为了保障人民生活用水安全和生态环境的可持续发展&#xff0c;河道水质在线监测系统为守护河流的生命力提供了强有力的科技支持。 一、河道水质在线监测系统概述 河道水质在线监测系统是一种利用先进传感器、…

KaiwuDB 亮相中国国际供应链促进博览会

11月28日&#xff0c;全球首个以供应链为主题的国家级展会——2023 中国国际供应链促进博览会&#xff08;简称“链博会”&#xff09;在北京盛大召开。KaiwuDB 受邀亮相大会&#xff0c;向与会者展示现代数据库技术在数字科技链条中的根基作用&#xff0c;其中分布式多模数据库…

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档&#xff1a; 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了&#xff0c;a值还没有变1就被使用输出&#xff0…

Halcon 协同机械手进行自动标定

流程 使用相机捕捉初始标定点位&#xff0c;记录世界坐标 在机器人示教器上基于基准点位进行其余8个点位设置&#xff0c;每次x轴偏移4 或 Y轴偏移4 对每个点位进行图像获取 编写Halcon脚本&#xff0c;获取9幅图像中点位中心的像素坐标&#xff0c;以及对应算出的…

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说&#xff0c;直接上案例&#xff0c;这些都是正儿八经的真实案例&#xff0c;相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目&#xff01;摸索不出&#xff0c;也多多少少能受一些灵感上的启发。 小A是长期混B站的&#xff0c;大家称他为“B站搬运工…

vscode插件问题

1 Vscode code颜色变化 最外层标签颜色变成白色 其他标签有颜色&#xff0c;css代码颜色有些变成白色 是安装的另一个插件vue影响的&#xff0c;卸载就能恢复正常的颜色 2 配置Vue项目的代码片段 css 样式代码片段 配置css.json上后偶尔能用偶尔不能用&#xff0c;Vscode 右下…

css浮动属性学习

在此文&#xff0c; html菜单的基本制作-CSDN博客 已经看到css 浮动属性的效果&#xff1b;下面单独看一下浮动属性&#xff1b; 做4个div&#xff0c;设置不同的背景色&#xff0c;不为div添加float属性&#xff1b;效果如下&#xff1b; 因为div是块级元素&#xff0c;默认…

【Openstack Train安装】十三、创建实例

在先前的教程中&#xff0c;介绍了安装openstack及其相关组件的具体过程&#xff0c;本文介绍如何创建实例并完成访问。 在按照本教程操作之前&#xff0c;请确保完成以下配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Op…

UG\NX二次开发 创建对象属性UF_ATTR_set_user_attribute

文章作者:里海 来源网站:里海NX二次开发3000例专栏 简介 创建对象属性UF_ATTR_set_user_attribute,这是一个新函数用于替代UF_ATTR_assign,旧版本NX是用UF_ATTR_assign函数创建、更新属性值,请参照这篇文章《UG\NX二次开发 创建对象属性UF_ATTR_assign》 下面是这个新函数…

虚幻学习笔记7—蓝图接口

一、前言 蓝图接口就是可以在蓝图中实现的接口&#xff0c;有它方便的地方&#xff0c;可以很方便的调用到实现了接口的函数。 二、实现 2.1、创建一个蓝图接口 1&#xff09;可以添加多个函数。 2&#xff09;函数在蓝图接口中只能规定输入和输出参数。 只有输入参数的可以…

什么是API? (应用程序编程接口)

我们经常听到 API 这个专业名称。那么什么是 API 呢&#xff1f; 定义 API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软…