stm32(3)学习UART接收发送/发送指令

一、uasrt
1.基础常识
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述2.结构体
在这里插入图片描述1) USART_BaudRate:波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV 值, 见公式 20-1 , 并设置USART_BRR 寄存器值。
2) USART_WordLength:数据帧字长,可选8 位或9 位。它设定USART_CR1 寄存器的M 位的值。如果没有使能奇偶校验控制,一般使用8 数据位;如果使能了奇偶校验则一般设置为9 数据位。
3) USART_StopBits:停止位设置,可选0.5 个、1 个、1.5 个和2 个停止位,它设定USART_CR2 寄存器的STOP[1:0]位的值,一般我们选择1 个停止位。
4) USART_Parity : 奇偶校验控制选择, 可选USART_Parity_No( 无校验) 、USART_Parity_Even( 偶校验) 以及USART_Parity_Odd( 奇校验) , 它设定USART_CR1 寄存器的PCE 位和PS 位的值。
5) USART_Mode:USART 模式选择,有USART_Mode_Rx 和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1 寄存器的RE 位和TE 位。
6) USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有⑴使能RTS、⑵使能CTS、⑶同时使能RTS 和CTS、⑷不使能硬件流。
当使用同步模式时需要配置SCLK 引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef 来设置,因此该结构体内容也只有在同步模式才需要设置。

在这里插入图片描述在这里插入图片描述实验一:USART1 接发通信实验

开发板与电脑通信,在开发板上电时通过USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。
在这里插入图片描述在这里插入图片描述

创建了两个文件:bsp_debug_usart.c 和bsp_debug_usart.h 文件用来存放USART 驱动程序及相关宏定义。
根据表20-3,我们选择usart1,用PA10,PA9作为复用引脚。

  1. 编程要点
  1. 使能RX 和TX 引脚GPIO 时钟和USART 时钟;
  2. 初始化GPIO,并将GPIO 复用到USART 上;
  3. 配置USART 参数;
  4. 配置中断控制器并使能USART 接收中断;
  5. 使能USART;
  6. 在USART 接收中断服务函数实现数据接收和发送。

在这里插入图片描述配置嵌套向量中断器
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述发送一个字节完成,TXE置1,发送一串字符串完成,TC置1。接收一个字节,RXNE置1(recieve not empty)

/***************** 发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 发送一个字节数据到USART */
	USART_SendData(pUSARTx,ch);
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
}
/***************** 发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
	
	do 
	{
		Usart_SendByte( pUSARTx, *(str + k) );
		k++;
	} while (*(str + k)!='\0');
	/* 等待发送完成 */
	while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);//字符串的接收就要用到所有字节全部发送完成	

2.利用串口发送指令
如果用上面的工程,记得把中断全部注销了!!!中断的优先级比printf()高。
实现的功能是先打印出具体的要求,然后我输入一个字符,根据我的字符单片机做出相应的反应。
取而代之的是用C 语言标准库,fputc 函数是printf 函数内部的一个函数,功能是将字符ch 写入到
文件指针f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们
使用USART 函数重新修改fputc 函数内容,达到类似“写入”的功能。
fgetc 函数与fputc 函数非常相似,实现字符读取功能。在使用scanf 函数时需要注意字
符输入格式。

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到串口 */
		USART_SendData(DEBUG_USART, (uint8_t) ch);
		
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
		/* 等待串口输入数据 */
		while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USART);
}

main函数里面写打印的具体内容和判断字符后的具体操作。

static void Show_Message(void);
  
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	
  char ch;
  
  /* 初始化RGB彩灯 */
  LED_GPIO_Config();
  
  /* 初始化USART 配置模式为 115200 8-N-1 */
  USARTx_Config();
	
  /* 打印指令输入提示信息 */
  Show_Message();
  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;      
    }   
	}	
}

/**
  * @brief  打印指令输入提示信息
  * @param  无
  * @retval 无
  */
static void Show_Message(void)
{
  printf("\r\n   这是一个通过串口通信指令控制RGB彩灯实验 \n");
  printf("使用  USART1  参数为:%d 8-N-1 \n",USARTx_BAUDRATE);
  printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");
  printf("   指令   ------ 彩灯颜色 \n");
  printf("     1    ------    红 \n");
  printf("     2    ------    绿 \n");
  printf("     3    ------    蓝 \n");
  printf("     4    ------    黄 \n");
  printf("     5    ------    紫 \n");
  printf("     6    ------    青 \n");
  printf("     7    ------    白 \n");
  printf("     8    ------    灭 \n");  
}

版权声明:本文为avalovef原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。