本帖最后由 mingxiangjun 于 2024-7-14 15:41 编辑
基础任务:串口调试 一、说明 在嵌入式领域,在没有GUI情况下,串口调试很重要,如输入“ver”查询版本号,输入“chip”回应芯片信息等等。由于C的可移植性,先简单在PC模拟一下,再移植到MCU: 二、编码 可直接在例程UART_Transmit_and_Receive基础上进行修改,新建cmd.h: #ifndef __CMD_H__
#define __CMD_H__
typedef void (*pCmd)(void);
typedef struct{
char *cmdName;
pCmd cmdHandler;
}cmdTab_t;
extern cmdTab_tcmdList[];
extern int cmdNum;
#endif
Cmd.c: #include <stdio.h>
#include "cmd.h"
void verHandler(void);
void chipHandler(void);
cmdTab_t cmdList[]=
{
{"ver",verHandler},
{"chip",chipHandler}
};
int cmdNum=sizeof(cmdList)/sizeof(cmdTab_t);
void verHandler()
{
printf("%s%s\n",__DATE__,__TIME__);
}
void chipHandler()
{
printf("Infineon CYW20829\n");
}
主函数添加shell指令处理流程: #include "cmd.h"
#include <string.h>
#defineBUFF_SIZE (64)
char txBuff[BUFF_SIZE];
char rxBuff[BUFF_SIZE];
volatile bool rxEnd = 0;
volatile int txBuffIndex= 0;
volatile int rxBuffIndex= 0;
主循环: for (;;)
{
if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj,
(uint8_t *)&rxBuff[rxBuffIndex],0))
{
if(rxBuff[rxBuffIndex]=='\r'||rxBuff[rxBuffIndex]=='\n')
{
rxEnd=1;
}
else
rxBuffIndex++;
if(rxEnd==1&&rxBuffIndex!=0)
{
rxBuff[rxBuffIndex]='\0';
inti=0;
for(;i<cmdNum;i++)
{
if(strcmp(rxBuff,cmdList.cmdName)==0)
{
printf("%s\n",rxBuff);//回显
cmdList.cmdHandler();
break;
}
}
if (i==cmdNum)
{
printf("Cmd not found\n");
}
rxBuffIndex=0;
}
rxEnd=0;
}
else
{
handle_error();
}
}
三、效果 可以看到单线程死循环能很好执行指令并返回结果,和PC上效果一致: |
@qintian0303 :都是基于eclipse,有类似STM32CubeMX的图形化初始代码生成工具、工程生成器、烧录器等等,用过就知道了
英飞凌的开发环境特殊吗?