历史上的今天
今天是:2024年10月09日(星期三)
2021年10月09日 | STM32 f103 实现命令终端
2021-10-09 来源:eefocus
文件说明
uart.c
实现输入反显及命令识别
cmd.c
实现命令函数及命令查找
main.c
进入shell模式
uart.c
#include "usart.h"
/****************************************************************************
* 名 称:void USART1_Configuration(void)
* 功 能:配置USART1参数
* 入口参数:
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
void USART1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
USART_InitStructure.USART_BaudRate = USART_BAUDRATE; //波特率250000bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //配置串口参数函数
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲空中断
USART_Cmd(USART1, ENABLE); //使能 USART1
}
/****************************************************************************
* 名 称:void USART1_SendByte(uint8_t TxData)
* 功 能:串口1发送函数
* 入口参数:TxData
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
void USART1_SendByte(uint8_t TxData)
{
USART_SendData(USART1, TxData);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
/****************************************************************************
* 名 称:int fputc(int ch, FILE *f)
* 功 能:重定向c库函数printf到串口,重定向后可使用printf函数
* 入口参数:int ch, FILE *f
* 出口参数:int
* 说 明:
* 调用方法:无
****************************************************************************/
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART1_SendByte((uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return (ch);
}
/****************************************************************************
* 名 称:int fgetc(FILE *f)
* 功 能:重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
* 入口参数:FILE *f
* 出口参数:int
* 说 明:
* 调用方法:无
****************************************************************************/
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART1);
}
/****************************************************************************
* 名 称:void uart_putc(uint8_t c)
* 功 能:向终端打印一个字符
* 入口参数:uint8_t c
* 出口参数:void
* 说 明:shell
* 调用方法:无
****************************************************************************/
void uart_putc(uint8_t c)
{
USART1_SendByte(c);
if(c == 'n')
uart_putc('r');
}
/****************************************************************************
* 名 称:void uart_puts(uint8_t *str)
* 功 能:向终端打印一个字符串
* 入口参数:uint8_t *str
* 出口参数:无
* 说 明:shell
* 调用方法:无
****************************************************************************/
void uart_puts(uint8_t *str)
{
while(*str)
{
uart_putc(*str);
str++;
}
}
/****************************************************************************
* 名 称:uint8_t uart_getc(void)
* 功 能:从终端获取一个字符
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:无
****************************************************************************/
uint8_t uart_getc(void)
{
while(!rec_f);
rec_f = 0;
return (uint8_t)*USART1_RxBuffer;
}
/****************************************************************************
* 名 称:void uart_gets(uint8_t *buf, uint32_t len)
* 功 能:从终端获取一个字符串
* 入口参数:uint8_t *buf, uint32_t len
* 出口参数:无
* 说 明:shell
* 调用方法:无
****************************************************************************/
void uart_gets(uint8_t *buf, uint32_t len)
{
int i = 0;
uint8_t tmp = 0;
while(i < (len-1))
{
tmp = uart_getc();
if(tmp==0x08 && i==0)
continue;
/*回显*/
uart_putc(tmp);
buf[i] = tmp;
/**/
if(tmp == 'r')
break;
if(tmp == 0x08){
uart_putc(' ');
uart_putc(0x08);
i--;
continue;
}
i++;
}
buf[i] = '




