前言

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

配置CubeMX

可以使用上节配置好的demo复制后继续配置,也可以重新生成,这里不多赘述。
Pinout & Configuration > A-Z > USART1
Mode 选择异步,Asynchronous
波特率其他的可以不用变。

Pinout & Configuration > A-Z > NVIC
启用串口1中断

GENERATE CODE生成代码,Open Project

编写代码

首先要启用MicroLIB库

通过重写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 */

串口通信

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

工程源码

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