恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Tock 对 Infineon PSC3(PSOC Control C3 Main Line)的移植支持:Cortex-M33 芯片平台初始化与板级开发指南
首页
资讯中心
/
Tock 对 Infineon PSC3(PSOC Control C3 Main Line)的移植支持:Cortex-M33 芯片平台初始化与板级开发指南
Tock 对 Infineon PSC3(PSOC Control C3 Main Line)的移植支持:Cortex-M33 芯片平台初始化与板级开发指南
发布时间:2026/10/9 1:42:55
操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载PSOC Control C3 Main LinePSC3是英飞凌Infineon推出的基于 Arm Cortex-M33 架构的微控制器Tock 为其提供了完整的芯片支持 cratechips/psc3与官方评估板支持boards/psc3m5_evk。本文以 chips/psc3/README.md 为主线结合源码深入讲解 PSC3 在 Tock 中的中断向量组织、时钟树FLL/DPLL/IHO初始化、外设驱动GPIO/SCB UART/TCPWM 定时器实现以及 PSC3M5-EVK 评估板的编译、烧录与安全配置流程。读完本文你将掌握如何理解并复用于基于 Cortex-M33 的 Tock 芯片移植工作。PSC3 芯片概览与 Tock 移植背景PSC3 是英飞凌 PSOC Control C3 系列主线的 32 位微控制器核心为 Arm Cortex-M33。在 Tock 仓库中其芯片支持位于 chips/psc3配套评估板支持位于 boards/psc3m5_evk两者互为印证前者实现芯片层面的Chiptrait 与外设驱动后者完成板级组装、链接脚本与烧录流程。官方 README 明确指出两点移植背景实现灵感来源该移植很大程度上借鉴了英飞凌 ModusToolboxMTB生成的工程。通过安装 MTB可以为 PSC3 生成演示各外设用法的参考工程从而对照验证 Tock 驱动寄存器操作的正确性。这一点在源码中也有体现例如 chips/psc3/src/chip.rs 中注释写着 “Configuration generated in MTB for SWD and Debug UART pins”即 SWD 与调试 UART 引脚配置直接取自 MTB 生成结果。调试注意事项调试过程中部分寄存器如 TCPWM0只有在对应外设上电并被时钟驱动后才能访问否则读取会异常这一点下文“调试注意事项”一节会详细说明。从 Cargo 依赖看该 crate 仅依赖cortexm33位于 arch/cortex-m33与kernel两个核心 crate见 chips/psc3/Cargo.toml遵循 Tock 芯片 crate 的标准化结构。芯片 crate 的模块组成与中断向量组织chips/psc3/src/lib.rs 是 PSC3 支持 crate 的入口采用#![no_std]并因 SRSS 寄存器宏嵌套较深而将递归限制提升到 512。它导出了以下模块模块职责chipChiptrait 实现与默认外设集合Psc3DefaultPeripheralssrss系统资源子系统时钟源、时钟路径、根时钟与电源模式配置peri/peri_clk外设总使能与外设时钟配置pwrmode/cpuss_ppu/ramc_ppu电源模式与两类 PPU处理器保护单元初始化gpio/gpio_registers/hsiom_registersGPIO 引脚驱动与 HSIOM 复用功能映射scb/scb_registers串行通信块SCB用于 UART驱动tcpwm定时器/计数器/PWMTCPWM驱动作为 Tock Alarm 时钟源flashc闪存控制器负责设置等待周期icache指令缓存使能interruptsNVIC 中断号常量定义中断向量表lib.rs定义了 16 个异常向量BASE_VECTORS复位后栈指针、initialize_ram_jump_to_main、NMI、HardFault、SVC、PendSV、SysTick 等以及 140 个外设中断向量IRQS全部初始化为CortexM33::GENERIC_ISR并通过#[link_section]分别放置到.vectors与.irqs段由链接脚本定位。140 这个数字对应 PSC3 的 NVIC 中断规模具体每个中断号的定义可在 chips/psc3/src/interrupts.rs 中查阅例如GPIO 中断IOSS_INTERRUPTS_GPIO_00到IOSS_INTERRUPTS_GPIO_99以及安全中断IOSS_INTERRUPTS_SEC_GPIO_0至_910–19SCB 串行块中断SCB_0_INTERRUPT23至SCB_5_INTERRUPT35其中 SCB333被板级用作调试 UARTTCPWM 定时器中断TCPWM_0_INTERRUPTS_076起覆盖计数器 0–3、256–263、512–519CAN-FDCANFD_0_INTERRUPTS0_099等模拟子系统SAR ADC 与 FIR 结果中断109–128、CSG DAC 中断129–137、FIFO139等。这些常量直接服务于 chips/psc3/src/chip.rs 的InterruptService分发逻辑。Chip trait 实现中断分发、休眠与系统初始化Psc3a, I结构体见 chips/psc3/src/chip.rs由三部分组成cortexm33::mpu::MPU88 区域 MPU、cortexm33::syscall::SysCall用户态/内核态边界以及InterruptService引用。其Chiptrait 实现要点service_pending_interrupts循环取出 NVIC 待处理中断交给interrupt_service.service_interrupt()未处理的中断直接 panic随后清除 pending 并重新使能保证中断不会丢失init先调用icache::sys_init_enable_cache()使能指令缓存再依次执行 NVIC 全禁用、清 pending、全使能sleep执行cortexm33::support::wfi()等待中断with_interrupts_disabled/print_state分别包装 Cortex-M33 的临界区与状态打印。中断分发由Psc3DefaultPeripherals实现GPIO 相关中断小于等于IOSS_INTERRUPTS_SEC_GPIO_9或等于IOSS_INTERRUPT_SEC_GPIO统一交给gpio.handle_interrupt()TCPWM_0_INTERRUPTS_0交给tcpwm.handle_interrupt()SCB_3_INTERRUPT交给scb3.handle_interrupt()。外设集合与三段式初始化Psc3DefaultPeripherals持有 gpio、scb3、tcpwm、peri、peri_clk、pwrmode、srss、cpuss_ppu、ramc_ppu、flashc 共 10 个外设实例。初始化分为三个阶段preinit_peripherals()先srss.sys_init_enable_clocks()激活关键根时钟再peri.sys_init_enable_peri()使能外设总线。注释强调没有这一步部分外设无法工作甚至会中断调试器连接因此必须在init()之前调用。init_system()设置闪存等待周期set_waitstates(false, 180)180 MHz 主频对应解锁看门狗以允许修改 LFCLK 寄存器wdt_unlock()初始化 PPU 并设置默认电源策略CPU 与 CPUSS 用FullRetention、RAMC 用MemoryRetention默认模式为 DEEPSLEEP随后执行完整的时钟树切换禁用 FLL → 使能 IHO → 初始化时钟路径 → 初始化低功耗 DPLL → 初始化 HF 根时钟 → 启动 FLL 并锁定。init()在系统时钟就绪后配置外设时钟peri_clk.configure_clocks()与init_peripherals()预配置 SWD/调试 UART 引脚将 SCB3 设为标准 UART 模式并使能最后初始化 TCPWM 定时器。GPIO 预配置示例SWD 与调试 UART 引脚使用gpio::PreConfig静态配置源自 MTB例如调试 UART 发送引脚 P6_3 采用DriveMode::Strong、HsiomFunction::ActiveFunctionality4接收引脚 P6_2 采用HighZ并调用make_input()SWD 时钟 P1_2 与数据 P1_3 分别为PullDown/PullUp且复用DeepSleepFunctionality5。PreConfig字段覆盖输出值、驱动模式、HSIOM 功能、中断边沿/掩码、压摆率、驱动强度、上拉寄存器使能、输入缓冲模式以及non_sec安全/非安全属性等完整定义见 chips/psc3/src/chip.rs。时钟子系统深入SRSS 与 FLL/DPLL/IHO时钟是整个 PSC3 移植的关键实现在 chips/psc3/src/srss.rsSRSS 寄存器基址为0x42200000。其初始化顺序严格遵循“先低功耗振荡器、再 PLL、最后切根时钟”的硬件约束IHO/IMOenable_iho()使能内部高频振荡器IHOinit_clock_paths()将时钟路径 1–5 的 MUX 选到 IHO、路径 6 选到 IMO低功耗 DPLLinit_dpll_lp()用两组静态DpllLpConfigDPLL0feedback_div45、reference_div6、output_div2DPLL1feedback_div60依次配置并启动两个 LP DPLLenable_dpll_lp()会轮询LOCKED状态位最长 10 ms等待锁定再切出 PLL 旁路失败则回退旁路并停用FLLinit_fll()先按SRSS_0_CLOCK_0_FLL_0_FLL_CONFIG手动配置fll_mult500、ref_div120、CCO 范围 150–200 MHz、igain9、pgain5、settling_count48使能 CCO 后轮询CCO_READY再使能 FLL 并轮询LOCKED最长 20 ms锁定后将旁路切到 FLL 输出若锁定失败则调用disable_fll()停止 FLL根时钟sys_init_enable_clocks()将根时钟 2–4 全部选到 PATH0、无分频并使能init_clk_hf()进一步配置根时钟 1–4 的 MUXPATH1/PATH0/PATH2/PATH0init_clk_hf0()将根时钟 0 选到 PATH1。由于时钟切换期间没有可用的延时定时器srss.rs使用delay_rough_us()忙等函数按 180 MHz 估算循环次数配合core::hint::black_box防止编译器优化掉循环。整个流程体现了英飞凌 TRM 中“解锁 WDT→配置时钟→锁定 PLL→切换时钟”的标准时序是复用到其他英飞凌 Cortex-M 芯片时最值得参照的部分。外设驱动要点SCB UART 与 TCPWM 定时器SCBUARTchips/psc3/src/scb.rs 的Scb实现 Tock UART HILTransmit/Receive/Configure内部用OptionalCell/TakeCell管理收发 client 与缓冲区通过INTR_TX_MASK::UART_DONE与INTR_RX_MASK::NOT_EMPTY控制中断。板级将其作为调试串口波特率 115200见 boards/psc3m5_evk/src/main.rs。TCPWMchips/psc3/src/tcpwm.rs 将 TCPWM 计数器实现为 TockAlarm/TimeHIL 时钟源寄存器布局覆盖 CTRL、STATUS、COUNTER、CC0/CC1、PERIOD、死区时间DT、预分频PS、触发与中断寄存器组支持 Tock 的虚拟 alarm 复用VirtualMuxAlarm从而支撑alarm驱动、进程控制台等上层组件。GPIOchips/psc3/src/gpio.rs 提供PsocPins与GpioPin通过preconfigure()一次性写入PreConfig板级main.rs中展示了从 P0_1 到 P9_3 十余个引脚到 Tock GPIO 驱动编号的映射注释标注了对应排针如 J5.5、J24.37 等并配置 P8_5 为用户 LED1、P5_0 为按键ActiveLow。板级支持PSC3M5-EVK 的编译、烧录与安全配置配套板 boards/psc3m5_evk/README.md 说明了完整的开发流程工具准备安装probe-rs或安装 ModusToolbox Programming Tools 中的 OpenOCD。烧录内核进入板目录后执行make flash走 OpenOCD 流程。烧录应用应用在 Tock 仓库之外out-of-tree构建先在 Makefile 中通过APP变量指定生成的 TBF 路径再执行make flash APPpath/to/app.tbf该命令会生成“内核应用”合一的 ELF可通过 gdb 与 probe-rs 部署到板卡。编译示例应用使用libtock-rs仓库中的示例例如编译 console 示例make psc3m5_evk EXAMPLEconsoleProtection Contexts保护上下文英飞凌为 PSC3 引入了名为 Protection ContextsPC的安全特性最多可创建 8 个上下文各自拥有独立的存储器访问权限。这些上下文需用edgeprotecttoolsCLI 工具配置。出厂时板卡所有上下文仅开放安全模式重置配置的步骤为cd edgeprotecttools pip install edgeprotecttools edgeprotecttools -t psoc_c3 init edgeprotecttools -t psoc_c3 provision-device -p ns_policy/policy_oem_provisioning.json其中-t psoc_c3指定目标芯片类型ns_policy/policy_oem_provisioning.json即仓库中的非安全策略文件位于 boards/psc3m5_evk/edgeprotecttools/ns_policy。故障排查若因 “ERROR : Unable to read current LCS value” 导致配置失败可用 Infineon OpenOCD 先擦除整片 Flash 再重新配置/opt/ModusToolboxProgtools-1.7/openocd/bin/openocd -f interface/kitprog3.cfg \ -c set ENABLE_ACQUIRE 0 -f target/infineon/psc3.cfg \ -c init; reset init; erase_all; shutdown edgeprotecttools -t psoc_c3 provision-device -p ns_policy/policy_oem_provisioning.json调试注意事项与官方资料对照结合 README 的 Notes 与源码移植与调试 PSC3 时需特别留意外设上电与时钟依赖TCPWM0 等寄存器只在对应外设供电并被时钟驱动时可访问。调试器下若未先执行preinit_peripherals()使能根时钟与外设总线直接读取 TCPWM0 寄存器可能导致异常或调试会话中断这也是 chip.rs 注释特别强调该步骤的原因。与 MTB 工程对照由于本移植大量参考 MTB 生成的配置时钟、PPU、GPIO 预配置等遇到寄存器行为不符时可借助 MTB 生成的 PSC3 工程逐一对比寄存器值。官方文档PSC3 的体系架构 TRM、数据手册Datasheet、寄存器参考手册Registers Reference Manual以及 psc3.svd 设备描述文件是理解本 crate 各寄存器位域定义的权威依据建议在阅读 chips/psc3/src/srss_registers.rs、chips/psc3/src/scb_registers.rs 等文件时对照查阅。小结Tock 对 PSC3 的移植是一个典型的“Cortex-M33 复杂时钟树 安全保护单元”芯片接入案例从 chips/psc3/src/lib.rs 的向量表到 chips/psc3/src/chip.rs 的三阶段外设初始化再到 chips/psc3/src/srss.rs 的 FLL/DPLL/IHO 时钟时序以及 boards/psc3m5_evk 的板级集成与 Protection Context 安全配置整条链路清晰可循。对于希望在 Tock 上适配其他 PSOC Control 系列芯片或类似英飞凌 Cortex-M33 平台的开发者这份移植即是可直接参考的范本。赞分享操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载相关推荐Tock 中 NXP LPC55S6x 芯片支持从双核 Cortex-M33 到 LPC55S69-EVK 板级移植实战Tock 中 NXP LPC55S6x 芯片支持从双核 Cortex M33 到 LPC55S69 EVK 板级移植实战 LPC55S6x 是 NXP 推出的操作系统嵌入式嵌入式OSTock 对 ESP32-C3 芯片的支持RISC-V 微控制器的安全内核移植解析Tock 对 ESP32 C3 芯片的支持RISC V 微控制器的安全内核移植解析 导读 本文围绕 chips/esp32 c3/README.md htt操作系统嵌入式嵌入式OS抖音无水印批量下载上手指南3 个常见场景配置改好就能跑抖音无水印批量下载上手指南3 个常见场景配置改好就能跑 douyin downloader 是一个免费开源的抖音批量下载工具视频、图集、合集、原声音乐都能网页爬虫CLI上一篇终极指南如何用doccano实现标注项目的版本迭代管理下一篇Linux diff 命令实战详解文件与目录差异比较的三种输出模式与全选项速查创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考