STM32 HAL库快速实战【四】《串口简单使用》--基于黑龙江科技大学机电工业机器人实训

系列目录:

前言

后续电机以及蓝牙模块都需要用到串口,因此这里简单的先介绍下

配置CubeMX

可以使用上节配置好的demo复制后继续配置,也可以重新生成,这里不多赘述。
Pinout & Configuration > A-Z > USART1
Mode 选择异步,Asynchronous
波特率其他的可以不用变。
image
Pinout & Configuration > A-Z > NVIC
启用串口1中断
image
GENERATE CODE生成代码,Open Project

编写代码

首先要启用MicroLIB库
image

通过重写stdio函数,可以在32上使用printf输出以及getchar输入等函数。
先引入stdio库

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

然后重写fputc函数以及fgetc函数。注意,注释部分可以不用管。

/* USER CODE BEGIN 0 */

int fputc(int ch, FILE *stream)    //重写fputc函数
{
 /*
    huart1是工具生成代码定义的UART1结构体,
    如果以后要使用其他串口打印,只需要把这个结构体改成其他UART结构体。
	使用HAL_UART_Transmit时,可以直接调用,使用IT,DMA,VCP方式时,需要对返回值判断,不然会出现只能发送一个字节的情况。
	安全起见,建议全部使用while判断。
*/
	//HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1,1000);//轮询阻塞方式
	while(HAL_UART_Transmit_IT(&huart1, (unsigned char *)&ch, 1)!=HAL_OK){};//中断方式
    return 1;
}
int fgetc(FILE *f)
{
  uint8_t ch = 0;
	//HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//轮询阻塞方式
	while(HAL_UART_Receive_IT(&huart1, &ch, 1)!=HAL_OK){};
  return ch;
}

/* USER CODE END 0 */

实际上在这里使用了两种输入输出方法,即轮询以及中断,HAL_UART_Receive(&huart1, &ch, 1, 0xffff)是从huart1接收1个字符储存到ch,等待0xffffms,超时后结束
HAL_UART_Receive_IT(&huart1, &ch, 1)和上面一样,但是没有等待时间,执行后就结束,因此需要对返回值判断,接收成功后再继续执行其他代码。
然后就可以像再电脑运行c程序一样在32上执行一些代码。不同的是电脑输出到屏幕上,按键输入,32输入输出都在串口上。
下面是一个接收输入值并打印出来的代码。

  /* USER CODE BEGIN WHILE */
  int speed=500;
  char input;
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
	  __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed);//这个是之前舵机的代码,CubeMX重新生成的代码注意有没有配置定时器
	 HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);//这个是之前点灯的代码,CubeMX重新生成的代码注意有没有配置GPIO
	  speed+=3;
	  input=getchar();
	  printf("led togglePin,speed [%d],you input %c \r\n",speed,input);
	  
  }
  /* USER CODE END 3 */

串口通信

打开串口通信程序,选择对应串口及波特率等,打开串口后填入任意字符,发送后即在屏幕上打印出对应输出。
image

工程源码

国内用户请使用gitee克隆或是使用代理访问Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/uart

posted @ 2021-12-05 16:01  USTHzhanglu  阅读(828)  评论(0编辑  收藏  举报