stm32F103zet6(战舰开发板v1) 移植liteOS touchGFX

刚换了工作,最近接触了一个项目,使用的是stm32低功耗系列,系统是华为的物联网 liteOS操作系统,框架为touchGFX ui框架;

由于之前接触底层较多因此就想自己移植一个liteos 以及touchgfx到自己的stm32开发板上,刚好自己也有个开发板,开发板是stm32f103zet6这款是大二买的买了就凉着了,是战舰的v1版本;

目的:想通过这个过程,让自己更深刻的理解项目的架构,底层与上层,以及底层代码的组织结构,操作系统的代码组织结构,底层代码如何和系统交互,底层如何跟框架衔接,如何跟liteos衔接等等;

从零开始首先建立裸机的工程,使用st公司的软件,不得不说这个软件太强大了,强大到你用了之后你感觉自己成了一个废人(自己做的事情太少),stm32CubeMX直接生成工程,这里不多做介绍,

1,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);
}

这样两个测试例程都已经正常运行了

这时候裸机工程验证完毕,下一步开始移植liteos操作系统;

原创文章 7 获赞 3 访问量 948

猜你喜欢

转载自blog.csdn.net/w346665682/article/details/106155613