
总览
本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程。开发工具是MDK5。LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单。
LiteOS有两种移植方案:OS接管中断和非接管中断方式。接管中断的方式,是由LiteOS创建很管理中断,需要修改stm32启动文件,移植比较复杂。STM32的中断管理做的很好,用不着由LiteOS管理中断,所以我们下边的移植方案,都是非接管中断的方式的。中断的使用,跟在裸机工程时是一样的。
在target_config.h 中将 LOSCFG_PLATFORM_HWI 宏定义为 NO,即为不接管中断方式。该值默认为NO 。
移植的主要步骤如下:
1、添加内核文件

2、配置头文件

3、移除systick和pendsv中断
4、修改target_config.h
5、重定向printf函数(一般在裸机工程中就会实现)
说明:内核运行过程中会通过串口打印一些错误信息。如果日志功能开启、而又没有重定向printf函数的话,则会导致日志打印出错,程序异常卡死。之前我就是没有重定向printf函数,结果出了莫名其妙的问题,程序异常卡死在创建任务的地方。
下边我们通过新建一个裸机工程,一步步讲解如何进行移植。以下是详细过程。
一、创建裸机工程
我们这次使用的是一个STM32F103C8T6的最小系统板,板载有三个LED、一个串口。LED连接引脚为(PB5\PB6\PB7),低电平点亮;串口为USART1(PA9,PA10),采用DMA+空闲中断的方式接收数据。我们利用STM32CubeMX来生成裸机工程(STM32CubeMX的使用本文不详细描述),设置如下:
1、引脚配置
-
配置PB5\PB6\PB7为推挽输出方式;
-
配置PA9\PA10为USART1复用功能;
-
配置PA13为SWDIO功能,PA14为SWCLK功能(下载及调试)
-
使能串行调试功能


2、时钟配置

3、串口配置

4、生成代码
勾选生成对应外设驱动的‘.c/.h’文件,生成代码。
打开工程,加入LED开关状态的宏定义和串口空闲中断接收的代码,具体如下(当然,如果你不使用DMA+空闲中断的方式,也可以不进行下边2中的修改,但是一定要重定向printf函数):
1、在main.h中加入LED宏定义代码。
#define LED1_ON() HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET)
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET)
#define LED2_ON() HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_SET)
#define LED3_ON() HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET)
#define LED3_OFF() HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_SET)
2、实现串口空闲中断接收
在usart.h中加入如下代码:
#define UART1_BUFF_SIZE 256 //串口接收缓存区长度
typedef struct
{
uint8_t RxFlag; //空闲接收标记
uint16_t RxLen; //接收长度
uint8_t *RxBuff; //DMA接收缓存
}USART_RECEIVETYPE;
extern USART_RECEIVETYPE Uart1Rx;
void USART1_ReceiveIDLE(void);
void UART_SendData(USART_TypeDef * Uart,uint8_t *buff,uint16_t size);
在usart.c中加入如下代码

最低0.47元/天 解锁文章
2095

被折叠的 条评论
为什么被折叠?



