系列目錄:
-
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