[其他] 基于HC32L136K8TA运行BabyOS

[复制链接]
13796|23
 楼主| liklon 发表于 2020-5-7 07:39 | 显示全部楼层
UTC+RTC实验

     在MCU做通讯或者记录时间的应用场景中,一般采用32位的UTC来表示时间,BabyOS里面有个功能模块是b_mod_utc,这个是UTC2000,当数值为0时表示2000-1-1 0:0:0 下面初始化RTC,设置时间为起点时间。
1.配置开启UTC


2.初始化RTC
  1. void InitRTC()
  2. {
  3.    stc_rtc_config_t stcRtcConfig;
  4.    DDL_ZERO_STRUCT(stcRtcConfig);
  5.    
  6.    stcRtcConfig.enClkSel = RtcClk32768;
  7.    stcRtcConfig.enAmpmSel = Rtc24h;
  8.    stcRtcConfig.pstcIrqCb = NULL;
  9.    stcRtcConfig.bTouchNvic = FALSE;
  10.    Rtc_Init(&stcRtcConfig);
  11.    Rtc_EnableFunc(RtcCount);
  12.    
  13. }


3.定义设置和获取时间函数
  1. #define BIN2BCD(n)     ((((n) / 10) << 4) | ((n) % 10))
  2. #define BCD2BIN(n)     (((n) >> 4) * 10 + ((n) & 0xf))

  3. void RTC_Write(uint32_t utc)
  4. {
  5.    bUTC_DateTime_t bdt;
  6.    stc_rtc_time_t dt;
  7.    
  8.    bUTC2Struct(&bdt, utc);
  9.    
  10.    dt.u8Year = BIN2BCD(bdt.year - 2000);
  11.    dt.u8Month = BIN2BCD(bdt.month);
  12.    dt.u8Day = BIN2BCD(bdt.day);
  13.    dt.u8DayOfWeek = BIN2BCD(bdt.week);
  14.    
  15.    dt.u8Hour = BIN2BCD(bdt.hour);
  16.    dt.u8Minute = BIN2BCD(bdt.minute);
  17.    dt.u8Second = BIN2BCD(bdt.second);
  18.    Rtc_WriteDateTime(&dt, TRUE, TRUE);
  19. }

  20. void RTC_Read()
  21. {
  22.    stc_rtc_time_t dt;
  23.    Rtc_ReadDateTime(&dt);
  24.    b_log("%d-%x-%x %x %x:%x:%x\r\n", 2000 + BCD2BIN(dt.u8Year), dt.u8Month, dt.u8Day,
  25.                dt.u8DayOfWeek, dt.u8Hour, dt.u8Minute, dt.u8Second);
  26. }




4.开始测试
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7.    InitSPI();
  8.    InitRTC();
  9. /************************************************************************/
  10.    bInit();
  11.    bButtonInit();
  12.    bTraceInit("HC32L136K8TA");
  13.    RTC_Write(0);
  14.    while(1)
  15.   {
  16.        bExec();
  17.        BOS_PERIODIC_TASK(RTC_Read, 1000);
  18.   }
  19. }



6.测试结果   



 楼主| liklon 发表于 2020-6-4 23:12 | 显示全部楼层
动态调参实验
     在做项目中,某些参数我们要在系统运行时进行调试,那么BabyOS基于bShell增加了这一项功能。使用非常非常简单。
1.配置开启调参功能

2.注册调参对象
  1. uint8_t test_param = 0;        //调节test_param
  2. void TestParam()
  3. {
  4.    if(test_param == 15)
  5.   {
  6.        b_log("hello\r\n");
  7.   }
  8. }

  9. bPARAM_REG_INSTANCE(test_param, 1);   //注册test_param至调参模块


3.启用Shell功能
  1. bShellInit();   //初始化

  2. void RxIntCallback()
  3. {
  4.    uint8_t tmp;
  5.    tmp = Uart_ReceiveData(UARTCH0);
  6.    bShellParse(&tmp, 1);   //中断收到的数据给shell解析
  7. }



4.开始测试
  1. uint8_t test_param = 0;
  2. void TestParam()
  3. {
  4.    if(test_param == 15)
  5.   {
  6.        b_log("hello\r\n");
  7.   }
  8. }

  9. bPARAM_REG_INSTANCE(test_param, 1);

  10. int32_t main(void)
  11. {
  12. /*******************************************************************MCU Init**/   
  13.    InitClock();
  14.    InitGPIO();
  15.    InitUart();
  16.    InitSPI();
  17.    InitRTC();
  18. /************************************************************************/
  19.    bInit();
  20.    bShellInit();
  21.    while(1)
  22.   {
  23.        bExec();
  24.        BOS_PERIODIC_TASK(TestParam, 10000);
  25.   }
  26. }



5.测试结果   



 楼主| liklon 发表于 2020-6-6 10:46 | 显示全部楼层
BabyOS_Example使用bFS功能模块
BabyOS提供了FatFS和LittleFS,同时SPIFLASH驱动使用了SFUD开源代码。关于这几个第三方代码,想进一步了解的可以去对应的仓库。下面主要是介绍如何使用。

添加b_drv_spiflash驱动添加b_hal_spi硬件抽象层
  1. int bHalSPI_Send(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
  2. {
  3.    int i = 0;
  4.    uint8_t tmp;
  5.    if(pbuf == NULL)
  6.   {
  7.        return -1;
  8.   }
  9.    switch(spi)
  10.   {
  11.        case B_HAL_SPI_1:
  12.            Spi_SetCS(Spi0,FALSE);
  13.            for(i = 0;i < len;i++)
  14.           {
  15.                Spi_SendReceiveData(Spi0, pbuf[i], &tmp);
  16.           }
  17.            Spi_SetCS(Spi0,TRUE);
  18.            break;        
  19.        default:
  20.            break;
  21.   }
  22.    return 0;
  23. }

  24. int bHalSPI_Receive(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
  25. {
  26.    int i = 0;
  27.    if(pbuf == NULL)
  28.   {
  29.        return -1;
  30.   }
  31.    switch(spi)
  32.   {
  33.        case B_HAL_SPI_1:
  34.            Spi_SetCS(Spi0,FALSE);
  35.            for(i = 0;i < len;i++)
  36.           {
  37.                Spi_SendReceiveData(Spi0, 0xff, &pbuf[i]);
  38.           }
  39.            Spi_SetCS(Spi0,TRUE);
  40.            break;        
  41.        default:
  42.            break;
  43.   }
  44.    return 0;
  45. }



取消引脚定义的注释(b_hal.h内)
  1. ///< SPIFLASH
  2. #define HAL_SPIFLASH_QSPI_EN           0
  3. #define HAL_SPIFLASH_TOTAL_NUMBER       1
  4. #define HAL_SPIFLASH_IF                 {{B_HAL_QSPI_INVALID, B_HAL_SPI_1, {B_HAL_GPIOA, B_HAL_PIN4}},}  



配置b_config.h
注册设备(b_device_list.h)
  1. B_DEVICE_REG(SPIFLASH, bSPIFLASH_Driver[0], "flash")


初始化FS并运行测试程序
  1. int32_t main(void)
  2. {
  3. /*******************************************************************MCU Init**/   
  4.    InitClock();
  5.    InitGPIO();
  6.    InitUart();
  7.    InitSPI();
  8.    InitRTC();
  9. /************************************************************************/
  10.    bInit();
  11.    bShellInit();
  12.    bFS_Init();
  13.    bFS_Test();
  14.    while(1)
  15.   {
  16.        bExec();
  17.        BOS_PERIODIC_TASK(TestParam, 10000);
  18.   }
  19. }



测试用的FLASH型号是(W25X16AV),这个型号SFUD不支持。可以看到如下打印:
  1. W:sfud_init 126 Start initialize Serial Flash Universal Driver(SFUD) V1.1.0.
  2. W:sfud_init 127 You can get the latest version on https://github.com/armink/SFUD .
  3. W:read_jedec_id 871 The flash device manufacturer ID is 0xEF, memory type ID is 0x30, capacity ID is 0x15.
  4. W:read_sfdp_header 122 Error: Check SFDP signature error. It's must be 50444653h('S' 'F' 'D' 'P').
  5. .....

添加设备信息至SPIFLASH设备表:
  1. //sfud_flash_def.h
  2. #define SFUD_FLASH_CHIP_TABLE                                                                                       \
  3. {                                                                                                                   \
  4. .......
  5. {"W25X16AV", SFUD_MF_ID_WINBOND, 0x30, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                    \
  6. .......
  7. }
  8. #endif
实验效果:
FS的测试程序是通过文件的方式记录启动次数


BabyOS master分支 https://gitee.com/notrynohigh/BabyOS

smartpower 发表于 2020-6-6 11:53 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部