在国产单片机上移植国产操作系统2021-10-01

最近受产能影响,S**32单片机又涨价了,再好用也用不起。不过国产的雅*力单片机,规格之高,远超s**32,他们没有M0 M3内核,直接就上M4内核。对应如下:421---stM0  415--M3  401--M4   虽然421对应M0内核,但主频达到了120MHz。他的时钟可以通过一个图形工具 进行配置成48MHz 72Mhz  ,关键是价格很便宜。

1.keiL添加:Keil.AT32F4xx_DFP.1.3.7.pack 安装包

首先,碰到第一个问题是ststick时钟和定时器定时不准确,原来我们使用的内部晶振,所以要配置成内部晶振,在雅*力官网上有类似s**32 clubmx图形配置工具来配置他的时钟树。可以配置成和s**32M3内核72M的时钟频率。

点击生成代码,生成PLL的配置文件,把他加到keill工程  并引用他的初始化

2.  打开system_at32f4xx.c文件,

找到并开启带_HSI结尾的宏定义就可以了。(_HSE结尾的就是外部晶振宏定义)在时钟树上配的多少M的频率,在下面的宏定义就要打开相应的频率。

#if defined (AT32F403xx) || defined (AT32F413xx) || \

    defined (AT32F415xx) || defined (AT32F403Axx)|| \

    defined (AT32F407xx) || defined (AT32F421xx)

/* #define SYSCLK_FREQ_HSE          HSE_VALUE */

/* #define SYSCLK_FREQ_24MHz        24000000 */

/* #define SYSCLK_FREQ_36MHz        36000000 */

/* #define SYSCLK_FREQ_48MHz        48000000 */

/* #define SYSCLK_FREQ_56MHz        56000000 */

/* #define SYSCLK_FREQ_72MHz        72000000 */

/* #define SYSCLK_FREQ_96MHz        96000000 */

/* #define SYSCLK_FREQ_108MHz       108000000 */

/* #define SYSCLK_FREQ_120MHz       120000000 */

/* #define SYSCLK_FREQ_24MHz_HSI    24000000 */

/* #define SYSCLK_FREQ_36MHz_HSI    36000000 */

/* #define SYSCLK_FREQ_48MHz_HSI    48000000 */

/* #define SYSCLK_FREQ_56MHz_HSI    56000000 */

/* #define SYSCLK_FREQ_72MHz_HSI    72000000 */

/* #define SYSCLK_FREQ_96MHz_HSI    96000000 */

/* #define SYSCLK_FREQ_108MHz_HSI   108000000 */

/* #define SYSCLK_FREQ_120MHz_HSI   120000000 */

#endif

3.时钟搞定了,就可以参考官方的Demo程序,进行BSP移植,很容易就上手写逻辑。


然后进行国产操作系统RT thread的移植

我们移植的是 Nano 版本  即内核版本  还有功能强大的标准版 号称小Linux操作系统

我们可以从官网下载安装文件,RT-Thread Nano 离线安装包下载,下载结束后双击文件进行安装

打开已经准备好的可以运行的裸机程序,将 RT-Thread 添加到工程。如下图,点击 Manage Run-Time Environment

在 Manage Rum-Time Environment 里 "Software Component" 栏找到 RTOS,Variant 栏选择 RT-Thread,然后勾选 kernel,点击 "OK" 就添加 RT-Thread 内核到工程了。

现在可以在 Project 看到 RT-Thread RTOS 已经添加进来了,展开 RTOS,可以看到添加到工程的文件:

中断与异常处理

RT-Thread 会接管异常处理函数 HardFault_Handler() 和悬挂处理函数 PendSV_Handler(),这两个函数已由 RT-Thread 实现,所以需要删除工程里中断服务例程文件中的这两个函数,避免在编译时产生重复定义。如果此时对工程进行编译,没有出现函数重复定义的错误,则不用做修改。

系统时钟配置

需要在 board.c 中实现 系统时钟配置(为 MCU、外设提供工作时钟)与 os tick  的配置 (为操作系统提供心跳 / 节拍)。

如下代码所示,用户需要在 board.c 文件中系统初始化和 OS Tick 的配置,用户需在 timer 定时器中断服务函数调用 rt_os_tick_callback function,cortex-m 架构使用 SysTick_Handler()

/* board.c *//* timer 定时器中断服务函数调用 rt_os_tick_callback function,cortex-m 架构使用 SysTick_Handler() */voidrt_os_tick_callback(void){rt_interrupt_enter();/* 进入中断时必须调用 */rt_tick_increase();/* RT-Thread 系统时钟计数 */rt_interrupt_leave();/* 退出中断时必须调用 */}/* cortex-m 架构使用 SysTick_Handler() */SysTick_Handler(){rt_os_tick_callback();}voidrt_hw_board_init(void){/*

  * TODO 1: OS Tick Configuration

  * Enable the hardware timer and call the rt_os_tick_callback function

  * periodically with the frequency RT_TICK_PER_SECOND.

  *//* 1、系统、时钟初始化 */HAL_Init();// 初始化 HAL 库SystemClock_Config();// 配置系统时钟SystemCoreClockUpdate();// 对系统时钟进行更新/* 2、OS Tick 频率配置,RT_TICK_PER_SECOND = 1000 表示 1ms 触发一次中断 */_SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND);/* Call components board initial (use INIT_BOARD_EXPORT()) */#ifdefRT_USING_COMPONENTS_INITrt_components_board_init();#endif#ifdefined(RT_USING_USER_MAIN)&&defined(RT_USING_HEAP)rt_system_heap_init(rt_heap_begin_get(),rt_heap_end_get());#endif}

上面写那么多,实际就是把裸机的初始化,拷贝到RTT的初始化, board.c文件里。

屏蔽掉报错的中断,裸机和RTT都进行了定义,必须屏蔽掉裸机的中断函数

修改和裁剪rtconfig.h中的功能,打开和关闭要用和不要用的宏定义。

修改完 编译后会有一个报错

这是因为分配空间不足,修改如下:把RAM空间改成0x8000 即可运行

然后写个点灯的小程序验证一下。

具体可以参考RTT官网 ,有非常详细的移植文档。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 最近需要在 STM32F103C8T6 上写个项目,又想跑一个小型OS,于是就选择了 RT-Thread Nano...
    tang_jia阅读 1,753评论 0 0
  • 嵌入式实时操作系统 从系统对规定时间的敏感性要求来看,实时系统可以分为硬实时系统和软实时系统。 非实时系统:超过规...
    coolguyy阅读 409评论 0 0
  • 1 准备好开发环境,Keil IDE 2 基于您的STM32F103芯片的开发板实现简单的工程,如串口打印和LED...
    大象奔跑阅读 3,680评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,055评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,885评论 0 2