打印
[其他]

基于HC32L136K8TA运行BabyOS

[复制链接]
13068|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liklon|  楼主 | 2020-4-11 18:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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/>
      
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);
    }
}







使用特权

评论回复
板凳
smartpower| | 2020-4-11 20:10 | 只看该作者
nb~,,,

使用特权

评论回复
地板
liklon|  楼主 | 2020-4-11 20:27 | 只看该作者
LED闪烁实验
1.原理图如下
  
2.进行测试
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.测试结果


使用特权

评论回复
5
liklon|  楼主 | 2020-4-11 22:22 | 只看该作者
本帖最后由 liklon 于 2020-4-12 14:53 编辑

b_mod_button实验

1.原理图如下
  
2.使能第三方功能模块
BabyOS的b_mod_button是基于FlexibleButton开源代码完成,使用非常方便。
下面这个配置界面是MDK独有的,IAR的用户就只能看看了。
3.在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.测试结果



使用特权

评论回复
6
liklon|  楼主 | 2020-4-11 22:41 | 只看该作者
本帖最后由 liklon 于 2020-4-11 22:43 编辑

b_mod_trace实验
1.使能第三方功能模块
BabyOS的b_mod_trace是基于CmBacktrace开源代码完成,帮助用户快速定位产生硬件错误中断的源头。
使能CmBacktrace,根据自身MCU选择内核

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.测试结果




使用特权

评论回复
7
liklon|  楼主 | 2020-4-12 15:43 | 只看该作者
b_mod_shell实验

1.使能第三方功能模块
BabyOS的b_mod_shell是基于NR Micro Shell开源代码完成,方便用户通过指令方式操作设备
使能NR Micro Shell,添加第三方文件,同时添加头文件路径
2.使能串口接收中断
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   = 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[argv[1]]))
  {
       bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 1);      //led on
  }
   else if (!strcmp("off", &argv[argv[1]]))
  {
       bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 0);      //led off
  }
}


5.启动Shell
int32_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.测试结果



使用特权

评论回复
评论
czjdxs 2021-9-22 17:56 回复TA
bshellstart没定义,_bShellLSCmd,_bShellTestCmd都没定义 
8
liklon|  楼主 | 2020-4-12 20:48 | 只看该作者
b_mod_protocol实验

1.使能私有协议功能模块
BabyOS提供一份私有协议以及对应的上位机软件,用户如果觉得私有协议的格式可以接受,那么可以直接使用。
私有协议可以配置ID字段和长度字段的大小,以及配置是否加密数据

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.测试结果



使用特权

评论回复
9
liklon|  楼主 | 2020-4-12 21:46 | 只看该作者
使用32M系统时钟实验

1.为了115200波特率
根据数据手册可以看出,使用4M的系统时钟,如果串口使用115200bps那么偏差有8%,极其不准,就选择用外部高速时钟32M吧

2.查看时钟树

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.测试结果



使用特权

评论回复
10
liklon|  楼主 | 2020-4-13 20:33 | 只看该作者
工作日停更,周末继续……

使用特权

评论回复
11
liklon|  楼主 | 2020-4-18 14:37 | 只看该作者
驱动SPIFlash实验

1.SPI初始化
初始化部分主要分为3步:使能时钟、配置GPIO、配置SPI
关于CS脚,我们为了灵活都是配置为普通GPIO,利用软件去控制,在数据手册里面有这么个点就要特别注意了:

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_t  SPIConfig;
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[16];
/*******************************************************************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();
  }
}





使用特权

评论回复
12
liklon|  楼主 | 2020-4-18 14:54 | 只看该作者
键值对存取实验

1.配置开启KV

2.测试KV
int32_t main(void)
{
   uint8_t buf[16];
/*******************************************************************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.测试结果   



使用特权

评论回复
13
liklon|  楼主 | 2020-4-18 19:38 | 只看该作者
Xmodem实验
通过按键启动传输,最后将传输的内容打印出来。
1.配置开启Xmodem

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[number * 128], 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.测试结果   



使用特权

评论回复
14
liklon|  楼主 | 2020-4-18 21:11 | 只看该作者
Ymodem实验
通过按键启动传输,最后将传输的内容和文件名打印出来。
1.配置开启Ymodem

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[index], 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.测试结果   



使用特权

评论回复
15
liklon|  楼主 | 2020-4-19 21:15 | 只看该作者
OLED+GUI实验
OLED12864是I2C接口,使用HC32L136硬件I2C整了半天没有驱动成功,转为用BabyOS提供的模拟I2C模块(b_util_i2c.c .h)。
1.配置开启GUI

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[i]);
          }
           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.测试结果   



使用特权

评论回复
16
wiba| | 2020-5-5 15:15 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
17
zljiu| | 2020-5-5 15:15 | 只看该作者
喜欢有代码分享的

使用特权

评论回复
18
coshi| | 2020-5-5 15:16 | 只看该作者
太好了  正需要

使用特权

评论回复
19
aoyi| | 2020-5-5 15:16 | 只看该作者
不错不错 能用的上

使用特权

评论回复
20
drer| | 2020-5-5 15:16 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

50

帖子

1

粉丝