发新帖我要提问
12
返回列表
[其他]

基于HC32L136K8TA运行BabyOS

[复制链接]
楼主: liklon
手机看帖
扫描二维码
随时随地手机跟帖
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
void InitRTC()
{
   stc_rtc_config_t stcRtcConfig;
   DDL_ZERO_STRUCT(stcRtcConfig);
   
   stcRtcConfig.enClkSel = RtcClk32768;
   stcRtcConfig.enAmpmSel = Rtc24h;
   stcRtcConfig.pstcIrqCb = NULL;
   stcRtcConfig.bTouchNvic = FALSE;
   Rtc_Init(&stcRtcConfig);
   Rtc_EnableFunc(RtcCount);
   
}


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

void RTC_Write(uint32_t utc)
{
   bUTC_DateTime_t bdt;
   stc_rtc_time_t dt;
   
   bUTC2Struct(&bdt, utc);
   
   dt.u8Year = BIN2BCD(bdt.year - 2000);
   dt.u8Month = BIN2BCD(bdt.month);
   dt.u8Day = BIN2BCD(bdt.day);
   dt.u8DayOfWeek = BIN2BCD(bdt.week);
   
   dt.u8Hour = BIN2BCD(bdt.hour);
   dt.u8Minute = BIN2BCD(bdt.minute);
   dt.u8Second = BIN2BCD(bdt.second);
   Rtc_WriteDateTime(&dt, TRUE, TRUE);
}

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




4.开始测试
int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
   InitRTC();
/************************************************************************/
   bInit();
   bButtonInit();
   bTraceInit("HC32L136K8TA");
   RTC_Write(0);
   while(1)
  {
       bExec();
       BOS_PERIODIC_TASK(RTC_Read, 1000);
  }
}



6.测试结果   



使用特权

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

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

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


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

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



4.开始测试
uint8_t test_param = 0;
void TestParam()
{
   if(test_param == 15)
  {
       b_log("hello\r\n");
  }
}

bPARAM_REG_INSTANCE(test_param, 1);

int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
   InitRTC();
/************************************************************************/
   bInit();
   bShellInit();
   while(1)
  {
       bExec();
       BOS_PERIODIC_TASK(TestParam, 10000);
  }
}



5.测试结果   



使用特权

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

添加b_drv_spiflash驱动添加b_hal_spi硬件抽象层
int bHalSPI_Send(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
{
   int i = 0;
   uint8_t tmp;
   if(pbuf == NULL)
  {
       return -1;
  }
   switch(spi)
  {
       case B_HAL_SPI_1:
           Spi_SetCS(Spi0,FALSE);
           for(i = 0;i < len;i++)
          {
               Spi_SendReceiveData(Spi0, pbuf[i], &tmp);
          }
           Spi_SetCS(Spi0,TRUE);
           break;        
       default:
           break;
  }
   return 0;
}

int bHalSPI_Receive(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
{
   int i = 0;
   if(pbuf == NULL)
  {
       return -1;
  }
   switch(spi)
  {
       case B_HAL_SPI_1:
           Spi_SetCS(Spi0,FALSE);
           for(i = 0;i < len;i++)
          {
               Spi_SendReceiveData(Spi0, 0xff, &pbuf[i]);
          }
           Spi_SetCS(Spi0,TRUE);
           break;        
       default:
           break;
  }
   return 0;
}



取消引脚定义的注释(b_hal.h内)
///< SPIFLASH
#define HAL_SPIFLASH_QSPI_EN           0
#define HAL_SPIFLASH_TOTAL_NUMBER       1
#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)
B_DEVICE_REG(SPIFLASH, bSPIFLASH_Driver[0], "flash")


初始化FS并运行测试程序
int32_t main(void)
{
/*******************************************************************MCU Init**/   
   InitClock();
   InitGPIO();
   InitUart();
   InitSPI();
   InitRTC();
/************************************************************************/
   bInit();
   bShellInit();
   bFS_Init();
   bFS_Test();
   while(1)
  {
       bExec();
       BOS_PERIODIC_TASK(TestParam, 10000);
  }
}



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

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


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

使用特权

评论回复
smartpower| | 2020-6-6 11:53 | 显示全部楼层
nb

使用特权

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

本版积分规则