STM32L051使用HAL库操作实例(4)-串口实验
一、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)
思路:使用中断控制方式,当串口接收到数据时,再将接收到的数据发送出去
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟
3.设置GPIO口(本例使用的为串口1,板载自带USB转串口芯片)
4.串口配置
①模式配置
②串口参数配置
③因为程序使用的是中断处理,所以还需要打开NVIC Settings页面,使能中断
④串口引脚配置
5.配置STM32CubeMX生成工程文件
6.点击GENERATE CODE生成工程文件
二、KEIL程序
1.串口相关函数说明:
- 串口发送/接收函数
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
-
串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用
2.程序编写
1.在main.c文件中定义2个数组,用于发送及存放数据内容;
/* USER CODE BEGIN Includes */
uint8_t aTxBuffer[]="\r\n*********串口发送数据*********\r\n";
uint8_t aRxBuffer[1]; // 用来接收串口1发送的数据
/* USER CODE END Includes */
2.由于要使用printf,所以需要重定义,USART.C文件中;
#include "stdio.h" //这个一定不能忘
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕
USART1->TDR = (uint8_t) ch;
return ch;
}
#endif
3.重新编写串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{
if(huart->Instance == USART1) // 判断是由哪个串口触发的中断
{
HAL_UART_Transmit(&huart1,aRxBuffer,1,100); // 接收到数据马上使用串口1发送出去
HAL_UART_Receive_IT(&huart1,aRxBuffer,1); // 重新使能串口1接收中断
}
}
4.main.c函数添加如下;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit_IT(&huart1 ,aTxBuffer,sizeof(aTxBuffer)); //sizeof()可读取目标数组长度
HAL_UART_Receive_IT(&huart1,aRxBuffer,1);
printf("\r\nSTM32L051C8T6 开发板串口实验\r\n");
printf("\r\n请输入数据\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //LED1
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.编译文件,下载。即可实现串口收发状态(开发板串口拨码开关不要忘了打开(* ̄︶ ̄))
上一篇: 你们男人最看中女孩子哪点
下一篇: Android面试题: 抽象类和接口解析