USART学习(二)

前言:本文章承接“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;      
    }   
	}	

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值