- CMAKE学习
B站视频学习:CMake管理工程-上_哔哩哔哩_bilibili
CMAKE函数:SDK CMake API Reference — HPMico Software Development Kit 文档
- add_subdirectory:文件夹管理
- sdk_app_inc:添加头文件搜索路径
- sdk_app_src:添加源文件
- sdk_app_src_glob:以正则表达式方式添加源文件(*.c 直接选择所有源文件)
- sdk_compile_definitions:添加宏定义(-DUSE_MATH=1 :添加宏定义USE_MATH=1)
- sdk_compile_options:添加编译选项("-O3"开启优化等级3)
- sdk_ld_options:添加链接选项("-lm" 防止函数与头文件链接不上)
- sdk_link_libraries:添加库文件(添加自己生成的.a 或 .dll库 在IDE的设置 project - Linker -Additional Input Files能看到)
- sdk_linker_global_symbols:添加链接使用的全局变量
- sdk_raise_fatal_error_if_all_invaild:检查配置规则(FEATUREA 必须打开FEATUREA,否则报错)
- sdk_ses_compile_options:设置目标芯片架构(在IDE的设置 project - Code Generation -RISC-V 能看到)
- sdk_ses_options:预设SES配置(先在SES配置,再用记事本打开SES的项目文件,查看要配置项目的关键字是什么,通过加关键字进行修改)
#"$(OBJDUMP)" -S -d "$(OutDir)/demo$(EXE)" > "$(OutDir)/demo.asm" && "$(OBJCOPY)" -O ihex "$OutDir/demo$(EXE)" "$(OutDir)/demo.hex" 生成hex文件指令,加在IDE 的project -User Build Step -Post Build Command中
- set(FEATUREA ON):打开宏定义FEATUREA
- # 表示注释
- .yaml 文件里能看到每个板子的存储大小
- .icf 文件看空间地址分配
- Pinmux学习笔记
- 外设边上可以调整颜色
- Function可以根据外设生成引脚初始化函数
- 可以导出csv文件
- SDK GUI
视频地址:Level 1 Lesson---基础外设_哔哩哔哩_bilibili
- Launch GDB Server:启动GDB调试功能
- Program Flash:下载程序到flash
- Localize SDK for App:代码本地化(用到的所有文件复制到文件目录下)
- GCC Compile:GCC编译
- 建项目流程,代码本地化(修改cmake,将文件独立)
- 新建项目文件夹,文件夹下新建一个board和project
- board放入sdk里的板子hpm6e00,里面的yaml文件也修改,再加入hpm6e00evk.cfg文件(文件名需要统一修改);project放入相近的例程hello_world
- 打开GUI,选中所用的板子和例程,路径选择项目文件夹,点击生成
- 在CMAKEList(例程文件夹下)中添加JLINK调试选项 sdk_ses_opt_debug_connection(J-Link)
- 点击代码本地化,生成
- 修改项目设置 GDB Server的绝对路径为相对路径
- 创建完成,可以随意更换路径
- 双核学习笔记
- 文章地址:玩转MCU双核(上) 先楫HPM6000系列双核怎么玩?答案超乎你想象!-技术文章-先楫半导体
- multicore_release_cpu(); //释放core1指令函数,让core1启动
- sec_core_img.c:core1镜像文件存储位置(编译后将core1的bin文件存入该文件的数组中)
- 使用双核时,注意通用数据不建议放在cache区,可能导致数据异常,或者访问前后强制刷新cache;通用数据可以放在noncache区,使用noncache区需要初始化PMP
- 建议基于SDK的双核例程去修改,不建议手搓双核;
- core1的项目配置中 User Build Step --Post Build Command放了控制core1 bin文件的指令
D:/APP_Download/HPMicro/sdk_env_v1.7.0/tools/python3/python3.exe
../../../../../../scripts/bin2c.py
$(OutDir)/demo.bin
sec_core_img >
D:/APP_Download/HPMicro/sdk_env_v1.7.0/hpm_sdk/samples/multicore/mbx/core1/../src/sec_core_img.c
&&
"$(OBJDUMP)" -S -d "$(OutDir)/demo$(EXE)" > "$(OutDir)/demo.asm"
执行Python指令将bin文件放入core0文件的sec_core_img数组中
- 建双核流程
- 放两个core0的例程到同一个文件夹,加入multicore/common文件夹,multicore/mbx/src/sec_core_img.c文件加入core0的例程.c文件下(同时修改cmake文件)
- 生成core1项目,在core1的项目配置添加User Build Step --Post Build Command指令
- 添加宏定义 RUNNING_CORE = HPM_CORE1
- 生成core0项目,将mbx所需要的文件和函数都加进去
- 将core1的icf文件改为ram_core1(在project -- Linker -- Linker Script File中)
- core1的Debugger的Target Device改成CPU1,GDB Server的port由3333改成3334
- core1修改Code Generation的RISC-V ISA为rv32imac
- 在board.c中,需要区分好每个core所用的外设,防止外设冲突或core休眠关闭时钟
- Cache学习笔记
- cache解决CPU运算速度(816M)与内存读写速度(133M)不匹配问题(预加载和临时缓存)
- 缓存最小单位为cache line,HPM6000系列是64byte;PMA设置地址需要对齐该字节数
- Dirty:cache line的数据与Memory不一致
- Invalidate:将地址范围的数据失效,让CPU直接从Memory读取数据
- Write-back:将cache内dirty的数据写入Memory,让数据保持一致
- Non-cacheable:数据不走缓存
- L1Cache(l1c):
- l1c_dc_enable():打开cache
- l1c_dc_writeback():cache数据更新到Memory
- hpm_common.h中,ATTR_PLACE_AT_NONCACHEABLE 有宏定义,将数据放入noncacheable区域 uint8_t ATTR_PLACE_AT_NONCACHEABLE temp;
ROM API学习
- rom_xpi_nor_auto_config():根据提供的flash配置字自动配置XPI接口
- rom_xpi_nor_get_property():获取nor flash属性
- rom_xpi_nor_erase():擦除flash
- rom_xpi_nor_read():读取flash
- rom_xpi_nor_program():写入flash
- read_from_shadow():读取OTP影子寄存器的值
- read_from_ip():读取OTP的值
- program():对OTP值进行烧写(不建议使用,只有一次修改机会)
- rom_enter_bootloader():在APP中进入BootLoader程序
- board.c中,最开始位置写着对NOR FLASH的配置选项
- 先楫工具:
- HPMicro Program:好像需要在BootLoader模式下连接
- 镜像烧写
- 读取MCU OTP值