刚换了工做,最近接触了一个项目,使用的是stm32低功耗系列,系统是华为的物联网 liteOS操做系统,框架为touchGFX ui框架;html
因为以前接触底层较多所以就想本身移植一个liteos 以及touchgfx到本身的stm32开发板上,恰好本身也有个开发板,开发板是stm32f103zet6这款是大二买的买了就凉着了,是战舰的v1版本;c++
目的:想经过这个过程,让本身更深入的理解项目的架构,底层与上层,以及底层代码的组织结构,操做系统的代码组织结构,底层代码如何和系统交互,底层如何跟框架衔接,如何跟liteos衔接等等;架构
从零开始首先创建裸机的工程,使用st公司的软件,不得不说这个软件太强大了,强大到你用了以后你感受本身成了一个废人(本身作的事情太少),stm32CubeMX直接生成工程,这里很少作介绍,框架
1,stm32 基于hal库的裸机工程,移植liteos;函数
这里发现了华为liteos官网有很详细的介绍,以为彻底不必重写,所以能够直接参考官网;测试
包括裸机工程的创建和liteos的移植;ui
https://support.huaweicloud.com/bestpractice-LiteOS/zh-cn_topic_0145350106.htmlspa
使用stm32CubeMX能够创建基于hal的裸机工程,这里经常使用的简单分为两种,keil和iar ,我这里使用iar工程;操作系统
遇到的问题:3d
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); }
这样两个测试例程都已经正常运行了
这时候裸机工程验证完毕,下一步开始移植liteos操做系统;