【STM32F429】第5章 RL-USB移植(MDK AC6)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710
第5章 RL-USB移植(MDK AC6)
本章教程为大家讲解RL-USB协议栈的AC6编译器移植。
目录
第5章 RL-USB移植(MDK AC6)
5.1 初学者重要提示
5.2 移植RL-USB整体说明
5.3 了解RL-USB模板框架设计
5.4 第1步,安装指定的MDK软件包
5.5 第2步,准备一个工程模板
5.6 第3步,添加RL-USB并配置
5.6.1 RL-USB相关文件和驱动
5.6.2 USB的配置文件RTE_Device.h
5.6.3 RL-USB配置
5.7 第4步,修改文件includes
5.8 第5步,添加两个应用文件
5.9 第6步,创建应用任务(重要,注意启动任务)
5.10 常见移植错误总结:
5.11 使用的MicroUSB接口并注意跳线帽设置
5.12 实验例程
5.13 总结
5.1 初学者重要提示
- 学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植,因为本章节的移植要用到RTX5移植的一些操作方法:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 。
- STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,
- 本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。
5.2 移植RL-USB整体说明
移植之前,有必要对移植过程有个整体的认识:
- 第1步,准备一个RTX5工程模板。
- 第2步,移植RL-USB。
- 移植RL-USB是采用MDK的RTE环境直接添加。
- 第3步,处理HAL库时间基准等。
- 第4步,创建应用。
总的来说,这4步就可以完成移植,下面将STM32F4的移植步骤和注意事项为大家做个说明。
5.3 了解RL-USB模板框架设计
移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:
框图如下:
5.4 第1步,安装指定的MDK软件包
移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):
- CMSIS 软件包使用当前最新的:V5.7.0
- STM32H7使用当前最新的:V2.6.0
- STM32F4使用当前最新的:V2.15.0
- STM32CubeMX使用当前最新的:V6.0.x
- ARM_Compiler使用当前最新的:V1.6.3
- RTX5中间件使用当前最新的:V7.12
这些软件包的安装在STM32F4用户手册的第2章2.3小节有详细说明。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 。
- 所有这些软件包汇总下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100490 。
不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:
5.5 第2步,准备一个工程模板
首先准备好一个简单的裸机工程模板,已经为大家做好:V6-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
5.6 第3步,添加RL-USB并配置
看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。
5.6.1 RL-USB相关文件和驱动
CMSIS-Driver分组中添加USB Device驱动:
使用经典配置方式:
添加RL-USB并配置:
借助MDK RTE自动解决警告问题:
我们需要的都已经添加好,效果如下:
下面的文件隔离出来(隔离方法看RTX5教程移植章节):
5.6.2 USB的配置文件RTE_Device.h
配置使用Full USB:
5.6.3 RL-USB配置
添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。
USBD_Config_0.c文件配置:
注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:
osPriorityAboveNormal:
USBD_Config_MSC_0.h文件的配置如下:
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。
5.7 第4步,修改文件includes
添加USB头文件:#include "rl_usb.h"
#ifndef __INCLUDES_H__ #define __INCLUDES_H__/* ********************************************************************************************************* * 标准库 ********************************************************************************************************* */ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <math.h>/* ********************************************************************************************************* * 其它库 ********************************************************************************************************* *//* ********************************************************************************************************* * OS和系统库 ********************************************************************************************************* */ #include "cmsis_os2.h" #include "rl_usb.h"/* ********************************************************************************************************* * 宏定义 ********************************************************************************************************* *//* ********************************************************************************************************* * APP / BSP ********************************************************************************************************* */ #include "bsp.h"/* ********************************************************************************************************* * 变量和函数 ********************************************************************************************************* */ /* 方便RTOS里面使用 */ extern void SysTick_ISR(void);#define bsp_ProPer1ms SysTick_ISR#endif/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
5.8 第5步,添加两个应用文件
为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:
5.9 第6步,创建应用任务(重要,注意启动任务)
应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:
AppTaskUserIF任务 : 按键消息处理。
AppTaskLED任务 : LED闪烁。
AppTaskMsgPro任务 : 消息处理,暂未使用。
AppTaskStart任务 : 启动任务,也是最高优先级任务,这里实现按键扫描。
osRtxTimerThread任务: 定时器任务,暂未使用。
任务栈大小和任务控制块定义如下:
/* **********************************************************************************************************变量 ********************************************************************************************************** */ /* 任务的属性设置 */ const osThreadAttr_t ThreadStart_Attr = {/* 未使用 */ // .cb_mem = &worker_thread_tcb_1, // .cb_size = sizeof(worker_thread_tcb_1), // .stack_mem = &worker_thread_stk_1[0], // .stack_size = sizeof(worker_thread_stk_1), // .priority = osPriorityAboveNormal, // .tz_module = 0.name = "osRtxStartThread",.attr_bits = osThreadDetached, .priority = osPriorityNormal4,.stack_size = 2048, };const osThreadAttr_t ThreadMsgPro_Attr = {.name = "osRtxMsgProThread",.attr_bits = osThreadDetached, .priority = osPriorityNormal3,.stack_size = 1024, };const osThreadAttr_t ThreadLED_Attr = {.name = "osRtxLEDThread",.attr_bits = osThreadDetached, .priority = osPriorityNormal2,.stack_size = 512, };const osThreadAttr_t ThreadUserIF_Attr = {.name = "osRtxThreadUserIF",.attr_bits = osThreadDetached, .priority = osPriorityNormal1,.stack_size = 1024, };
任务创建:
/* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* HAL库,MPU,Cache,时钟等系统初始化 */System_Init();/* 内核开启前关闭HAL的时间基准 */HAL_SuspendTick();/* 内核初始化 */osKernelInitialize(); /* 创建启动任务 */ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr); /* 开启多任务 */osKernelStart();while(1); }/* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) {ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr); ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr); ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr); }
这里我们重点看下启动任务,主要做了五个工作:
- 外设初始化bsp_Init。
- 任务创建AppTaskCreate。
- 初始化USB并连接电脑。
- 需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
/* ********************************************************************************************************* * 函 数 名: AppTaskStart * 功能说明: 启动任务,这里用作BSP驱动包处理。 * 形 参: 无 * 返 回 值: 无 * 优 先 级: osPriorityHigh4 ********************************************************************************************************* */ void AppTaskStart(void *argument) {const uint16_t usFrequency = 1; /* 延迟周期 */uint32_t tick;/* 初始化外设 */HAL_ResumeTick();bsp_Init();/* 创建任务 */AppTaskCreate();USBD_Initialize(0U); /* 初始化USB设备 */USBD_Connect (0U); /* USB设备连接 *//* 获取当前时间 */tick = osKernelGetTickCount(); while(1){/* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */bsp_ProPer1ms();/* 相对延迟 */tick += usFrequency; osDelayUntil(tick);} }
5.10 常见移植错误总结:
编译后提示如下错误:error: 'Driver_USBD.h' file not found。
解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:
5.11 使用的MicroUSB接口并注意跳线帽设置
本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:
注意使用的是MicroUSB接口:
注意板子左下角跳线帽的设置:
这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。
5.12 实验例程
本章节配套了如下几个例子供大家移植参考:
- V6-4001_RTX5 Kernal Template
RTX5内核模板。
- V6-4002_RL-USB Template
RL-USB工程内核模板,使用内部RAM模拟了一个U盘。
MDK进入调试状态后,选择周期更新:
然后打开调试组件,注意和RTX4的调试组件位置不同:
然后点击MDK的全速运行,
至此,就可以动态实时查看RL-USB的运行状态:
5.13 总结
本章节为大家讲解了RL-USB 在MDK AC6上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。
【STM32F429】第5章 RL-USB移植(MDK AC6)相关推荐
- 【STM32F429】第4章 RTX5操作系统移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第4章 RTX5操作系统移植(MDK AC5) 本 ...
- 【STM32F407】第5章 RTX5操作系统移植(MDK AC6)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第5章 RTX5操作系统移植(MDK AC6) 本 ...
- 【STM32H7】第4章 RTX5操作系统移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第4章 RTX5操作系统移植(MDK AC5) 本 ...
- 【STM32F407】第4章 RTX5操作系统移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第4章 RTX5操作系统移植(MDK AC5) 本 ...
- 【STM32H7】第5章 RTX5操作系统移植(MDK AC6)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第5章 RTX5操作系统移植(MDK AC6) 本 ...
- 【STM32F429】第8章 学习USB协议栈前要了解的基础知识
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第8章 学习USB协议栈前要了解的基础知识 本章节 ...
- 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【STM32H7】第3章 ThreadX FileX移植SDIO接口SD的基础知识
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第3章 ThreadX FileX移植SDIO接 ...
- 【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
最新文章
- 深入浅出linux三剑客之sed必杀技一例
- UVA 11259 Coin Changing Again
- iOS Provisioning Portal概述
- Python 模块学习 logging(2)
- luogu P1896 [SCOI2005]互不侵犯
- 网游服务器端设计思考:心跳设计
- error: undefined reference to `_imp__glXXX@XX'
- 《程序员面试宝典》精华 面向对象部分
- postgreSQL源码分析——索引的建立与使用——GIN索引(1)
- 合伙和合作的区别是什么?
- 第5章 简易毛笔字(《Python趣味创意编程》教学视频)
- ceph对接openstack环境
- [label][responsive-web-design]网页响应测试各种尺寸的工具
- Linux如何实现自动文件同步?
- 计算机人工智能识别系统应用领域,人工智能论文3000字以上
- 视频会议及流媒体十大开源项目
- 求生之路2服务器搭建(基于LinuxGSM一键完成,完美支持8人)
- 抽奖!送一箱 GitHub 周边
- 李俊峰:碳达峰、碳中和决策不是心血来潮,2030年碳达峰不是一件特别难的事
- 常见的100个推广创意
热门文章
- 【RocketMQ】消息的存储设计
- easyui之combo控件分析
- 1024程序员节开幕,龙蜥多位技术专家参与演讲
- Floyd-傻子也能看懂的弗洛伊德算法(转)
- effective c++ 学习笔记之 Shifting from c to c++
- 计算机老是跳出usb设备无法识别,电脑一直弹出无法识别的USB设备的解决办法
- datagridview 显示红色叉_显示器促销日常数码店招首页装修PSD模板分层psd素材
- 解决 ORA-00913: too many values
- python抢票代码运行内存越来越大_50 个加速包都抢不到车票,还不如这个 Python 抢票神器...
- java返回一个布尔值_关于java:返回布尔值的方法