liklon 发表于 2020-4-11 18:19

基于HC32L136K8TA运行BabyOS

本帖最后由 liklon 于 2020-6-6 10:47 编辑

       BabyOS不是一个操作系统,她的定位是给裸机开发的项目一个框架,同时为使用操作系统的项目提供设备和功能库。目前这份代码还比较年轻,需要网友添加驱动和功能代码,也需要网友一起完善和优化。
       这一帖将记录在HC32L136K8TA上运行并测试BabyOS。
       代码仓库:https://gitee.com/notrynohigh/BabyOS_HDSC
      

>>>>右上角电梯直达楼层查看实验内容


[*]建立工程移植BabyOS                      >>>2楼
[*]LED闪烁实验                                 >>>4楼
[*]按键长按、短按、连击实验            >>>5楼
[*]硬件异常中断追踪实验                     >>>6楼
[*]Shell指令控制LED实验                     >>>7楼
[*]私有协议与上位机通信                     >>>8楼
[*]切换为32M系统时钟                        >>>9楼
[*]SPIFlash读写实验                            >>>11楼
[*]键值对存取实验                               >>>12楼
[*]Xmodem实验                                 >>>13楼
[*]Ymodem实验                                 >>>14楼
[*]OLED+GUI实验                              >>>15楼
[*]UTC+RTC实验                              >>>21楼
--------------------------------------------------------------------割,BabyOS代码部分更新至最新
[*]动态调参实验                                  >>>22楼
[*]文件系统使用                                  >>>23楼

liklon 发表于 2020-4-11 18:20

本帖最后由 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/>       https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/file_list.png2.准备开发环境工程模板:HC32L136_TEMPLATE_Rev1.0.0MDK pack包:HC32L136_IDE_Rev1.0.0\HC32L136_IDE_Rev1.0.0\MDK_IDEFLM文件: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引脚
https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/uart_gpio.png
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_tstcConfig;
    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);
    }
}


https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/log.png



smartpower 发表于 2020-4-11 20:10

nb~,,,

liklon 发表于 2020-4-11 20:27

LED闪烁实验
1.原理图如下https://gitee.com/notrynohigh/BabyOS_HDSC/raw/LED/doc/led_pin.png2.进行测试BabyOS提供了运行周期性任务的宏,直接使用即可不需要添加其他代码。普通IO的初始化可以先使用b_hal_gpio.c提供的配置函数完成/************************************************************LED PD5**/   
bHalGPIO_Config(B_HAL_GPIOD, B_HAL_PIN5, B_HAL_GPIO_OUTPUT, B_HAL_GPIO_NOPULL);

void TestLed()
{
   static uint8_t flag = 0;
   flag ^= 0x1;
   bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, flag);
}

int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
/************************************************************************/
   bInit();   
   while(1)
{
       bExec();
       BOS_PERIODIC_TASK(TestLog, 1000);
       BOS_PERIODIC_TASK(TestLed, 500);
}
}

3.测试结果

liklon 发表于 2020-4-11 22:22

本帖最后由 liklon 于 2020-4-12 14:53 编辑

b_mod_button实验

1.原理图如下https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/button_pin.png2.使能第三方功能模块BabyOS的b_mod_button是基于FlexibleButton开源代码完成,使用非常方便。下面这个配置界面是MDK独有的,IAR的用户就只能看看了。https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/config.png3.在b_hal.h修改按键的引脚信息根据原理图可以得知,按键的引脚是PD4,按键按下后的逻辑电平是0,所以修改HAL_B_BUTTON_GPIO的内容/**                           b_mod_button                           */
///<b_mod_button {port, pin, pressed_logic_level}
#if _FLEXIBLEBUTTON_ENABLE
#define HAL_B_BUTTON_GPIO               {{B_HAL_GPIOD, B_HAL_PIN4, 0}}
#endif

4.初始化引脚/************************************************************BUTTON PD4**/   
bHalGPIO_Config(B_HAL_GPIOD, B_HAL_PIN4, B_HAL_GPIO_INPUT, B_HAL_GPIO_NOPULL);

5.重新实现回调可以看到在b_mod_button.c有一个weak的回调函数,我们只需要在其他地方重新实现即可。那么在main.c重新定义这个回调。有按键事件后会调用这个回调,在回调中打印出按键ID、事件以及连击次数。
typedef enum
{
   FLEX_BTN_PRESS_DOWN = 0,
   FLEX_BTN_PRESS_CLICK,
   FLEX_BTN_PRESS_DOUBLE_CLICK,
   FLEX_BTN_PRESS_REPEAT_CLICK,
   FLEX_BTN_PRESS_SHORT_START,
   FLEX_BTN_PRESS_SHORT_UP,
   FLEX_BTN_PRESS_LONG_START,
   FLEX_BTN_PRESS_LONG_UP,
   FLEX_BTN_PRESS_LONG_HOLD,
   FLEX_BTN_PRESS_LONG_HOLD_UP,
   FLEX_BTN_PRESS_MAX,
   FLEX_BTN_PRESS_NONE,
} flex_button_event_t;


void bButtonCallback(void *p)
{
   flex_button_t *btn = (flex_button_t *)p;
   b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
}
6.初始化功能模块int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
/************************************************************************/
   bInit();
   bButtonInit();          ///<<<初始化BUTTON功能模块
   while(1)
{
       bExec();
//       BOS_PERIODIC_TASK(TestLog, 1000);
//       BOS_PERIODIC_TASK(TestLed, 500);
}
}
7.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/button.png


liklon 发表于 2020-4-11 22:41

本帖最后由 liklon 于 2020-4-11 22:43 编辑

b_mod_trace实验
1.使能第三方功能模块BabyOS的b_mod_trace是基于CmBacktrace开源代码完成,帮助用户快速定位产生硬件错误中断的源头。使能CmBacktrace,根据自身MCU选择内核https://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/config.png
2.修改硬件错误中断服务函数

void HardFault_Handler()
{
    bHardfaultCallback();
}


3.人为制造错误

typedef void (*pf)(void);
void TestFault()
{
    pf f = (pf)(0xffffffff);
    f();
}


4.初始化功能模块

int32_t main(void)
{
/*******************************************************************MCU Init**/   
    InitClock();
    InitGPIO();
    InitUart();
/************************************************************************/
    bInit();
    bButtonInit();
    bTraceInit("HC32L136K8TA");
    TestFault();
    while(1)
    {
      bExec();
//      BOS_PERIODIC_TASK(TestLog, 1000);
//      BOS_PERIODIC_TASK(TestLed, 500);
    }
}


5.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/trace.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/trace2.png



liklon 发表于 2020-4-12 15:43

b_mod_shell实验

1.使能第三方功能模块BabyOS的b_mod_shell是基于NR Micro Shell开源代码完成,方便用户通过指令方式操作设备使能NR Micro Shell,添加第三方文件,同时添加头文件路径https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SHELL/doc/config.png2.使能串口接收中断void InitUart()
{
   uint16_t u16Scnt = 0;
   stc_uart_config_tstcConfig;
   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   = RxIntCallback;
   stcUartIrqCb.pfnTxIrqCb   = NULL;
   stcUartIrqCb.pfnRxFEIrqCb = NULL;
   stcUartIrqCb.pfnPEIrqCb   = NULL;
   stcUartIrqCb.pfnCtsIrqCb= NULL;
   stcConfig.pstcIrqCb = &stcUartIrqCb;
   stcConfig.bTouchNvic = TRUE;
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_EnableIrq(UARTCH0,UartRxIrq);
   Uart_EnableFunc(UARTCH0,UartRx);
}


3.接收数据给Shell解析void RxIntCallback()
{
   uint8_t tmp;
   tmp = Uart_ReceiveData(UARTCH0);
   bShellParse(&tmp, 1);
}


4.添加指令及执行函数//b_mod_shell.c内增加指令led
const static_cmd_st static_cmd[] =
{
{"ls", _bShellLSCmd},
{"test", _bShellTestCmd},
{"led", _bShellLedCmd},
{"\0", NULL}
};

void _bShellLedCmd(char argc, char *argv)
{
   if(argc != 2)
{
       return;
}
   if (!strcmp("on", &argv]))
{
       bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 1);      //led on
}
   else if (!strcmp("off", &argv]))
{
       bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 0);      //led off
}
}

5.启动Shellint32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
//   TestFault();
   bShellStart();
   while(1)
{
       bExec();
//       BOS_PERIODIC_TASK(TestLog, 1000);
//       BOS_PERIODIC_TASK(TestLed, 500);
}
}


6.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SHELL/doc/shell.png


liklon 发表于 2020-4-12 20:48

b_mod_protocol实验

1.使能私有协议功能模块BabyOS提供一份私有协议以及对应的上位机软件,用户如果觉得私有协议的格式可以接受,那么可以直接使用。私有协议可以配置ID字段和长度字段的大小,以及配置是否加密数据https://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/exe.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/config.png
2.定义私有分发函数int Dispatch(uint8_t cmd, uint8_t *param, bProtoLen_t param_len)
{
   switch(cmd)
{
       case 0x1:   //上位机测试按钮发送的指令为 0x1
         bHalUartSend(B_HAL_UART_1, param, param_len);   //收到后将参数部分打印出去
         break;
       default:
         break;
}
   return 0;
}


3.定义私有协议实例Protocol_NO = bProtocolRegist(0x520, Dispatch);    //上位机软件测试按钮发送数据的接收对象ID是0X520


4.串口中断回调修改void RxIntCallback()
{
   uint8_t tmp;
   tmp = Uart_ReceiveData(UARTCH0);
   bHalUartRxIRQ_Handler(B_HAL_UART_1, tmp);//硬件抽象层获取串口接收的数据
}


5.重新定义串口空闲回调void bHalUartIdleCallback(uint8_t no, uint8_t *pbuf, uint16_t len)
{
   if(no == B_HAL_UART_1)
{
       bProtocolParse(Protocol_NO, pbuf, len);//收到的数据给Protocol解析
}
}


6.main函数内容int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   Protocol_NO = bProtocolRegist(0x520, Dispatch);
   while(1)
{
       bExec();
}
}


7.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/protocol.png


liklon 发表于 2020-4-12 21:46

使用32M系统时钟实验

1.为了115200波特率根据数据手册可以看出,使用4M的系统时钟,如果串口使用115200bps那么偏差有8%,极其不准,就选择用外部高速时钟32M吧https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/bps.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/bps2.png
2.查看时钟树https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/tree.png
3.设置时钟void InitClock()
{
   stc_sysctrl_clk_config_t stcCfg;
   
   Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
   Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);
   
   Flash_WaitCycle(FlashWaitCycle1);
   
   Sysctrl_SetXTHFreq(SysctrlXthFreq20_32MHz);

   stcCfg.enClkSrc= SysctrlClkXTH;
   stcCfg.enHClkDiv = SysctrlHclkDiv1;
   stcCfg.enPClkDiv = SysctrlPclkDiv1;
   Sysctrl_ClkInit(&stcCfg);   
   
   Sysctrl_ClkSourceEnable(SysctrlClkRCH, FALSE);
   
   
   SysTick_Config(Sysctrl_GetHClkFreq() / 1000);
}


4.串口设置为115200......
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.enRunMode = UartMode1;
stcBaud.u32Baud = 115200;
u16Scnt = Uart_CalScnt(UARTCH0,&stcBaud);
Uart_SetBaud(UARTCH0,u16Scnt);
......


5.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/32M.png


liklon 发表于 2020-4-13 20:33

工作日停更,周末继续……

liklon 发表于 2020-4-18 14:37

驱动SPIFlash实验

1.SPI初始化初始化部分主要分为3步:使能时钟、配置GPIO、配置SPIhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/pin.png关于CS脚,我们为了灵活都是配置为普通GPIO,利用软件去控制,在数据手册里面有这么个点就要特别注意了:https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/cs.png
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE);//开启时钟

/****************************************************************SPI0 PIN***/
stcGpioCfg.enDir = GpioDirOut;   
Gpio_Init(GpioPortA, GpioPin7,&stcGpioCfg);         //MOSI
Gpio_SetAfMode(GpioPortA, GpioPin7,GpioAf1);   

Gpio_Init(GpioPortA, GpioPin5,&stcGpioCfg);         //SCK
Gpio_SetAfMode(GpioPortA, GpioPin5,GpioAf1);

stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA, GpioPin6,&stcGpioCfg);         //MISO
Gpio_SetAfMode(GpioPortA, GpioPin6,GpioAf1);

bHalGPIO_Config(B_HAL_GPIOA, B_HAL_PIN4, B_HAL_GPIO_OUTPUT, B_HAL_GPIO_NOPULL);
bHalGPIO_WritePin(B_HAL_GPIOA, B_HAL_PIN4, 1);

//------------------------------------------------------------SPI0
stc_spi_config_tSPIConfig;
DDL_ZERO_STRUCT(SPIConfig);
Spi_SetCS(Spi0,TRUE);
SPIConfig.bCPHA = Spicphafirst;
SPIConfig.bCPOL = Spicpollow;
SPIConfig.bIrqEn = FALSE;
SPIConfig.bMasterMode = SpiMaster;
SPIConfig.u8BaudRate = SpiClkDiv8;
SPIConfig.pfnSpi0IrqCb = NULL;
Spi_Init(Spi0,&SPIConfig);

2.修改硬件抽象层SPI部分修改b_hal_spi.c部分内容:uint8_t bHalSPI_SendReceiveByte(uint8_t no, uint8_t dat)
{
   uint8_t tmp;
   switch(no)
{
       case B_HAL_SPI_1:
         Spi_SetCS(Spi0,FALSE);
         Spi_SendReceiveData(Spi0, dat, &tmp);
         Spi_SetCS(Spi0,TRUE);
         break;      
       case B_HAL_SPI_2:

         break;
       case B_HAL_SPI_3:

         break;
       default:
         break;
}
   return tmp;
}

3.修改b_hal.h引脚///< W25X
#define HAL_W25X_SPI                     B_HAL_SPI_1
#define HAL_W25X_CS_PORT               B_HAL_GPIOA            
#define HAL_W25X_CS_PIN                   B_HAL_PIN4


4.b_device_list.h注册设备B_DEVICE_REG(W25QXX, bW25X_Driver, "flash")


5.增加读写测试int32_t main(void)
{
   uint8_t buf;
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   //----------------------------------------------------write
   int fd = -1;
   fd = bOpen(W25QXX, BCORE_FLAG_RW);
   if(fd < 0)
{
       b_log_e("open error\r\n");
}
   bCMD_Struct_t cmd;
   cmd.param.erase.addr = 0;
   cmd.param.erase.num = 1;
   bCtl(fd, bCMD_ERASE, &cmd);          //erase
   
   bLseek(fd, 0);
   bWrite(fd, (uint8_t *)"BabyOS", 7);//write
   //-----------------------------------------------------read
   bLseek(fd, 0);
   bRead(fd, buf, 7);
   bClose(fd);
   b_log("r:%s\r\n", buf);
   while(1)
{
       bExec();
}
}

https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/spiflash.png


liklon 发表于 2020-4-18 14:54

键值对存取实验

1.配置开启KVhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/KV/doc/config.png
2.测试KVint32_t main(void)
{
   uint8_t buf;
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   if(0 > bKV_Init(W25QXX, 0, 4096 * 8, 4096))
{
       b_log_e("kv init error\r\n");
}
   
   bKV_Set("name", (uint8_t *)"BabyOS", 7);
   bKV_Get("name", buf);
   b_log("name:%s\r\n", buf);
   
   bKV_Set("name", (uint8_t *)"HC32L136", 9);
   bKV_Get("name", buf);
   b_log("name:%s\r\n", buf);
   
   while(1)
{
       bExec();
}
}


3.测试结果   https://gitee.com/notrynohigh/BabyOS_HDSC/raw/KV/doc/kv.png


liklon 发表于 2020-4-18 19:38

Xmodem实验通过按键启动传输,最后将传输的内容打印出来。1.配置开启Xmodemhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/Xmodem/doc/config.png
2.定义串口空闲回调把数据给到Xmodem功能模块解析void bHalUartIdleCallback(uint8_t no, uint8_t *pbuf, uint16_t len)
{
   if(no == B_HAL_UART_1)
{
       bXmodem128Parse(pbuf, len);
}
}
3.定义Xmodem回调及单字节发送函数void XmodemCallback(uint16_t number, uint8_t *pbuf)
{
   if(pbuf == NULL)
{
       XmodemFlag = 1;
}
   else
{
       memcpy(&XmodemBuf, pbuf, 128);
}
}

void XmodemSendByte(uint8_t c)
{
   bHalUartSend(B_HAL_UART_1, &c, 1);
}


​4.修改按键回调内容void bButtonCallback(void *p)
{
   flex_button_t *btn = (flex_button_t *)p;
   b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
   if(btn->event != FLEX_BTN_PRESS_CLICK)
{
       return;
}
   if(XmodemFlag == 0)
{
       memset(XmodemBuf, 0, sizeof(XmodemBuf));
       bXmodem128Start();
}
}

5.开始测试int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   bXmodem128Init(XmodemCallback, XmodemSendByte);
   while(1)
{
       bExec();
       if(XmodemFlag)
      {
         XmodemFlag = 0;
         bUtilDelayMS(100);
         bHalUartSend(B_HAL_UART_1, XmodemBuf, strlen((const char *)XmodemBuf));
      }
}
}


6.测试结果   https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Xmodem/doc/Xmodem.png


liklon 发表于 2020-4-18 21:11

Ymodem实验通过按键启动传输,最后将传输的内容和文件名打印出来。1.配置开启Ymodemhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/Ymodem/doc/config.png
2.定义串口空闲回调把数据给到Xmodem功能模块解析void bHalUartIdleCallback(uint8_t no, uint8_t *pbuf, uint16_t len)
{
   if(no == B_HAL_UART_1)
{
       bYmodemParse(pbuf, len);
}
}
3.定义Ymodem回调及单字节发送函数void XmodemCallback(uint8_t t, uint16_t number, uint8_t *pbuf, uint16_t len)
{
   static uint16_t index = 0;
   if(pbuf == NULL)
{
       YmodemFlag = 1;
}
   else
{
       if(t == YMODEM_FILENAME)
      {
         memcpy(YmodemName, pbuf, len);
         index = 0;
      }
       else
      {
         memcpy(&YmodemBuf, pbuf, len);
         index += len;
      }
}
}

void YmodemSendByte(uint8_t c)
{
   bHalUartSend(B_HAL_UART_1, &c, 1);
}


​4.修改按键回调内容void bButtonCallback(void *p)
{
   flex_button_t *btn = (flex_button_t *)p;
   b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
   if(btn->event != FLEX_BTN_PRESS_CLICK)
{
       return;
}
   if(YmodemFlag == 0)
{
       memset(YmodemBuf, 0, sizeof(YmodemBuf));
       memset(YmodemName, 0, sizeof(YmodemName));
       bYmodemStart();
}
}

5.开始测试int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   bYmodemInit(XmodemCallback, YmodemSendByte);
   while(1)
{
       bExec();
       if(YmodemFlag)
      {
         YmodemFlag = 0;
         bUtilDelayMS(100);
         bHalUartSend(B_HAL_UART_1, YmodemName, strlen((const char *)YmodemName));
         bHalUartSend(B_HAL_UART_1, YmodemBuf, strlen((const char *)YmodemBuf));
      }
}
}


6.测试结果   https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Ymodem/doc/Ymodem.png


liklon 发表于 2020-4-19 21:15

OLED+GUI实验OLED12864是I2C接口,使用HC32L136硬件I2C整了半天没有驱动成功,转为用BabyOS提供的模拟I2C模块(b_util_i2c.c .h)。1.配置开启GUIhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/OLED/doc/config.png
2.修改b_hal.c硬件接口///<OLED
#define HAL_OLED_I2C                   B_HAL_I2C_1
#define HAL_OLED_I2C_ADDR               0X78

3.修改硬件抽象层I2C部分int bHalI2C_MemWrite(uint8_t no, uint8_t dev_addr, uint16_t mem_addr, uint8_t *pbuf, uint16_t len)
{
   int retval = 0;
   int i = 0;
   switch(no)
{
       case B_HAL_I2C_1:
         for(i = 0;i < len;i++)
          {
               bUtilI2C_WriteData(I2C_IO_1, dev_addr, mem_addr, pbuf);
          }
         break;      
       case B_HAL_I2C_2:
         
         break;
       case B_HAL_I2C_3:

         break;      
       default:
         break;
}
   return retval;
}


​4.注册OLED设备B_DEVICE_REG(OLED, bOLED_Driver, "oled")

5.开始测试int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   bGUI_Init(OLED, -1);
   UG_PutString(0,0,"BabyOS");
   UG_PutString(0,20,"HC32L136");
   UG_DrawCircle(64, 32, 30, 0xff);
   while(1)
{
       bExec();
}
}


6.测试结果   https://gitee.com/notrynohigh/BabyOS_HDSC/raw/OLED/doc/OLED.png


wiba 发表于 2020-5-5 15:15

非常感谢楼主分享

zljiu 发表于 2020-5-5 15:15

喜欢有代码分享的

coshi 发表于 2020-5-5 15:16

太好了正需要

aoyi 发表于 2020-5-5 15:16

不错不错 能用的上

drer 发表于 2020-5-5 15:16

非常感谢楼主分享
页: [1] 2
查看完整版本: 基于HC32L136K8TA运行BabyOS