[其他] 基于HC32L136K8TA运行BabyOS

[复制链接]
 楼主| 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引脚

  1. void InitGPIO()
  2. {
  3.     stc_gpio_config_t stcGpioCfg;
  4.     DDL_ZERO_STRUCT(stcGpioCfg);
  5.     stcGpioCfg.enDir = GpioDirOut;
  6.     Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
  7.     Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1);//TX
  8.     stcGpioCfg.enDir = GpioDirIn;
  9.     Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
  10.     Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1);//RX
  11. }

6.2初始化串口实现输出

  1. //9600bps UartMode1
  2. void InitUart()
  3. {
  4.     uint16_t u16Scnt = 0;
  5.     stc_uart_config_t  stcConfig;
  6.     stc_uart_irq_cb_t stcUartIrqCb;
  7.     stc_uart_multimode_t stcMulti;
  8.     stc_uart_baud_t stcBaud;
  9.    
  10.     en_uart_mmdorck_t enTb8;

  11.     DDL_ZERO_STRUCT(stcConfig);
  12.     DDL_ZERO_STRUCT(stcUartIrqCb);
  13.     DDL_ZERO_STRUCT(stcMulti);
  14.     DDL_ZERO_STRUCT(stcBaud);
  15.     stcUartIrqCb.pfnRxIrqCb   = NULL;
  16.     stcUartIrqCb.pfnTxIrqCb   = NULL;
  17.     stcUartIrqCb.pfnRxFEIrqCb = NULL;
  18.     stcUartIrqCb.pfnPEIrqCb   = NULL;
  19.     stcUartIrqCb.pfnCtsIrqCb  = NULL;
  20.     stcConfig.pstcIrqCb = &stcUartIrqCb;
  21.     stcConfig.bTouchNvic = FALSE;
  22.     if(TRUE == stcConfig.bTouchNvic)
  23.     {
  24.         EnableNvic(UART0_IRQn,IrqLevel3,TRUE);
  25.     }

  26.     stcConfig.enRunMode = UartMode1;
  27.     stcConfig.enStopBit = Uart1bit;

  28.     stcMulti.enMulti_mode = UartNormal;
  29.     Uart_SetMultiMode(UARTCH1,&stcMulti);
  30.     enTb8 = UartDataOrAddr;
  31.     Uart_SetMMDOrCk(UARTCH0,enTb8);
  32.     Uart_Init(UARTCH0, &stcConfig);
  33.    
  34.     Uart_SetClkDiv(UARTCH0,Uart8Or16Div);
  35.     stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
  36.     stcBaud.enRunMode = UartMode1;
  37.     stcBaud.u32Baud = 9600;
  38.     u16Scnt = Uart_CalScnt(UARTCH0,&stcBaud);
  39.     Uart_SetBaud(UARTCH0,u16Scnt);
  40.    
  41.     Uart_ClrStatus(UARTCH0,UartRC);
  42.     Uart_EnableFunc(UARTCH0,UartRx);
  43. }



7.初始化滴答定时器

  1. SysTick_Config(4000);    //4M主频,1ms中断

  2. void SysTick_Handler(void)
  3. {
  4.     bHalIncSysTick();    //调用BabyOS的计数
  5. }



8.测试log

  1. void TestLog()
  2. {
  3.     b_log("BabyOS HC32L136\r\n");
  4. }

  5. int32_t main(void)
  6. {
  7. /*******************************************************************MCU Init**/   
  8.     InitClock();
  9.     InitGPIO();
  10.     InitUart();
  11. /************************************************************************/
  12.     bInit();   
  13.     while(1)
  14.     {
  15.         bExec();
  16.         BOS_PERIODIC_TASK(TestLog, 1000);
  17.     }
  18. }







smartpower 发表于 2020-4-11 20:10 | 显示全部楼层
nb~,,,
 楼主| liklon 发表于 2020-4-11 20:27 | 显示全部楼层
LED闪烁实验
1.原理图如下
  
2.进行测试
BabyOS提供了运行周期性任务的宏,直接使用即可不需要添加其他代码。普通IO的初始化可以先使用b_hal_gpio.c提供的配置函数完成
  1. /************************************************************LED PD5**/   
  2. bHalGPIO_Config(B_HAL_GPIOD, B_HAL_PIN5, B_HAL_GPIO_OUTPUT, B_HAL_GPIO_NOPULL);

  3. void TestLed()
  4. {
  5.    static uint8_t flag = 0;
  6.    flag ^= 0x1;
  7.    bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, flag);
  8. }

  9. int32_t main(void)
  10. {
  11. /*******************************************************************MCU Init**/   
  12.    InitClock();
  13.    InitGPIO();
  14.    InitUart();
  15. /************************************************************************/
  16.    bInit();   
  17.    while(1)
  18.   {
  19.        bExec();
  20.        BOS_PERIODIC_TASK(TestLog, 1000);
  21.        BOS_PERIODIC_TASK(TestLed, 500);
  22.   }
  23. }


3.测试结果
led.gif


 楼主| 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的内容
  1. /**                           b_mod_button                           */
  2. ///<b_mod_button {port, pin, pressed_logic_level}
  3. #if _FLEXIBLEBUTTON_ENABLE
  4. #define HAL_B_BUTTON_GPIO               {{B_HAL_GPIOD, B_HAL_PIN4, 0}}
  5. #endif


4.初始化引脚
  1. /************************************************************BUTTON PD4**/   
  2. 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、事件以及连击次数。

  1. typedef enum
  2. {
  3.    FLEX_BTN_PRESS_DOWN = 0,
  4.    FLEX_BTN_PRESS_CLICK,
  5.    FLEX_BTN_PRESS_DOUBLE_CLICK,
  6.    FLEX_BTN_PRESS_REPEAT_CLICK,
  7.    FLEX_BTN_PRESS_SHORT_START,
  8.    FLEX_BTN_PRESS_SHORT_UP,
  9.    FLEX_BTN_PRESS_LONG_START,
  10.    FLEX_BTN_PRESS_LONG_UP,
  11.    FLEX_BTN_PRESS_LONG_HOLD,
  12.    FLEX_BTN_PRESS_LONG_HOLD_UP,
  13.    FLEX_BTN_PRESS_MAX,
  14.    FLEX_BTN_PRESS_NONE,
  15. } flex_button_event_t;


  16. void bButtonCallback(void *p)
  17. {
  18.    flex_button_t *btn = (flex_button_t *)p;
  19.    b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
  20. }

6.初始化功能模块
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7. /************************************************************************/
  8.    bInit();
  9.    bButtonInit();          ///<<<初始化BUTTON功能模块
  10.    while(1)
  11.   {
  12.        bExec();
  13. //       BOS_PERIODIC_TASK(TestLog, 1000);
  14. //       BOS_PERIODIC_TASK(TestLed, 500);
  15.   }
  16. }

7.测试结果



 楼主| liklon 发表于 2020-4-11 22:41 | 显示全部楼层
本帖最后由 liklon 于 2020-4-11 22:43 编辑

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

2.修改硬件错误中断服务函数

  1. void HardFault_Handler()
  2. {
  3.     bHardfaultCallback();
  4. }



3.人为制造错误

  1. typedef void (*pf)(void);
  2. void TestFault()
  3. {
  4.     pf f = (pf)(0xffffffff);
  5.     f();
  6. }



4.初始化功能模块

  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.     InitClock();
  5.     InitGPIO();
  6.     InitUart();
  7. /************************************************************************/
  8.     bInit();
  9.     bButtonInit();
  10.     bTraceInit("HC32L136K8TA");
  11.     TestFault();
  12.     while(1)
  13.     {
  14.         bExec();
  15. //        BOS_PERIODIC_TASK(TestLog, 1000);
  16. //        BOS_PERIODIC_TASK(TestLed, 500);
  17.     }
  18. }



5.测试结果




 楼主| liklon 发表于 2020-4-12 15:43 | 显示全部楼层
b_mod_shell实验

1.使能第三方功能模块
BabyOS的b_mod_shell是基于NR Micro Shell开源代码完成,方便用户通过指令方式操作设备
使能NR Micro Shell,添加第三方文件,同时添加头文件路径
2.使能串口接收中断
  1. void InitUart()
  2. {
  3.    uint16_t u16Scnt = 0;
  4.    stc_uart_config_t  stcConfig;
  5.    stc_uart_irq_cb_t stcUartIrqCb;
  6.    stc_uart_multimode_t stcMulti;
  7.    stc_uart_baud_t stcBaud;
  8.    
  9.    en_uart_mmdorck_t enTb8;

  10.    DDL_ZERO_STRUCT(stcConfig);
  11.    DDL_ZERO_STRUCT(stcUartIrqCb);
  12.    DDL_ZERO_STRUCT(stcMulti);
  13.    DDL_ZERO_STRUCT(stcBaud);
  14.    stcUartIrqCb.pfnRxIrqCb   = RxIntCallback;
  15.    stcUartIrqCb.pfnTxIrqCb   = NULL;
  16.    stcUartIrqCb.pfnRxFEIrqCb = NULL;
  17.    stcUartIrqCb.pfnPEIrqCb   = NULL;
  18.    stcUartIrqCb.pfnCtsIrqCb  = NULL;
  19.    stcConfig.pstcIrqCb = &stcUartIrqCb;
  20.    stcConfig.bTouchNvic = TRUE;
  21. if(TRUE == stcConfig.bTouchNvic)
  22. {
  23. EnableNvic(UART0_IRQn,IrqLevel3,TRUE);
  24. }

  25.    stcConfig.enRunMode = UartMode1;
  26.    stcConfig.enStopBit = Uart1bit;

  27.    stcMulti.enMulti_mode = UartNormal;
  28. Uart_SetMultiMode(UARTCH1,&stcMulti);
  29.    enTb8 = UartDataOrAddr;
  30.    Uart_SetMMDOrCk(UARTCH0,enTb8);
  31.    Uart_Init(UARTCH0, &stcConfig);
  32.    
  33.    Uart_SetClkDiv(UARTCH0,Uart8Or16Div);
  34.    stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
  35.    stcBaud.enRunMode = UartMode1;
  36.    stcBaud.u32Baud = 9600;
  37.    u16Scnt = Uart_CalScnt(UARTCH0,&stcBaud);
  38.    Uart_SetBaud(UARTCH0,u16Scnt);
  39.    
  40.    Uart_ClrStatus(UARTCH0,UartRC);
  41.    Uart_EnableIrq(UARTCH0,UartRxIrq);
  42.    Uart_EnableFunc(UARTCH0,UartRx);
  43. }



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



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

  9. void _bShellLedCmd(char argc, char *argv)
  10. {
  11.    if(argc != 2)
  12.   {
  13.        return;
  14.   }
  15.    if (!strcmp("on", &argv[argv[1]]))
  16.   {
  17.        bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 1);      //led on
  18.   }
  19.    else if (!strcmp("off", &argv[argv[1]]))
  20.   {
  21.        bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 0);      //led off
  22.   }
  23. }


5.启动Shell
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7. /************************************************************************/
  8.    bInit();
  9.    bButtonInit();
  10.    bTraceInit("HC32L136K8TA");
  11. //   TestFault();
  12.    bShellStart();
  13.    while(1)
  14.   {
  15.        bExec();
  16. //       BOS_PERIODIC_TASK(TestLog, 1000);
  17. //       BOS_PERIODIC_TASK(TestLed, 500);
  18.   }
  19. }



6.测试结果



评论

bshellstart没定义,_bShellLSCmd,_bShellTestCmd都没定义  发表于 2021-9-22 17:56
 楼主| liklon 发表于 2020-4-12 20:48 | 显示全部楼层
b_mod_protocol实验

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

2.定义私有分发函数
  1. int Dispatch(uint8_t cmd, uint8_t *param, bProtoLen_t param_len)
  2. {
  3.    switch(cmd)
  4.   {
  5.        case 0x1:     //上位机测试按钮发送的指令为 0x1
  6.            bHalUartSend(B_HAL_UART_1, param, param_len);   //收到后将参数部分打印出去
  7.            break;
  8.        default:
  9.            break;
  10.   }
  11.    return 0;
  12. }



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



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



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



6.main函数内容
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7. /************************************************************************/
  8.    bInit();
  9.    bButtonInit();
  10.    bTraceInit("HC32L136K8TA");
  11.    Protocol_NO = bProtocolRegist(0x520, Dispatch);
  12.    while(1)
  13.   {
  14.        bExec();
  15.   }
  16. }



7.测试结果



 楼主| liklon 发表于 2020-4-12 21:46 | 显示全部楼层
使用32M系统时钟实验

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

2.查看时钟树

3.设置时钟
  1. void InitClock()
  2. {
  3.    stc_sysctrl_clk_config_t stcCfg;
  4.    
  5.    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  6.    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);
  7.    
  8.    Flash_WaitCycle(FlashWaitCycle1);  
  9.    
  10.    Sysctrl_SetXTHFreq(SysctrlXthFreq20_32MHz);

  11.    stcCfg.enClkSrc  = SysctrlClkXTH;
  12.    stcCfg.enHClkDiv = SysctrlHclkDiv1;
  13.    stcCfg.enPClkDiv = SysctrlPclkDiv1;
  14.    Sysctrl_ClkInit(&stcCfg);   
  15.    
  16.    Sysctrl_ClkSourceEnable(SysctrlClkRCH, FALSE);
  17.    
  18.    
  19.    SysTick_Config(Sysctrl_GetHClkFreq() / 1000);
  20. }



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



5.测试结果



 楼主| liklon 发表于 2020-4-13 20:33 来自手机 | 显示全部楼层
工作日停更,周末继续……
 楼主| liklon 发表于 2020-4-18 14:37 | 显示全部楼层
驱动SPIFlash实验

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

  1. Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE);  //开启时钟

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

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

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

  11. bHalGPIO_Config(B_HAL_GPIOA, B_HAL_PIN4, B_HAL_GPIO_OUTPUT, B_HAL_GPIO_NOPULL);
  12. bHalGPIO_WritePin(B_HAL_GPIOA, B_HAL_PIN4, 1);

  13. //------------------------------------------------------------SPI0
  14. stc_spi_config_t  SPIConfig;
  15. DDL_ZERO_STRUCT(SPIConfig);
  16. Spi_SetCS(Spi0,TRUE);
  17. SPIConfig.bCPHA = Spicphafirst;
  18. SPIConfig.bCPOL = Spicpollow;
  19. SPIConfig.bIrqEn = FALSE;
  20. SPIConfig.bMasterMode = SpiMaster;
  21. SPIConfig.u8BaudRate = SpiClkDiv8;
  22. SPIConfig.pfnSpi0IrqCb = NULL;
  23. Spi_Init(Spi0,&SPIConfig);


2.修改硬件抽象层SPI部分
修改b_hal_spi.c部分内容:
  1. uint8_t bHalSPI_SendReceiveByte(uint8_t no, uint8_t dat)
  2. {
  3.    uint8_t tmp;
  4.    switch(no)
  5.   {
  6.        case B_HAL_SPI_1:
  7.            Spi_SetCS(Spi0,FALSE);
  8.            Spi_SendReceiveData(Spi0, dat, &tmp);
  9.            Spi_SetCS(Spi0,TRUE);
  10.            break;        
  11.        case B_HAL_SPI_2:

  12.            break;
  13.        case B_HAL_SPI_3:

  14.            break;
  15.        default:
  16.            break;
  17.   }
  18.    return tmp;
  19. }


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



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



5.增加读写测试
  1. int32_t main(void)
  2. {
  3.    uint8_t buf[16];
  4. /*******************************************************************MCU Init**/   
  5.    InitClock();
  6.    InitGPIO();
  7.    InitUart();
  8.    InitSPI();
  9. /************************************************************************/
  10.    bInit();
  11.    bButtonInit();
  12.    bTraceInit("HC32L136K8TA");
  13.    //----------------------------------------------------write
  14.    int fd = -1;
  15.    fd = bOpen(W25QXX, BCORE_FLAG_RW);
  16.    if(fd < 0)
  17.   {
  18.        b_log_e("open error\r\n");
  19.   }
  20.    bCMD_Struct_t cmd;
  21.    cmd.param.erase.addr = 0;
  22.    cmd.param.erase.num = 1;
  23.    bCtl(fd, bCMD_ERASE, &cmd);          //erase
  24.    
  25.    bLseek(fd, 0);
  26.    bWrite(fd, (uint8_t *)"BabyOS", 7);  //write
  27.    //-----------------------------------------------------read
  28.    bLseek(fd, 0);
  29.    bRead(fd, buf, 7);
  30.    bClose(fd);
  31.    b_log("r:%s\r\n", buf);
  32.    while(1)
  33.   {
  34.        bExec();
  35.   }
  36. }





 楼主| liklon 发表于 2020-4-18 14:54 | 显示全部楼层
键值对存取实验

1.配置开启KV

2.测试KV
  1. int32_t main(void)
  2. {
  3.    uint8_t buf[16];
  4. /*******************************************************************MCU Init**/   
  5.    InitClock();
  6.    InitGPIO();
  7.    InitUart();
  8.    InitSPI();
  9. /************************************************************************/
  10.    bInit();
  11.    bButtonInit();
  12.    bTraceInit("HC32L136K8TA");
  13.    if(0 > bKV_Init(W25QXX, 0, 4096 * 8, 4096))
  14.   {
  15.        b_log_e("kv init error\r\n");
  16.   }
  17.    
  18.    bKV_Set("name", (uint8_t *)"BabyOS", 7);
  19.    bKV_Get("name", buf);
  20.    b_log("name:%s\r\n", buf);
  21.    
  22.    bKV_Set("name", (uint8_t *)"HC32L136", 9);
  23.    bKV_Get("name", buf);
  24.    b_log("name:%s\r\n", buf);  
  25.    
  26.    while(1)
  27.   {
  28.        bExec();
  29.   }
  30. }



3.测试结果   



 楼主| liklon 发表于 2020-4-18 19:38 | 显示全部楼层
Xmodem实验
通过按键启动传输,最后将传输的内容打印出来。
1.配置开启Xmodem

2.定义串口空闲回调
把数据给到Xmodem功能模块解析
  1. void bHalUartIdleCallback(uint8_t no, uint8_t *pbuf, uint16_t len)
  2. {
  3.    if(no == B_HAL_UART_1)
  4.   {
  5.        bXmodem128Parse(pbuf, len);
  6.   }
  7. }

3.定义Xmodem回调及单字节发送函数
  1. void XmodemCallback(uint16_t number, uint8_t *pbuf)
  2. {
  3.    if(pbuf == NULL)
  4.   {
  5.        XmodemFlag = 1;
  6.   }
  7.    else
  8.   {
  9.        memcpy(&XmodemBuf[number * 128], pbuf, 128);
  10.   }
  11. }

  12. void XmodemSendByte(uint8_t c)
  13. {
  14.    bHalUartSend(B_HAL_UART_1, &c, 1);
  15. }



4.修改按键回调内容
  1. void bButtonCallback(void *p)
  2. {
  3.    flex_button_t *btn = (flex_button_t *)p;
  4.    b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
  5.    if(btn->event != FLEX_BTN_PRESS_CLICK)
  6.   {
  7.        return;
  8.   }
  9.    if(XmodemFlag == 0)
  10.   {
  11.        memset(XmodemBuf, 0, sizeof(XmodemBuf));
  12.        bXmodem128Start();
  13.   }
  14. }


5.开始测试
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7.    InitSPI();
  8. /************************************************************************/
  9.    bInit();
  10.    bButtonInit();
  11.    bTraceInit("HC32L136K8TA");
  12.    bXmodem128Init(XmodemCallback, XmodemSendByte);
  13.    while(1)
  14.   {
  15.        bExec();
  16.        if(XmodemFlag)
  17.       {
  18.            XmodemFlag = 0;
  19.            bUtilDelayMS(100);
  20.            bHalUartSend(B_HAL_UART_1, XmodemBuf, strlen((const char *)XmodemBuf));
  21.       }
  22.   }
  23. }



6.测试结果   



 楼主| liklon 发表于 2020-4-18 21:11 | 显示全部楼层
Ymodem实验
通过按键启动传输,最后将传输的内容和文件名打印出来。
1.配置开启Ymodem

2.定义串口空闲回调
把数据给到Xmodem功能模块解析
  1. void bHalUartIdleCallback(uint8_t no, uint8_t *pbuf, uint16_t len)
  2. {
  3.    if(no == B_HAL_UART_1)
  4.   {
  5.        bYmodemParse(pbuf, len);
  6.   }
  7. }

3.定义Ymodem回调及单字节发送函数
  1. void XmodemCallback(uint8_t t, uint16_t number, uint8_t *pbuf, uint16_t len)
  2. {
  3.    static uint16_t index = 0;
  4.    if(pbuf == NULL)
  5.   {
  6.        YmodemFlag = 1;
  7.   }
  8.    else
  9.   {
  10.        if(t == YMODEM_FILENAME)
  11.       {
  12.            memcpy(YmodemName, pbuf, len);
  13.            index = 0;
  14.       }
  15.        else
  16.       {
  17.            memcpy(&YmodemBuf[index], pbuf, len);
  18.            index += len;
  19.       }
  20.   }
  21. }

  22. void YmodemSendByte(uint8_t c)
  23. {
  24.    bHalUartSend(B_HAL_UART_1, &c, 1);
  25. }



4.修改按键回调内容
  1. void bButtonCallback(void *p)
  2. {
  3.    flex_button_t *btn = (flex_button_t *)p;
  4.    b_log("id: [%d] event: [%d] repeat: %d\n", btn->id,btn->event,btn->click_cnt);
  5.    if(btn->event != FLEX_BTN_PRESS_CLICK)
  6.   {
  7.        return;
  8.   }
  9.    if(YmodemFlag == 0)
  10.   {
  11.        memset(YmodemBuf, 0, sizeof(YmodemBuf));
  12.        memset(YmodemName, 0, sizeof(YmodemName));
  13.        bYmodemStart();
  14.   }
  15. }


5.开始测试
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7.    InitSPI();
  8. /************************************************************************/
  9.    bInit();
  10.    bButtonInit();
  11.    bTraceInit("HC32L136K8TA");
  12.    bYmodemInit(XmodemCallback, YmodemSendByte);
  13.    while(1)
  14.   {
  15.        bExec();
  16.        if(YmodemFlag)
  17.       {
  18.            YmodemFlag = 0;
  19.            bUtilDelayMS(100);
  20.            bHalUartSend(B_HAL_UART_1, YmodemName, strlen((const char *)YmodemName));
  21.            bHalUartSend(B_HAL_UART_1, YmodemBuf, strlen((const char *)YmodemBuf));
  22.       }
  23.   }
  24. }



6.测试结果   



 楼主| 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硬件接口
  1. ///<OLED
  2. #define HAL_OLED_I2C                   B_HAL_I2C_1
  3. #define HAL_OLED_I2C_ADDR               0X78


3.修改硬件抽象层I2C部分
  1. int bHalI2C_MemWrite(uint8_t no, uint8_t dev_addr, uint16_t mem_addr, uint8_t *pbuf, uint16_t len)
  2. {
  3.    int retval = 0;
  4.    int i = 0;
  5.    switch(no)
  6.   {
  7.        case B_HAL_I2C_1:
  8.            for(i = 0;i < len;i++)
  9.           {
  10.                bUtilI2C_WriteData(I2C_IO_1, dev_addr, mem_addr, pbuf[i]);
  11.           }
  12.            break;        
  13.        case B_HAL_I2C_2:
  14.            
  15.            break;
  16.        case B_HAL_I2C_3:

  17.            break;        
  18.        default:
  19.            break;
  20.   }
  21.    return retval;
  22. }



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


5.开始测试
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7.    InitSPI();
  8. /************************************************************************/
  9.    bInit();
  10.    bButtonInit();
  11.    bTraceInit("HC32L136K8TA");
  12.    bGUI_Init(OLED, -1);
  13.    UG_PutString(0,0,"BabyOS");
  14.    UG_PutString(0,20,"HC32L136");
  15.    UG_DrawCircle(64, 32, 30, 0xff);
  16.    while(1)
  17.   {
  18.        bExec();
  19.   }
  20. }



6.测试结果   



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 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

50

帖子

1

粉丝
快速回复 返回顶部 返回列表