STM32 HAL库快速实战【四】《串口简单使用》--基于黑龙江科技大学机电工业机器人实训
系列目录:
-
STM32 HAL库快速实战【一】《32点灯》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【三】《pwm控制舵机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【四】《串口简单使用》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【五】《控制串口电机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
前言
后续电机以及蓝牙模块都需要用到串口,因此这里简单的先介绍下
配置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