2669|0

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【GD32L233C-START评测】串口打印 [复制链接]


虽然IDE自带printf函数可以用于打印,但只能支持单个串口,且在keil中需要microlib支持,microlib做了高度优化,但重入特性被阉割,在RTOS中使用可能存在问题。下面介绍一种自定义打印的方法,可以支持任意串口,且无需microlib。

 

底层还是要实现串口收发,串口底层采用缓冲的方式,可以最大程度的减少程序阻塞,提高运行效率。打印函数打印数据时不直接输出到硬件,而是写入到环形缓冲区,然后通过中断将缓冲区数据发送到端口。

 

打印函数封装方法如下:


#define PT_NEW_LINE           0      //0-n , 1-\r\n , 2-\n\r
#define com_port com.obj00

/*******************************************************************************
* [url=home.php?mod=space&uid=159083]@brief[/url] __sys_put_ch
* \param[in] none
* \retval: none
*******************************************************************************/
void __sys_put_ch(char ch)
{
#if PT_NEW_LINE == 0
    com_port.fun->cycle_snd_byte(ch);
#elif PT_NEW_LINE == 1
    if (ch != '\n')
    {
        com_port.fun->cycle_snd_byte(ch);
    }
    else
    {
        com_port.fun->cycle_snd_byte('\r');
        com_port.fun->cycle_snd_byte('\n');
    }
#elif PT_NEW_LINE == 2
    if(ch != '\n')
    {
        com_port.fun->cycle_snd_byte(ch);
    }
    else
    {
        com_port.fun->cycle_snd_byte('\n');
        com_port.fun->cycle_snd_byte('\r');
    }
#endif
}

/*******************************************************************************
* @brief  sys_hw_console_output
* \param[in] str : string to print
* \retval: none
*******************************************************************************/
void sys_hw_console_output(const char *str)
{
    /* empty console output */
    while (*str)
    {
        __sys_put_ch(*str++);
    }
}

/*******************************************************************************
* @brief  sys_hw_puts
* \param[in]  str : string to print
* \retval: none
*******************************************************************************/
void sys_hw_puts(const char *str)
{
	osMutexWait(os_obj.mid_printf, 1000);
	
    sys_hw_console_output(str);
	
	osMutexRelease(os_obj.mid_printf);
}

/*******************************************************************************
* @brief  sys_hw_printf
* \param[in] fmt: format var like printf
* \retval: none
*******************************************************************************/
static char  buf_str[240 + 1]; 
void sys_hw_printf(char* fmt, ...)
{
    va_list   v_args;

	osMutexWait(os_obj.mid_printf, 1000);
	
    va_start(v_args, fmt);
   (void)vsnprintf((char       *)	&buf_str[0],
                   (size_t      )	sizeof(buf_str)-5,
                   (char const *)	fmt,
                                 	v_args);
    va_end(v_args);
    
    sys_hw_console_output(buf_str);
	
	osMutexRelease(os_obj.mid_printf);
}

重映射

#if DBG_EN > 0
#define dbg_print sys_hw_printf
#define dbg_puts sys_hw_puts
#define dbg_notice gui_notice
#define dbg_u8_print mem_u8_disp
#define dbg_u16_print mem_u16_disp
#define dbg_u32_print mem_u32_disp
#else
#define dbg_print(...)
#define dbg_puts(...)
#define dbg_notice(...)
#define dbg_u8_print(...)
#define dbg_u16_print(...)
#define dbg_u32_print(...)
#endif

应用示例

void task_system(const void *argument)
{
	printf("::start --------------------------------------\n");
	
	while (1)
	{
		sys_st.u_tick = app_tick_get();
		pulse_create(&sys_st.pulse, sys_st.u_tick);
		
		sys_led_ctr();
		
		// 按键采集
		sys_st.key.st.pulse_sample = 1;
		sys_st.key.st.pulse_time = sys_st.pulse.bPulse_100ms;
		io_flt_ext(&sys_st.key, 3, key.in_st());
		
		// 按键动作
		if(sys_st.key.st.edge_found)
		{
			dbg_print("key press down ! \n");
		}
		if(sys_st.key.st.edge_lost)
		{
			dbg_print("key release  ! \n");
		}
		
        osDelay(5);
	}
}

结果

附上测试工程:

software.rar (1.78 MB, 下载次数: 0)

此帖出自GD32 MCU论坛
点赞(1) 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表