IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 CubeMX 串口通信 -> 正文阅读

[嵌入式]STM32 CubeMX 串口通信

上一篇文章中已经介绍了CubeMX的基本使用方法了,本文将实现串口通信

实验工具

单片机:正点原子STM32F4探索者
软件:CubeMX、Keil5
参考文档:
《STM32F4xx中文参考手册》
《正点原子 STM32F4 开发指南V1.2–HAL 库版本 》
ST32 HAL库使用手册

硬件配置

经过上一次实验的学习已经知道了CubeMX的美妙之处,只需要点击几下鼠标就可以跳过繁琐的硬件配置步骤,让我们能把经理集中到功能代码的设计上。本次实验将继续使用CubeMX实现单片机的串口通信。
时钟配置不过多介绍,和上一次配置的一样。
在这里插入图片描述
串口配置
这里的串口模式选择异步通信,下方的参数设置根据自己的需求进行设置,每一个参数的设置以及带来的作用 stm32f4的参考手册里都写的很清楚,需要详细了解可以下载手册进行学习。
右侧的引脚要注意是否是自己需要用到的引脚,因为存在引脚复用的情况,有时候出现引脚被占用或者其他时,软件可能会用其他引脚复用去实现。

配置选项卡的中断设置需要打开,在串口接收是我们需要用到中断。
在这里插入图片描述

代码添加

HAL库中使用到的串口收发函数,函数都可以在HAL库的手册中找到,有兴趣可以下载手册进行详细了解
在这里插入图片描述

串口发送

以下代码添加到stm32f4xx_hal.c中,不清楚添加到其他c文件中能不能起效。
重定向printf,代码是我在网上找到的,怎么就实现printf我还不是很明白

//添加以下代码可以实现的printf
#include "stdio.h"// 这个头文件需要在使用到printf的地方调用
#if SYSTEM_SUPPORT_OS
#include "includes.h"					  
#endif

#if 1
#pragma import(__use_no_semihosting)             
               
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       

void _sys_exit(int x) 
{ 
	x = x; 
} 

int fputc(int ch, FILE *f)
{ 	
	while((USART1->SR&0X40)==0);
	USART1->DR = (uint8_t) ch;      
	return ch;
}
#endif 

发送信息

  while (1)
  {
    /* USER CODE END WHILE */
			printf("Hello World!\r\n");
			HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

在串口助手下成功接收到信息(第一行是我连接的LCD屏初始化返回的信息)
在这里插入图片描述

串口接收

HAL的串口中断调用比较繁琐,
下图摘自 正点原子 STM32F4手册
这个流程我们可以从stm32f4xx_it.c中的USART1_IRQHandler()函数找起
在这里插入图片描述
main.c中添加定义

#include "stdio.h"
#include "string.h"
#define RXBUFFERSIZE  256     
char RxBuffer[RXBUFFERSIZE];  
uint8_t aRxBuffer;	//接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;

在主函数中需要调用一次接收中断,进入中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, size),
size指多少个字节执行一次回调函数接下来就会按照上图流程进行

最后在main.c 中设置回调函数,通过串口发送给单片机的数据回被发回

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //超过接收限制
	{
		Uart1_Rx_Cnt = 0;
		memset(RxBuffer,0x00,sizeof(RxBuffer));
		HAL_UART_Transmit(&huart1, (uint8_t *)"data over", 10,0xFFFF); 	
        
	}
	else
	{
		RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;   // 转存数据
		if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D))
		 //检查回车,有回车说明接收结束,这里也可以根据需求设置其他结束符号
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //发送接收数据
            while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//等待
			Uart1_Rx_Cnt = 0;
			memset(RxBuffer,0x00,sizeof(RxBuffer)); //
		}
	}
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //注意这里需要再次调用中断,否则中断只能执行一次
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:12:15  更:2022-09-24 21:14:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 14:05:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码