本帖最后由 liklon 于 2020-4-11 18:23 编辑
建立工程移植BabyOS
1.下载资料 <ftp://HdscCustomer:HdscGuest2019!@ftp.hdsc.com.cn/%E8%B5%84%E6%96%99%E4%B8%8B%E8%BD%BD/HC32L136_SDK/> 2.准备开发环境工程模板:HC32L136_TEMPLATE_Rev1.0.0 MDK pack包:HC32L136_IDE_Rev1.0.0\HC32L136_IDE_Rev1.0.0\MDK_IDE FLM文件:HC32L136_DDL_Rev1.2.0\HC32L136_DDL_Rev1.2.0\mcu\MDK\config 板载调试工具是CMSIS-DAP,选择对应的DEBUG方式即可。
3.添加华大提供的驱动文件路径:HC32L136_DDL_Rev1.2.0\HC32L136_DDL_Rev1.2.0\driver
4.添加BabyOS代码仓库地址:https://gitee.com/notrynohigh/BabyOS 克隆代码后将bos文件夹复制到工程目录。 bos/core/ 核心文件全部添加至工程bos/config/ 配置文件及设备列表文件,全部添加至工程 bos/driver/ 选择需要的驱动添加至工程,将b_hal.h内定义的硬件接口取消注释 bos/hal/hal/ 硬件抽象层,将需要的文件添加至工程,根据具体平台进行修改 bos/hal/utils/ 底层实用代码,全部添加至工程 bos/modules/ 功能模块,全部添加至工程 bos/thirdparty/ 第三方开源代码,将需要的添加至工程 b_hal.h内使用#include "hc32l136k8ta.h"替换#include "stm32f1xx_hal.h"
5.修改BabyOS硬件抽象层API内容首先修改b_hal_gpio.c 以及 b_hal_uart.c 具体的查看代码。
6.初始化串口0输出打印
6.1初始化PA9PA10引脚
void InitGPIO()
{
stc_gpio_config_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1);//TX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1);//RX
}
6.2初始化串口实现输出
//9600bps UartMode1
void InitUart()
{
uint16_t u16Scnt = 0;
stc_uart_config_t stcConfig;
stc_uart_irq_cb_t stcUartIrqCb;
stc_uart_multimode_t stcMulti;
stc_uart_baud_t stcBaud;
en_uart_mmdorck_t enTb8;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
stcUartIrqCb.pfnRxIrqCb = NULL;
stcUartIrqCb.pfnTxIrqCb = NULL;
stcUartIrqCb.pfnRxFEIrqCb = NULL;
stcUartIrqCb.pfnPEIrqCb = NULL;
stcUartIrqCb.pfnCtsIrqCb = NULL;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = FALSE;
if(TRUE == stcConfig.bTouchNvic)
{
EnableNvic(UART0_IRQn,IrqLevel3,TRUE);
}
stcConfig.enRunMode = UartMode1;
stcConfig.enStopBit = Uart1bit;
stcMulti.enMulti_mode = UartNormal;
Uart_SetMultiMode(UARTCH1,&stcMulti);
enTb8 = UartDataOrAddr;
Uart_SetMMDOrCk(UARTCH0,enTb8);
Uart_Init(UARTCH0, &stcConfig);
Uart_SetClkDiv(UARTCH0,Uart8Or16Div);
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.enRunMode = UartMode1;
stcBaud.u32Baud = 9600;
u16Scnt = Uart_CalScnt(UARTCH0,&stcBaud);
Uart_SetBaud(UARTCH0,u16Scnt);
Uart_ClrStatus(UARTCH0,UartRC);
Uart_EnableFunc(UARTCH0,UartRx);
}
7.初始化滴答定时器
SysTick_Config(4000); //4M主频,1ms中断
void SysTick_Handler(void)
{
bHalIncSysTick(); //调用BabyOS的计数
}
8.测试log
void TestLog()
{
b_log("BabyOS HC32L136\r\n");
}
int32_t main(void)
{
/*******************************************************************MCU Init**/
InitClock();
InitGPIO();
InitUart();
/************************************************************************/
bInit();
while(1)
{
bExec();
BOS_PERIODIC_TASK(TestLog, 1000);
}
}
|