在MCU做通讯或者记录时间的应用场景中,一般采用32位的UTC来表示时间,BabyOS里面有个功能模块是b_mod_utc,这个是UTC2000,当数值为0时表示2000-1-1 0:0:0 下面初始化RTC,设置时间为起点时间。1.配置开启UTC
https://gitee.com/notrynohigh/BabyOS_HDSC/raw/UTC/doc/config.png
2.初始化RTCvoid 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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/UTC/doc/UTC.png
动态调参实验 在做项目中,某些参数我们要在系统运行时进行调试,那么BabyOS基于bShell增加了这一项功能。使用非常非常简单。1.配置开启调参功能https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Parameter/doc/config.png
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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Parameter/doc/Param.png
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, &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);
}
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.hhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/FS/doc/config.png注册设备(b_device_list.h)B_DEVICE_REG(SPIFLASH, bSPIFLASH_Driver, "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的测试程序是通过文件的方式记录启动次数https://gitee.com/notrynohigh/BabyOS_HDSC/raw/FS/doc/fs.png
BabyOS master分支 https://gitee.com/notrynohigh/BabyOS
nb
页:
1
[2]