【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)
|