Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内核学习营
【内核学习】rtthread内核移植记录-STM32F103ZET6-HAL库
发布于 2018-08-16 22:18:46 浏览:3733
订阅该版
[tocm] 移植2018年8月16日15:14记录代码移植过程,成功一步记录一步 ## 第一步 建立裸机程序使用STM32CubeMx建立一个裸机程序 ![1.png](/uploads/201808/16/220110h3bbco8orro5uokg.png) 生成MDK5工程 --- ## 第二步 参考0-bare-metal完成board.c、board.h文件 ![2.png](/uploads/201808/16/220248ipm3u3hrtbtodtok.png) 在Drivers组下添加board.c、board.h文件 ![3.png](/uploads/201808/16/220324l6bkooqkbhnhwvov.png) 实现board.c里面关于关于时钟配置、串口初始化、GPIO初始化等函数 ```c void bsp_uart_init(void) { MX_USART1_UART_Init(); } void bsp_uart_send(char c) { while ((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TXE) == RESET)); huart1.Instance->DR = c; } void bsp_led_init(void) { MX_GPIO_Init(); } void bsp_led_on(void) { HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); } void bsp_led_off(void) { HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET); } voidrt_hw_board_init() { /* HAL_Init() function is called at the beginning ofprogram after reset and before * the clock configuration. */ HAL_Init(); /* Clock Config: * System Clock : 80M * HCLK : 80M * PCLK1 : 80M * PCLK2 : 80M * SDMMC1 : 48M * USART1 : PCLK2 */ SystemClock_Config(); bsp_led_init(); bsp_uart_init(); } ``` ```c voidSystemClock_Config(void) void _Error_Handler**(char *file, int line) ``` 以上两个函数采用cubemx工具生成的函数,main函数和例程中一样 现象: ![4.png](/uploads/201808/16/220407p2qkgn2vpl2elrvr.png) --- ## 第三步 添加RT-Thread源码拷贝RT-Thread源代码到工程路径下,当然也可以不移动,就是指定路径的时候长一点,没关系添加两个新组一个叫做kernel,防止内核代码,另一个叫做CROTEX-M3放置平台相关代码,我用的是STM32F103ZET6使用的是crotex-m3内核。添加相关文件到对应的组下面,添加完如图,对了还有一个rtconfig.h文件,用于配置和裁剪内核。 ![5.png](/uploads/201808/16/220440rwr2j7dd9jyjdd52.png) ![6.png](/uploads/201808/16/220521r3aem5ll3qz5i5pz.png) ![7.png](/uploads/201808/16/220532qf0e0n55fnz527sp.png) ![8.png](/uploads/201808/16/220625gfinn9i4prif9nr9.png) 添加代码之后别忘了添加头文件,rtconfig.h文件放在了工程的根目录之下,别忘了添加头文件。在编译之后有了有符号重定义,注释掉原有的函数 ```c //void HardFault_Handler(void) //{ // /* USER CODE BEGIN HardFault_IRQn 0 */ // /* USER CODE END HardFault_IRQn 0 */ // while (1) // { // /* USER CODE BEGIN W1_HardFault_IRQn 0 */ // /* USER CODE END W1_HardFault_IRQn 0 */ // } // /* USER CODE BEGIN HardFault_IRQn 1 */ // /* USER CODE END HardFault_IRQn 1 */ //} //void PendSV_Handler(void) //{ // /* USER CODE BEGIN PendSV_IRQn 0 */ // /* USER CODE END PendSV_IRQn 0 */ // /* USER CODE BEGIN PendSV_IRQn 1 */ // /* USER CODE END PendSV_IRQn 1 */ //} ``` 编译下载正常运行 --- ## 第四步 console移植,实现控制台输出功能实现函数 ```c void rt_hw_console_output(const char *str) { RT_ASSERT(str != RT_NULL); while (*str != '\0') { if (*str == '
') { bsp_uart_send(' '); } bsp_uart_send(*str++); } } ``` 这个函数主要是实现bsp_usart_send,此函数在第二步已经实现。接下来修改SysTick_Handler函数 ```c /** * @brief This function handles System tick timer. */ void SysTick_Handler(void) { rt_interrupt_enter(); rt_tick_increase(); rt_interrupt_leave(); } ``` 注意包含rtthread.h头文件修改main函数如下 ```c int main(void) { while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ rt_kprintf("led on
"); rt_thread_delay(RT_TICK_PER_SECOND); rt_kprintf("led off
"); rt_thread_delay(RT_TICK_PER_SECOND); } /* USER CODE END 3 */ } ``` 编译下载输出如图 ![9.png](/uploads/201808/16/220727uo0k9dtmo0d8wi6i.png) --- ## 第五步 内存堆配置,实现动态内存管理功能在rt_config.h中添加宏 ``` //#define RT_USING_NOHEAP #define RT_USING_SMALL_MEM #define RT_USING_HEAP ``` 注意:注释掉`RT_USING_NOHEAP`,如果有的话在`rt_hw_board_init`函数中添加动态内存管理初始化函数 ```c void rt_hw_board_init() { static uint8_t heap_buf[10 * 1024]; ………. rt_system_heap_init(heap_buf, heap_buf + sizeof(heap_buf) - 1); } ``` **在main函数中初始化一个线程函数** ```c #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 void test_thread_entry(void *parameter) { while (1) { rt_kprintf("enter test thread
"); rt_thread_delay(RT_TICK_PER_SECOND); } } /** * @brief The application entry point. * * @retval None */ int main(void) { rt_thread_t tid; tid = rt_thread_create("test", test_thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) { rt_thread_startup(tid); return 0; } else { return -1; } } ``` 编译下载,输出如图 ![10.png](/uploads/201808/16/220801jmol9j2cn7bmto37.png) --- ## 第六步 实现Finsh Shell功能将components组件文件夹下的drivers和finsh文件添加到工程新建finsh组和DeviceDrivers组,添加文件 ![11.png](/uploads/201808/16/220845wfsy0s4f8s5lpxi0.png) 在前几步添加文件的时候在Kernel组莫名少添加了device.c文件在调试的时候浪费很长时间, 在官方的1-basic的`rt-thread\src`文件下也没有,感受到来自NPC的调戏。 添加代码之后先修改board.c文件里的rt_hw_board_init函数, ```c /** * This function will initial STM32 board. */ void rt_hw_board_init() { static uint8_t heap_buf[10 * 1024]; /* HAL_Init() function is called at the beginning of program after reset and before * the clock configuration. */ HAL_Init(); /* Clock Config: * System Clock : 80M * HCLK : 80M * PCLK1 : 80M * PCLK2 : 80M * SDMMC1 : 48M * USART1 : PCLK2 */ SystemClock_Config(); /* Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / RT_TICK_PER_SECOND); /* Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); //bsp_led_init(); stm32_hw_usart_init(); #ifdef RT_USING_CONSOLE rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif #ifdef RT_USING_HEAP rt_system_heap_init(heap_buf, heap_buf + sizeof(heap_buf) - 1); #endif #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif } ``` `stm32_hw_usart_init(); ` 用来初始化并注册串口屏蔽掉board.c文件里面串口初始化函数、串口发送函数、控制台输出函数,工作交给drv_usart.c。 接下来修改rtconfig.h中的宏定义添加`#define BSP_USING_UART1`等添加后rtconfig.h如下 ```c #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ /* Automatically generated file; DO NOT EDIT. */ /* RT-Thread Configuration */ /* RT-Thread Kernel */ #define RT_NAME_MAX 8 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 #define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_IDEL_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 256 #define RT_DEBUG /* Inter-Thread communication */ #define RT_USING_SEMAPHORE #define RT_USING_MUTEX #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE /* Memory Management */ //#define RT_USING_NOHEAP #define RT_USING_SMALL_MEM #define RT_USING_HEAP /* Kernel Device Object */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" /* RT-Thread Components */ #define RT_USING_COMPONENTS_INIT #define RT_USING_USER_MAIN #define RT_MAIN_THREAD_STACK_SIZE 2048 #define RT_MAIN_THREAD_PRIORITY 10 /* C++ features */ /* Command shell */ #define RT_USING_FINSH #define FINSH_THREAD_NAME "tshell" #define FINSH_USING_HISTORY #define FINSH_HISTORY_LINES 5 #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 #define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT #define FINSH_ARG_MAX 10 /* Device virtual file system */ /* Device Drivers */ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL /* Env config */ #define SYS_PKGS_DOWNLOAD_ACCELERATE #define BSP_USING_UART1 #endif ``` 之前mian函数中的初始化函数去掉编译下载如图 ![12.png](/uploads/201808/16/220926vi3cexuficfufunj.png) **出了问题** finsh没有跑起来,没有`msh>` 重启、没有、重启、还没有 调试了很久还是不行,之后经大神指点在rtdef.h文件如图位置添加了`RT_USED` ![13.png](/uploads/201808/16/220952nsul2r13zuy1sr2l.png) **编译下载,还是没有,不过这次是因为串口接收引脚模式配置错误,修改之后编译下载运行,** ![14.png](/uploads/201808/16/221024umoutbgg1ososv81.png) 成功运行,但是为什么要加`RT_USED`,还是不知道。 以上对了,这种移植模式值得吐槽,希望以后官方可以更加人性化一点 ## 下载附件 - [yizhi.rar](/uploads/201808/16/221608juzxyo5o9nymidsy.rar) - [移植.pdf](/uploads/201808/16/221608i807iq0ll6l7lzr7.attach)
查看更多
4
个回答
默认排序
按发布时间排序
zhang303042304
2018-08-20
这家伙很懒,什么也没写!
我通过下载你的这个工程,编译文件后出现跟我移植出现的一样的问题警告,图片是我跟你一样生成的警告。 这里我有点疑问,就是你在你开发板上面能实现tab键功能的实现吗? 我用你的代码跟我的代码在开发板都未能实现tab键。, 并且用我的代码的话, 输入ps为:pscommand not found 请问你解决这个问题有什么经验吗? 并且使用串口工具输入命令的时候,一旦输入的命令打错,并且打出删除功能的话,会成为一个错误的command? 你的会吗?
王秀峰
2018-08-20
这家伙很懒,什么也没写!
>我通过下载你的这个工程,编译文件后出现跟我移植出现的一样的问题警告,图片是我跟你一样生成的警告。 这 ... 把之前的工程下载下来编译了一下没有发现警告,我想是不是和编译器的版本有关 [attach]5615[/attach] 程序我又下载运行了一边,ps命令和tab补齐都可以使用,用tab补齐打印调用了`timer_sample_init` 用的工具是SecureCRT,不会出现退格导致命令错误 [attach]5616[/attach]
王秀峰
2018-08-20
这家伙很懒,什么也没写!
>我通过下载你的这个工程,编译文件后出现跟我移植出现的一样的问题警告,图片是我跟你一样生成的警告。 这 ... 对了,MDK版本是5.25.2.0
zhang303042304
2018-08-21
这家伙很懒,什么也没写!
>对了,MDK版本是5.25.2.0 我也怀疑是软件版本的问题: 我的版本是软件5.21,还有一个兄弟的版本是5.14版本,编译了都会出现警告,除非优化选择0,就不会警告, 还有另外一个兄弟,编译我的代码,也不会出错,应该是软件版本的差异
撰写答案
登录
注册新账号
关注者
0
被浏览
3.7k
关于作者
王秀峰
这家伙很懒,什么也没写!
提问
14
回答
26
被采纳
0
关注TA
发私信
相关问题
1
《内核学习营》+水一方+自用STM32F103VC 板RT-Thread内核移植分享
2
《内核学习营》+水一方+项目中创建标准的 RT-Thread工程
3
内核学习营+坦然+探索者stm32f407板子RT-thread循环点亮led灯
4
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口字符点灯
5
<内核学习营>+坦然+探索者stm32f407板子RT-thread的pwm点灯实验
6
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口实验
7
<内核学习营>+坦然+野火stm32f103板子RT-thread读写SD卡实验
8
<内核学习营>+坦然+探索者stm32f407板子RT-thread的RTC闹钟实验
9
【内核学习营】+王秀峰+led_rgb
10
【内核学习营】+青春+简单使用GPIO驱动LED灯闪烁
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部