完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
刚换了工作,最近接触了一个项目,使用的是stm32低功耗系列,系统是华为的物联网 liteOS操作系统,框架为touchGFX ui框架;
由于之前接触底层较多因此就想自己移植一个liteos 以及touchgfx到自己的stm32开发板上,刚好自己也有个开发板,开发板是stm32f103zet6这款是大二买的买了就凉着了,是战舰的v1版本; 目的:想通过这个过程,让自己更深刻的理解项目的架构,底层与上层,以及底层代码的组织结构,操作系统的代码组织结构,底层代码如何和系统交互,底层如何跟框架衔接,如何跟liteos衔接等等; 从零开始首先建立裸机的工程,使用st公司的软件,不得不说这个软件太强大了,强大到你用了之后你感觉自己成了一个废人(自己做的事情太少),stm32CubeMX直接生成工程,这里不多做介绍, 一,stm32 基于hal库的裸机工程,移植liteos; 这里发现了华为liteos官网有很详细的介绍,觉得完全没必要重写,因此可以直接参考官网; 包括裸机工程的建立和liteos的移植; https://support.huaweicloud.com/bestpractice-LiteOS/zh-cn_topic_0145350106.html 使用stm32CubeMX可以建立基于hal的裸机工程,这里常用的简单分为两种,keil和iar ,我这里使用iar工程; 遇到的问题: 1,串口通信出现乱码; 这个问题浪费了我三四天时间,串口在移植完,重定向之后,操作系统的打印信息会从这个串口输出,所以相当重要,由于我的开发板比较老,当串口出现乱码的时候总以为晶振配置的有问题,然后看原理图和开发板,发现外部晶振是12m,而stm32CubeMX上外部晶振为8M,再上百度修改库文件 里的晶振;总之试了好几天一直都是乱码,最后发现是吧串口搞错了,根本晶振什么的完全不用改,就按上面链接里的来设置串口和led都是ok的;一定要搞清楚哪个串口是你用的(是的,这是比较低级的错误),也就是你设置的串口到底对应物理串口是哪个,这里我一直以为是com3,其实是com4; 2 一个需要额外设置的是stjlink调试(这里的额外是相对于华为官网的指导来说),如果不设置这个,在使用stjlink调试的时候会遇到问题导致不能调试; 3.第二个需要额外设置的用来支持串口的接收数据(中断模式),需要打开串口中断使能; 搭建裸机工程之后,编写了led和串口的中断收发测试程序功能已验证,供大家参考; led这里的led为PB5,也可以自己加PE5 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET ); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, tData, sizeof(tData), 1000); HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1); HAL_Delay(500); 串口的中断收发例程,库函数太完备,我们能做的事情太少; 只需要在主函数中打开uart1的接收中断,并重写中断回调函数; main函数中加入下面一行; HAL_UART_Receive_IT(&huart1, rData, 1); 重写中断回调函数,这里不是c++中的重载,HAL_UART_RxCpltCallback 这个函数在库中已经存在,只是被定义为弱符号,__weak,我们在main中重写,编译器链接运行将使用我们写的函数; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* 接收一个字节数据直接发出去 */ HAL_UART_Transmit(&huart1, rData, 1, 1000); /* 每次需要重新初始化接收结构体指针 */ HAL_UART_Receive_IT(&huart1, rData, 1); } 这样两个测试例程都已经正常运行了 这时候裸机工程验证完毕; 二 ,紧接着一步将printf重定向到串口1上,这一步很重要,因为当移植玩操作系统之后,操作系统的启动信息都是使用标准库中的printf打印到串口上,而printf是用putchar实现的; 由于我们只需要输出消息也就是将操作系统的信息使用printf打印出来而不需要使用scanf获取输入,基于上面串口的功能,只重定向fputc 添加uart.h ,uart.c文件如下: #ifndef __UART_H__ #define __UART_H__ #include "stdio.h" #include "stdint.h" int fputc(int ch, FILE *f); #endif #include "uart.h" #include "stdio.h" #include "stm32f1xx_hal.h" extern UART_HandleTypeDef huart1; ///重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { uint8_t p = ((uint8_t)ch); /* 发送一个字节数据到USART1 */ HAL_UART_Transmit(&huart1,&p,1, 1000); return (p); } 此函数会覆盖标准库中的fputc; 验证遇到的问题;使用Hal_DELAY()函数后遇到死循环; 需要调用HAL_IncTick()函数,代码见附件 void SysTick_Handler(void) { if (g_bSysTickStart) { osTickHandler(); } else { g_ullTickCount++; } HAL_IncTick(); } 三,最后是liteos的移植,移植过程见最上面的链接; 操作系统liteOS的主要模块包括: 任务 提供任务的创建、删除、延迟、挂起、恢复等功能,以及锁定和解锁任务调度。支持任务按优先级高低的抢占调度及同优先级时间片轮转调度。 任务同步
提供中断、定时器等功能。
提供事件、消息队列功能。
操作系统移植完成之后烧录,启动串口打印如下: 到此,liteos就在开发板中正常运行了... 工程代码见附件! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
744浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
563浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 20:06 , Processed in 1.728397 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号