前言:本文章承接“USART学习(一)”,完成剩下的利用USART串口通信,实现控制开发板上的LED灯。
编程思路:
1) 初始化配置 RGB 彩色灯 GPIO;
2) 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
3) 初始化 GPIO,并将 GPIO 复用到 USART 上;
4) 配置 USART 参数;
5) 使能 USART;
6) 获取指令输入,根据指令控制 RGB 彩色灯。
代码分析
void USART_ColorConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 打开串口GPIO的时钟
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
// 打开串口外设的时钟
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// 将USART Rx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
// 配置串口的工作参数
// 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
// 配置 针数据字长
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// 配置停止位
USART_InitStructure.USART_StopBits = USART_StopBits_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(DEBUG_USARTx, &USART_InitStructure);
// 串口中断优先级配置
NVIC_Configuration();
// 使能串口
USART_Cmd(DEBUG_USARTx, ENABLE);
}
这里介绍一下函数重定义,因为C库函数里面的标准输入输出函数printf、scanf是默认向标准输出设备(显示器),标准输入设备(键盘)来操作的,这里需要用到串口进行输入输出,所以需要修改一下标准输入输出函数中的实现方式。
这里引用零基础教程中的:
“在 C 语言标准库中,fputc 函数是 printf 函数内部的一个函数,功能是将字符 ch 写入到 文件指针 f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们 使用 USART 函数重新修改 fputc 函数内容,达到类似“写入”的功能。 fgetc 函数与 fputc 函数非常相似,实现字符读取功能。在使用 scanf 函数时需要注意字 符输入格式。 还有一点需要注意的,使用 fput 和 fgetc 函数达到重定向 C 语言标准库输入输出函数 必须在 MDK 的工程选项把“Use MicroLIB”勾选上,MicoroLIB 是缺省 C 库的备选库,它 对标准 C 库进行了高度优化使代码更少,占用更少资源。 为使用 printf、scanf 函数需要在文件中包含 stdio.h 头文件。”
所以我们自己来做fputc、fgetc,下面放代码:
int fputc(int ch, FILE *f)
{
USART_SendData(DEBUG_USARTx, ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return ch;
}
int fgetc(FILE *f)
{
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
在主函数实现如下
int main(void)
{
char ch = 0;
//初始化GPIO上发光的灯
LED_GPIO_Config();
//初始化USART,115200, 8-N-1
USART_ColorConfig();
//发送提示信息
Show_Message();
//SendByte( DEBUG_USARTx , 97);
while(1)
{
/* 获取字符指令 */
ch=getchar();
printf("接收到字符:%c\n",ch);
/* 根据字符指令控制RGB彩灯颜色 */
switch(ch)
{
case '1':
LED_RED;
break;
case '2':
LED_GREEN;
break;
case '3':
LED_BLUE;
break;
case '4':
LED_YELLOW;
break;
case '5':
LED_PURPLE;
break;
case '6':
LED_CYAN;
break;
case '7':
LED_WHITE;
break;
case '8':
LED_RGBOFF;
break;
default:
/* 如果不是指定指令字符,打印提示信息 */
Show_Message();
break;
}
}
}