本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Red

感谢有这次机会试用 PLUS-F5270 开发板,我计划在使用这个开发板实现一个 SmartSensor 项目,这个项目我放在了仓库SmartSensor。会逐渐记录开发的进度。
本篇会分为两个部分:

  1. 修改 openocd 支持链接 STAR-MC1 处理器,并提交了一个 pr 正在 reviewtarget/arm: Add support with identify STAR-MC1,在此基础上使用 stm32f1x 的 flash 驱动目前可以烧录程序到芯片的内置 flash
  2. 移植 TOS 到 PLUS-F5270

在 Linux 使用 openocd 链接 PLUS-F5270

如果需要使用 openocd 链接 STAR-MC1,需要打上这个 pr

diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index aeaeb1829..1bb37797a 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -91,6 +91,12 @@ static const struct cortex_m_part_info cortex_m_parts[] = {.arch = ARM_ARCH_V8M,.flags = CORTEX_M_F_HAS_FPV5,},
+    {
+        .partno = START_MC1_PARTNO,
+        .name = "START-MC1",
+        .arch = ARM_ARCH_V8M,
+        .flags = CORTEX_M_F_HAS_FPV5,
+    },{.partno = CORTEX_M35P_PARTNO,.name = "Cortex-M35P",
diff --git a/src/target/cortex_m.h b/src/target/cortex_m.h
index 69368a919..89dfd6669 100644
--- a/src/target/cortex_m.h
+++ b/src/target/cortex_m.h
@@ -44,6 +44,7 @@ enum cortex_m_partno {CORTEX_M0P_PARTNO  = 0xC60,CORTEX_M23_PARTNO  = 0xD20,CORTEX_M33_PARTNO  = 0xD21,
+    START_MC1_PARTNO   = 0x132,CORTEX_M35P_PARTNO = 0xD31,CORTEX_M55_PARTNO  = 0xD22,};

如果还要通过 openocd 下载程序到 flash, 还需要再打下 patch:

diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c
index 455a06a9b..8721c1278 100644
--- a/src/flash/nor/stm32f1x.c
+++ b/src/flash/nor/stm32f1x.c
@@ -761,6 +761,7 @@ static int stm32x_get_property_addr(struct target *target, struct stm32x_propertaddr->flash_size = 0x1FFFF7E0;return ERROR_OK;case CORTEX_M_PARTNO_INVALID:
+    case START_MC1_PARTNO:/* Check for GD32VF103 with RISC-V CPU */if (strcmp(target_type_name(target), "riscv") == 0&& target_address_bits(target) == 32) {
@@ -771,6 +772,12 @@ static int stm32x_get_property_addr(struct target *target, struct stm32x_propertaddr->flash_size = 0x1FFFF7E0;return ERROR_OK;}
+        else
+        {
+            addr->device_id = 0x40007080;
+            addr->flash_size = 0x1FFFE920;
+            return ERROR_OK;
+        }/* fallthrough */default:LOG_ERROR("Cannot identify target as a stm32x");
@@ -869,6 +876,7 @@ static int stm32x_probe(struct flash_bank *bank)stm32x_info->can_load_options = true;break;case 0x410: /* stm32f1x medium-density */
+    case 0x800: /* mm32f527x medium-density */page_size = 1024;stm32x_info->ppage_size = 4;max_flash_size_in_kb = 128;
@@ -882,6 +890,7 @@ static int stm32x_probe(struct flash_bank *bank)because of unexpected active hardware watchog. */switch (rev_id) {case 0x1303: /* gd32f1x0 */
+        case 0x4d4d: /* mm32f527x */stm32x_info->user_data_offset = 16;stm32x_info->option_offset = 6;max_flash_size_in_kb = 64;

还有两个 cfg 配置文件板级的 mmplus.cfg:

#adapter listsource [find interface/jlink.cfg]transport select swdadapter speed 100#jink configsource [find mm32f5270.cfg]proc mmd { pos } {if { $pos == 0 } {reset;halt;flash write_image erase TencentOS_tiny.bin 0x8000000;reset;echo "mmd down firm 2 internal flash success"} else {echo "mmd down firm 2 spi flash"}
}

和平台级的 mm32f5270.cfg:

source [find target/swj-dp.tcl]
#source [find mem_helper.tcl]if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME mm32f5270
}set FLASH_SIZE 0x40000# Allow overriding the Flash bank size
if { [info exists FLASH_SIZE] } {set _FLASH_SIZE $FLASH_SIZE
} else {# autodetect sizeset _FLASH_SIZE 0
}# ONLY use ENDIAN with targets that can change it.
if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
#set _CPUTAPID 0x1be12aeb
set _CPUTAPID 0x1aeb0015
}set _TARGETNAME $_CHIPNAME.cpu#swj_newdap $_CHIPNAME cpu -irlen 5 -ircapture 0x1 -irmask 0xf -ignore-version -expected-id $_CPUTAPID
swj_newdap $_CHIPNAME cpu -irlen 5 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
dap create $_CHIPNAME.dap -chain-position $_TARGETNAME
target create $_TARGETNAME cortex_m -dap $_CHIPNAME.dap -ap-num 0# 定义一块内存区域用来烧录程序到 flash 临时使用
# 定义一块内存区域的起始地址,在 MMU 未开启时使用
$_TARGETNAME configure -work-area-phys 0x30000000 -work-area-size 0x4000set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f1x 0x08000000 $_FLASH_SIZE 0 0 $_TARGETNAME
#flash bank $_FLASHNAME mm32f527x 0x08000000 $_FLASH_SIZE 0 0 $_TARGETNAMEproc mm32f5270_reset_init {} {# 配置 PLL 时钟# mww
}$_TARGETNAME configure -event reset-init { mm32f5270_reset_init }cortex_m reset_config sysresetreq#$CHIPNAME init

至此就可以正常连接 STAR-MC1 了

移植 TOS 到 PLUS-F5270

花费了好几天的时间完成了 TOS 在 PLUS-F5270 上的部署,移植过程中发现在执行到函数port_sched_startLDMFD SP!, {R4 - R11}这句话的时候就会进入到 HardFault.经过多番排查,定位到是ARMv8-M指令集的stack limit功能导致的。该功能具体描述是:

官方的代码在 Reset_Handler 中赋值了 msplim 和 psplim 寄存器,所以在线程调度的时候,当使用线程栈指针时,超过了 stack limit 导致系统异常。其中 psplim 是检查 thread mode 的栈指针即 psp,msplim 检查的是 handler mode 的栈指针即 msp。特别地,在异常(handler mode)中一直使用的是 msp,异常一般被当作内核态,在 thread mode 时候,会根据CONTROL.nPRIV determines whether execution in Thread mode is unprivileged确定使用的是特权还是非特权。特权使用的是 msp, 非特权则是 psp 指针。

ldr      r0, =__STACK_LIMIT
msr      msplim, r0
msr      psplim, r0

为了避免这个问题可以有多种方案:

  1. 关闭 stack limit 检查,CCR, Configuration and Control Register寄存器的 bit 10

修改该 bit 位为 1

  1. 在线程调度过程中更新 psplim,目前我看 RT-Thread 使用的是这种方法,但是这个 psplim 实际一直是 0(所以也可以认为并没有使用硬件进行 stack limit 检查).
  2. 直接设置 msplim 和 psplim 为 0

解决这个问题后,就可以正常运行 TOS 了。有关这部分移植工作,我提交了一个 prAdd support with PLUS-F5270 Board #351

【MM32F5270开发板试用】一、移植 TencentOS 到 PLUS-F5270相关推荐

  1. 【MM32F5270开发板试用】移植Google Chrome小恐龙游戏到MM32F5270

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:曾是一颗薏米 一.项目背景 在几年前,Google 给 Chrome 浏览器加了一个有趣的 ...

  2. 【MM32F5270开发板试用】快速移植STM32应用到MM32F5270(以OLED为例)

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:@#@ 本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活 ...

  3. 【MM32F5270开发板试用】播放TF卡WAV格式音乐,I2S驱动CS4344

    [MM32F5270开发板试用]播放TF卡WAV格式音乐,I2S驱动CS4344 上四篇文章: [MM32F5270开发板试用]一.依靠SPI_SD,移植FatFs文件系统 [MM32F5270开发板 ...

  4. 【MM32F5270开发板试用】 MindSDK使用测评

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:胖墩墩 一.前言: 非常感谢极术社区和灵动微电子开展的MM32F5270开发板试用申请活动 ...

  5. 【MM32F5270开发板试用】RT-Thread SPI 驱动适配指南

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:xusiwei1236 本文记录了我在社区"Rice我叫加饭?"大佬移 ...

  6. 【MM32F5270开发板试用】手势传感PAJ7620U2的智能家居应用

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:风云再起 一.序 很高兴能参加极术社区联合灵动微电子组织的[灵动MM32F5270开发板试 ...

  7. 【MM32F5270开发板试用】定制MicroPython及读取MPU6050数据到OLED1306

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:HonestQiao 前言 这次有幸获得MM32F5270开发板的试用,非常幸运. 收到板 ...

  8. 【MM32F5270开发板试用】六、如何用 星辰内核 + 国产RTOS 通过I2S播放 “星辰大海”

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:Magicoe是攻城狮 这个demo和想法是参考了大神的文章 https://aijish ...

  9. 【MM32F5270开发板试用】GPIO输入+EXTI外部中断例程demo试用

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:Zeee 前言: 首先,感谢灵动微电子与极术社区给予宝贵的试用机会.借助本次对Plus-F ...

  10. 【MM32F5270开发板试用】一、让MM32F5270支持RT-Thread~打通串口UART

    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:Magicoe是攻城狮 喜欢RT-Thread的代码10余年-,但凡有新上手的MCU必定看 ...

最新文章

  1. 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )
  2. java基础:12.7 对象流 ObjectInputStream、ObjectOutputStream
  3. html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...
  4. 愚蠢的怪胎技巧:通过命令行管理SkyDrive
  5. C++/Qt工作笔记-static_cast在connect函数中的运用
  6. 老年机按键串号_为什么老人机依然很多人在用?
  7. ios--小结系列六
  8. 4. php运行过程时序图
  9. 01. 仔细区分pointer和references
  10. 荔枝派通过usb烧录时出现ERROR: Allwinner USB FEL device not found!
  11. 北复交浙科哈航邮中上科保研之路
  12. L298N——简介及用法
  13. 常看:前端面试题搂搂
  14. 2019 秦皇岛CCPC赛后总结
  15. linux 手机互传,轻松实现Linux笔记本和手机、PDA互传文件(转)
  16. AI-常见机器学习算法介绍
  17. 鸿蒙系统桌面壁纸为什么出现条纹,vivo新系统OriginOS发布后,这些桌面就被玩坏了...
  18. 安装黑苹果时不识别内置磁盘_【让天下没有难装的黑果】3 Legacy传统BIOS使用CLOVER引导在GPT硬盘安装OSX+WIN双系统...
  19. MapReduce分布式计算和编程原理总结
  20. jenkins学习4-进docker容器安装python3环境

热门文章

  1. wps 将html转为word,用WPS快速将网页内容转换为WORD文档
  2. Windows聚焦问题修复
  3. Vue+ElementUI实现简单的用户管理系统(四):查看用户详情页及删除用户
  4. 围棋人机大战属于计算机在什么方面的应用,新华社评围棋人机大战:不怕电脑记性好 就怕爱学习...
  5. DHTMLX 使用汇总
  6. Everything必知必会搜索教程
  7. springboot图片验证码
  8. 视频教程-一小时搞定简单VBA编程 Excel宏编程快速入门-Office/WPS
  9. HTML 命名规范说明
  10. pe中怎么卸载服务器系统更新,方法四: 使用专用工具卸载系统更新补丁(和方法三类同...