首页/新闻资讯/正文详情

Allwinner Tina(F1C100s/F1C200s)ARM9 平台 RT-Thread 板级支持包实战指南:编译、烧写与驱动适配

发布时间:2026/9/23 10:08:05 来源:云帆数科 栏目:资讯中心
Allwinner Tina(F1C100s/F1C200s)ARM9 平台 RT-Thread 板级支持包实战指南:编译、烧写与驱动适配
Allwinner TinaF1C100s/F1C200sARM9 平台 RT-Thread 板级支持包实战指南编译、烧写与驱动适配【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread本篇技术指南以 RT-Thread 仓库中 bsp/allwinner_tina/README.md 为核心系统讲解全志AllwinnerTina 系列 ARM9 SoC 上运行 RT-Thread 的完整流程涵盖硬件特性、开发环境搭建、基于 scons 的工程编译、基于 sunxi-fel 的 USB 烧写与运行验证并结合仓库内的驱动源码深入解析 UART、GPIO、时钟、MMU 等外设的适配实现。读完本文你将能够独立完成从源码拉取到板级运行的完整闭环并理解 Tina 平台板级支持包BSP的底层代码组织方式。1. 硬件平台概览Tina SoC 的核心特性Allwinner Tina 是全志科技推出的基于 ARM9 内核的 SoC 系列典型芯片包括 F1C100s / F1C200s 等它以极低的成本集成 CPU、DDR 内存与丰富的片内外设常用于低成本多媒体与物联网应用场景。该板级支持包对应的核心硬件特性如下表所示| 硬件 | 描述 | | -- | -- | | 芯片型号 | tina 系列 | | CPU | ARM9arm926ej-s 内核 | | 主频 | 408MHz | | 片内 DDR | 32MB | | 板载 SPI Nor Flash | 8/16MB |从仓库的编译配置中可以进一步印证上述参数bsp/allwinner_tina/rtconfig.py 中明确设置了ARCH arm、CPU arm9并在编译选项中使用-mcpuarm926ej-sbsp/allwinner_tina/drivers/board.h 将堆区终点定义为0x80000000 32 * 1024 * 1024即 0x80000000 起 32MB 的内存映射空间与片内 DDR 32MB的规格一一对应。在运行时芯片的主频与总线时钟可以从 bsp/allwinner_tina/applications/main.c 中看到实际输出逻辑main函数会依次打印periph_get_pll_clk、cpu_get_clk、ahb_get_clk、apb_get_clk四个时钟频率值。底层时钟计算实现在 bsp/allwinner_tina/drivers/drv_clock.c例如cpu_get_pll_clk()通过读取 CCU时钟控制单元的pll_cpu_ctrl寄存器解析 PLL 的分频因子 N、K、M、P按公式(24MHz * n * k) / (m * p)计算 CPU PLL 实际频率24MHz 为片上晶振基准频率。2. 开发环境准备2.1 环境要求环境说明PC 操作系统Linux/MacOS编译器arm-none-eabi-gcc version 6.3.1 20170620 (release)构建工具scons注意本文档涉及的烧写工具链sunxi-fel、tina-spl 引导编译当前仅支持 Linux/MacOS 环境请在 Linux/MacOS 下完成烧写操作。2.2 下载源码git clone https://github.com/RT-Thread/rt-thread.git2.3 配置工程并准备 env 环境首先下载并安装 RT-Thread 的 env 工具然后进入本板级支持包目录执行以下命令设置 RT-Thread 操作系统的开发环境cd rt-thread/bsp/allwinner_tina scons --menuconfig source ~/.env/env.sh pkgs --upgrade其中scons --menuconfig会基于 Kconfig 菜单树生成/更新 bsp/allwinner_tina/rtconfig.h。本 BSP 的菜单配置由 bsp/allwinner_tina/Kconfig 定义它声明了SOC_TINA符号默认使能并自动选中ARCH_ARM_ARM9、RT_USING_CACHE、RT_USING_COMPONENTS_INIT、RT_USING_USER_MAIN同时通过source $(BSP_DIR)/drivers/Kconfig引入驱动级配置项。驱动级菜单定义在 bsp/allwinner_tina/drivers/Kconfig各外设开关与默认值如下配置项含义依赖/联动默认值TINA_USING_UART0使能 UART0自动选中RT_USING_SERIALnTINA_USING_UART1使能 UART1自动选中RT_USING_SERIALyTINA_USING_UART2使能 UART2自动选中RT_USING_SERIALyTINA_USING_SDIO0使能 SDIO0自动选中RT_USING_SDIOyTINA_USING_SPI0使能 SPI0自动选中RT_USING_SPIyTINA_USING_SPI1使能 SPI1自动选中RT_USING_SPIyTINA_USING_SPI_FLASH使能板载 SPI Nor Flash自动选中TINA_USING_SPI0、RT_USING_SFUDy2.4 编译安装下载工具烧写阶段需要 sunxi-tools 提供的sunxi-fel工具需要基于 f1c100s 分支构建pushd /tmp git clone https://github.com/Icenowy/sunxi-tools.git pushd sunxi-tools git checkout -b f1c100s origin/f1c100s make sudo make install popd popd3. 编译 RT-Thread 内核在bsp/allwinner_tina目录下执行scons如果编译正确无误会在当前目录产生rtthread.elf与rtthread.bin两个文件。其中rtthread.bin是需要烧写到设备中进行运行的映像文件。从构建脚本 bsp/allwinner_tina/rtconfig.py 可以看到编译链路的完整细节工具链前缀为arm-none-eabi-gcc/g/ar/objcopy/objdump可通过环境变量RTT_EXEC_PATH覆盖工具链路径CPU 编译选项为-mcpuarm926ej-s -ffunction-sections -fdata-sections链接选项使用-nostartfiles ... -T link.lds即链接脚本为 bsp/allwinner_tina/link.ldsPOST_ACTION通过objcopy -O binary从 ELF 生成rtthread.bin并通过arm-none-eabi-size输出映像大小。bsp/allwinner_tina/link.lds 将代码段起始地址固定在0x80000000即 32MB DDR 的起始地址这与后文 sunxi-fel 将内核映像加载到0x80000000的操作完全对应脚本中还通过KEEP(*(SORT(.rti_fn*)))保留了 RT-Thread 组件自动初始化所需的rti_fn段以及 finsh 符号表段FSymTab/VSymTab保证 MSH 命令行能够正常导出命令。4. 烧写与执行烧写工具目前仅支持 Linux/MacOS 环境请在 Linux/MacOS 环境下进行烧写操作。当正确编译产生出rtthread.bin映像文件后可以使用下面的方式烧写到设备中。4.1 编译初始化引导文件Tina 平台没有内置 BootROM 可直接引导 RT-Thread 内核需要先编译一个引导文件tina-spl该步骤依赖 arm-eabi-gccpushd ../../.. git clone https://github.com/lymzzyh/tina-spl.git pushd tina-spl make cp output/f1c100s.bin ../rt-thread/bsp/tina/tina-spl.bin popd popd说明原 README 中的复制目标路径为历史目录名bsp/tina在当前仓库中该 BSP 的目录名已更名为bsp/allwinner_tina实际操作时应将output/f1c100s.bin复制到bsp/allwinner_tina/tina-spl.bin再结合 sunxi-fel 使用。4.2 进入 FEL 模式并下载运行烧写前需要先将芯片置于 FEL 下载模式操作步骤如下短接 flash 1、4 脚当 flash 中无可引导代码时无需此步骤连接 USB松开短接的引脚输入下列指令sudo sunxi-fel -p write 0x00000000 tina-spl.bin sudo sunxi-fel exec 0x00000000 sudo sunxi-fel -p write 0x80000000 rtthread.bin sudo sunxi-fel exec 0x80000000命令含义说明sunxi-fel -p write 0x00000000 tina-spl.bin将引导文件写入内存地址 0x00000000SRAM 起始-p参数显示写入进度sunxi-fel exec 0x00000000跳转到 0x00000000 执行引导代码初始化 DDR 内存sunxi-fel -p write 0x80000000 rtthread.binDDR 初始化完成后将 RT-Thread 内核映像写入 DDR 起始地址 0x80000000与 bsp/allwinner_tina/link.lds 的链接地址一致sunxi-fel exec 0x80000000跳转到内核入口执行。4.3 运行结果如果编译与烧写无误会在串口 0 上看到 RT-Thread 的启动 logo 信息以下为 README 记录的示例输出实际版本号与构建日期以当前构建产物为准\ | / - RT - Thread Operating System / | \ 3.0.2 build Feb 8 2018 2006 - 2017 Copyright by rt-thread team periph_get_pll_clk:600000000 cpu_get_clk:408000000 ahb_get_clk:200000000 apb_get_clk:100000000 msh /输出的时钟信息直接来自 bsp/allwinner_tina/applications/main.c 的打印逻辑外设 PLL 时钟 600MHz、CPU 主频 408MHz、AHB 总线 200MHz、APB 总线 100MHz。控制台默认设备为uart0这一点在 bsp/allwinner_tina/rtconfig.h 中通过RT_CONSOLE_DEVICE_NAME uart0配置。最后出现的msh /表明 MSHModule Shell命令行已正常启动用户可以直接在串口终端输入 RT-Thread 命令进行交互。5. 驱动支持情况与源码实现解析本板级支持包当前已实现的驱动支持情况及计划如下驱动支持情况备注UART支持UART0/1/2GPIO支持/clock支持/mmu支持/从仓库目录结构bsp/allwinner_tina/drivers可以看到各驱动的实现文件下面逐一说明其底层实现要点5.1 UART 驱动drv_uart.cbsp/allwinner_tina/drivers/drv_uart.c 实现了完整的串口驱动通过rt_hw_serial_register将 uart0/uart1/uart2 注册为 RT-Thread 标准串口设备。其关键实现包括波特率配置在uart_configure()中通过 APB 时钟计算分频值val apb_get_clk() / 16 / serial-config.baud_rate写入 UART 的 DLL/DLH 寄存器默认波特率为 115200-8-N-1收发路径uart_putc()轮询 UART_USR 状态寄存器确认发送 FIFO 可写后写入 THR 寄存器uart_getc()检测接收数据可用标志后从 RHB 寄存器读取数据中断接收uart_irq_handler()在 RX 中断时调用rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND)配合 bsp/allwinner_tina/rtconfig.h 中RT_USING_SERIAL、RT_USING_SERIAL_V1配置工作引脚复用配置串口前会调用gpio_set_func()完成对应引脚的 IO 功能复用设置见下文 IO 映射。5.2 时钟驱动drv_clock.cbsp/allwinner_tina/drivers/drv_clock.c 实现 CCUClock Control Unit的时钟树解析提供cpu_get_pll_clk()、audio_get_pll_clk()、video_get_pll_clk()等 PLL 频率查询函数以及cpu_get_clk()、ahb_get_clk()、apb_get_clk()、periph_get_pll_clk()等总线时钟查询函数。它们通过读取 CCU 寄存器中的分频/倍频因子以 24MHz 晶振为基准计算实际频率同时bus_gate_clk_enalbe()/bus_software_reset_enalbe()等函数负责外设时钟门控与软复位被 UART 等驱动的初始化流程调用。5.3 GPIO 与板级初始化drv_gpio.c / board.cbsp/allwinner_tina/drivers/drv_gpio.c 提供gpio_set_func()引脚功能复用、GPIO 读写等底层操作供 UART、SPI 等驱动复用引脚时调用bsp/allwinner_tina/drivers/board.c 实现rt_hw_board_init()完成系统启动的板级初始化先初始化 MMU 页表mmu_init()通过rt_hw_mmu_init设置 0x80000000 起始 32MB 内存为可缓存可缓冲属性再初始化中断控制器、堆内存系统堆区为__bss_end到 0x8000000032MB见 bsp/allwinner_tina/drivers/board.h、串口与控制台最后配置系统节拍定时器os_clock_init()基于 0x01C20C00 地址段的 TIMER0以0xB71B00 / RT_TICK_PER_SECOND作为重装载值每 tick 调用rt_tick_increase()推进内核时钟并在中断中清除定时器标志。5.4 其他外设SPI / SDIObsp/allwinner_tina/drivers/spi 目录包含 SPI 总线驱动drv_spi.c/drv_spi.h与 SPI Nor Flash 驱动drv_spi_flash.c。结合 bsp/allwinner_tina/rtconfig.h 中的RT_USING_SPI、RT_USING_SFUD、RT_SFUD_SPI_MAX_HZ 50000000SPI 最高 50MHz等配置板载 8/16MB SPI Nor Flash 可通过 SFUD 组件挂载为块设备并配合RT_USING_DFS、RT_USING_DFS_ELMFATFAT 文件系统与RT_USING_BLK块设备分区实现文件系统支持bsp/allwinner_tina/drivers/drv_sdio.c 实现 SDIO0 控制器驱动配合RT_USING_SDIO、RT_MMCSD_MAX_PARTITION 16配置支持 SD/TF 卡读写。6. IO 在板级支持包中的映射情况板载各串口在 BSP 中的引脚复用映射关系如下| IO 号 | 板级包中的定义 | | -- | -- | | PE8 | USART2 RX | | PE7 | USART2 TX | | PA3 | USART1 RX | | PA2 | USART1 TX | | PE1 | USART0 TX | | PE0 | USART0 RX |上述映射可以在 bsp/allwinner_tina/drivers/drv_uart.c 的设备注册代码中找到对应实现UART0gpio_rx_pin GPIO_PIN_0、gpio_tx_pin GPIO_PIN_1端口为GPIO_PORT_E复用功能IO_FUN_4UART1gpio_rx_pin GPIO_PIN_2、gpio_tx_pin GPIO_PIN_3端口为GPIO_PORT_A复用功能IO_FUN_4UART2gpio_rx_pin GPIO_PIN_8、gpio_tx_pin GPIO_PIN_7端口为GPIO_PORT_E复用功能IO_FUN_2。在驱动初始化阶段uart_configure()会对每个串口依次调用gpio_set_func()完成 RX/TX 引脚的复用切换再开启对应 UART 的时钟门控并做软复位随后配置 FIFO、波特率分频与中断使能。7. 内核与组件配置速览bsp/allwinner_tina/rtconfig.h 是本 BSP 经过 menuconfig 生成的最终配置其中与本平台直接相关的关键配置包括架构相关ARCH_ARM、ARCH_ARM_ARM9、RT_USING_CACHE使能 Cache、SOC_TINA外设开关TINA_USING_UART0、TINA_USING_UART2、TINA_USING_SDIO0、TINA_USING_SPI0、TINA_USING_SPI1、TINA_USING_SPI_FLASH内核基础RT_TICK_PER_SECOND 100每秒 100 个 tick即 10ms 一个系统时钟节拍、RT_NAME_MAX 12、线程优先级数RT_THREAD_PRIORITY_MAX 32、堆管理使用RT_USING_SMALL_MEM_AS_HEAP控制台与命令行RT_USING_CONSOLE、RT_CONSOLE_DEVICE_NAME uart0、RT_USING_MSH、FINSH_THREAD_STACK_SIZE 4096存储相关RT_USING_DFS、RT_USING_DFS_ELMFATFAT 文件系统、RT_USING_SFUD、RT_USING_BLK、RT_BLK_PARTITION_EFI。需要调整外设开关时只需在bsp/allwinner_tina目录下重新执行scons --menuconfig在 Device Drivers 菜单中勾选/取消对应的TINA_USING_*项保存后重新编译即可。8. 联系人信息该板级支持包的维护人为 lymzzyh联系方式lymzfoxmail.com。如有平台适配或驱动方面的问题可向维护人反馈。【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

阿里云ROS Terraform托管服务:企业级IaC运行时底座
阿里云ROS Terraform托管服务:企业级IaC运行时底座

1. ROS Terraform 托管服务不是“ROS机器人操作系统”的缩写,而是阿里云资源编排服务(Resource Orchestration Service)的官方命名刚看到标题里“ROS Terraform”这个组合,很多刚接触云基础设施的同学第一反应是:“ROS… · 2026/9/23 10:07:45

Vue2核心特性与实战优化全解析
Vue2核心特性与实战优化全解析

1. Vue2 核心特性解析Vue2作为前端开发的主流框架之一,其响应式系统和组件化设计彻底改变了传统DOM操作方式。我使用Vue2开发过十几个中大型项目后,发现新手最容易混淆的就是其核心特性之间的关联性。这里先拆解三个最关键的底层机制:响应式原… · 2026/9/23 10:07:45

亚远景-ASPICE 评估实践:VAL.1 确认,别把确认活动等同于系统测试
亚远景-ASPICE 评估实践:VAL.1 确认,别把确认活动等同于系统测试

ASPICE SYS.5 系统验证,主要用来核对系统产出物能不能满足系统需求文档写出来的内容。ASPICE VAL.1 确认的目标,是确认产品在实际预期使用条件下,可以满足利益相关方的真实期望,重点面向用户使用场景、运行设计域 ODD。很多项目做… · 2026/9/23 10:07:38

ThinkPHP5架构与核心原理:从MVC到依赖注入、中间件的深度解析
ThinkPHP5架构与核心原理:从MVC到依赖注入、中间件的深度解析

引子:为什么面试官总爱问TP5的架构?近几年PHP面试题里,ThinkPHP 5(简称TP5)的架构和底层原理出现频率一直居高不下,哪怕新项目已经转向TP6、Hyperf甚至Go,TP5依然是很多团队遗留项目的底子。这个… · 2026/9/23 10:53:05

刘馨保姆级教程:3步搞定HTTP协议底层实战
刘馨保姆级教程:3步搞定HTTP协议底层实战

刘馨保姆级教程:3步搞定HTTP协议底层实战 官方文档太厚翻不动?别急。 刘馨这套保姆级教程,专治各种“看不懂”。 直接上代码,带你从零搭建一个符合 RFC 规范的 HTTP 服务器。 项目目标:别只背概念,要能跑通… · 2026/9/23 10:52:59

个人健康保险费用预测:从线性回归到XGBoost的实战解析
个人健康保险费用预测:从线性回归到XGBoost的实战解析

简介:面向机器学习与数据分析学习者,这套个人健康保险费用预测实战包,围绕个人健康保险费用数据集,完成从EDA探索、统计检验、特征工程到回归建模的完整流程。压缩包约58KB,共22个文件,含20个Python源代码脚… · 2026/9/23 10:52:59

Pointwise图解原理:3步搞定配置,避开80%的坑
Pointwise图解原理:3步搞定配置,避开80%的坑

Pointwise图解原理:3步搞定配置,避开80%的坑 刚接手新项目,想搭个Pointwise评测环境?别笑,我见过太多人在这一步卡了整整半天。 Python版本冲突、依赖包装不上、配置项看不懂,光看官方文档都能让人头大。其实,… · 2026/9/23 10:52:59

cytoscape.js 集合操作详解:eles.union() 合并元素集合的用法与底层实现
cytoscape.js 集合操作详解:eles.union() 合并元素集合的用法与底层实现

cytoscape.js 集合操作详解:eles.union() 合并元素集合的用法与底层实现 【免费下载链接】cytoscape.js Graph theory (network) library for visualisation and analysis 项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js 本篇技术指南聚焦 cytos… · 2026/9/23 10:52:52

前端改错图解原理:5步搞定Stack Trace
前端改错图解原理:5步搞定Stack Trace

前端改错图解原理:5步搞定Stack Trace 刚毕业接老代码,Console 里飘着满屏红色的 Error,StackTrace 长得像天书。 别慌,别复制粘贴去搜,那只会让你更晕。 咱们得用图解原理把堆栈拆开,像剥洋葱一样找到病灶。… · 2026/9/23 10:52:52

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码