基于HC32L136K8TA运行BabyOS
本帖最后由 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:23 编辑
建立工程移植BabyOS
1.下载资料 <ftp://HdscCustomer:HdscGuest2019!@ftp.hdsc.com.cn/%E8%B5%84%E6%96%99%E4%B8%8B%E8%BD%BD/HC32L136_SDK/> https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/file_list.png2.准备开发环境工程模板:HC32L136_TEMPLATE_Rev1.0.0MDK pack包:HC32L136_IDE_Rev1.0.0\HC32L136_IDE_Rev1.0.0\MDK_IDEFLM文件: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引脚
https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/uart_gpio.png
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_tstcConfig;
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);
}
}
https://gitee.com/notrynohigh/BabyOS_HDSC/raw/master/doc/log.png
nb~,,, LED闪烁实验
1.原理图如下https://gitee.com/notrynohigh/BabyOS_HDSC/raw/LED/doc/led_pin.png2.进行测试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.测试结果
本帖最后由 liklon 于 2020-4-12 14:53 编辑
b_mod_button实验
1.原理图如下https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/button_pin.png2.使能第三方功能模块BabyOS的b_mod_button是基于FlexibleButton开源代码完成,使用非常方便。下面这个配置界面是MDK独有的,IAR的用户就只能看看了。https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/config.png3.在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.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/BUTTON/doc/button.png
本帖最后由 liklon 于 2020-4-11 22:43 编辑
b_mod_trace实验
1.使能第三方功能模块BabyOS的b_mod_trace是基于CmBacktrace开源代码完成,帮助用户快速定位产生硬件错误中断的源头。使能CmBacktrace,根据自身MCU选择内核https://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/config.png
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.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/trace.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/TRACE/doc/trace2.png
b_mod_shell实验
1.使能第三方功能模块BabyOS的b_mod_shell是基于NR Micro Shell开源代码完成,方便用户通过指令方式操作设备使能NR Micro Shell,添加第三方文件,同时添加头文件路径https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SHELL/doc/config.png2.使能串口接收中断void InitUart()
{
uint16_t u16Scnt = 0;
stc_uart_config_tstcConfig;
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]))
{
bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 1); //led on
}
else if (!strcmp("off", &argv]))
{
bHalGPIO_WritePin(B_HAL_GPIOD, B_HAL_PIN5, 0); //led off
}
}
5.启动Shellint32_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.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SHELL/doc/shell.png
b_mod_protocol实验
1.使能私有协议功能模块BabyOS提供一份私有协议以及对应的上位机软件,用户如果觉得私有协议的格式可以接受,那么可以直接使用。私有协议可以配置ID字段和长度字段的大小,以及配置是否加密数据https://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/exe.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/config.png
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.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/PROTOCOL/doc/protocol.png
使用32M系统时钟实验
1.为了115200波特率根据数据手册可以看出,使用4M的系统时钟,如果串口使用115200bps那么偏差有8%,极其不准,就选择用外部高速时钟32M吧https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/bps.pnghttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/bps2.png
2.查看时钟树https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/tree.png
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.测试结果https://gitee.com/notrynohigh/BabyOS_HDSC/raw/CLOCK_32M/doc/32M.png
工作日停更,周末继续…… 驱动SPIFlash实验
1.SPI初始化初始化部分主要分为3步:使能时钟、配置GPIO、配置SPIhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/pin.png关于CS脚,我们为了灵活都是配置为普通GPIO,利用软件去控制,在数据手册里面有这么个点就要特别注意了:https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/cs.png
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_tSPIConfig;
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;
/*******************************************************************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();
}
}
https://gitee.com/notrynohigh/BabyOS_HDSC/raw/SPIFLASH/doc/spiflash.png
键值对存取实验
1.配置开启KVhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/KV/doc/config.png
2.测试KVint32_t main(void)
{
uint8_t buf;
/*******************************************************************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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/KV/doc/kv.png
Xmodem实验通过按键启动传输,最后将传输的内容打印出来。1.配置开启Xmodemhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/Xmodem/doc/config.png
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, 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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Xmodem/doc/Xmodem.png
Ymodem实验通过按键启动传输,最后将传输的内容和文件名打印出来。1.配置开启Ymodemhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/Ymodem/doc/config.png
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, 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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/Ymodem/doc/Ymodem.png
OLED+GUI实验OLED12864是I2C接口,使用HC32L136硬件I2C整了半天没有驱动成功,转为用BabyOS提供的模拟I2C模块(b_util_i2c.c .h)。1.配置开启GUIhttps://gitee.com/notrynohigh/BabyOS_HDSC/raw/OLED/doc/config.png
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);
}
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.测试结果 https://gitee.com/notrynohigh/BabyOS_HDSC/raw/OLED/doc/OLED.png
非常感谢楼主分享 喜欢有代码分享的 太好了正需要 不错不错 能用的上 非常感谢楼主分享
页:
[1]
2