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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 -> 正文阅读

[嵌入式]STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

基于STM32H743VI
使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。

此次工程效果:串口115200波特率,接收串口助手XCOM发送的数据并发送回XCOM

本次配置的工程链接在最下方,有需要自取。
0基础可以从第一个教程开始阅读
STM32CUBEMX配置教程(一)基础配置
STM32CUBEMX配置教程(二)时钟等内部参数配置
STM32CUBEMX配置教程(三)通用GPIO配置
STM32CUBEMX配置教程(四)定时器中断配置
STM32CUBEMX配置教程(五)高级定时器输出两路PWM波
STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)
STM32CUBEMX配置教程(七)定时器DMA产生占空比可调方波

1 新建工程

参考STM32CUBEMX配置教程(一)基础配置

2 修改时钟树

参考STM32CUBEMX配置教程(二)时钟等内部参数配置

3 串口基本原理

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

上述来自百度,串口在调试时有很大作用

4 CUBEMX配置

此处使用串口1作为测试工具,具体来说使用PA9和PA10作为串口发送引脚。
在新建的工程里面配置PA9和PA10分别为串口的发送与接收引脚,如下图所示,此时引脚显示为黄色,表示暂未激活。在这里插入图片描述
下一步需要对串口模式进行选择以激活,找到Connectivity下的USART1选项并点击,界面如下:
在这里插入图片描述
在右上角配置界面的第一个配置为异步通信模式即可,即为Asynchronous。除了通讯模式的配置外,此界面还有一些常用工业接口(RS232\RS585)的硬件流控,在此无需使用。配置图如下:
在这里插入图片描述
在配置为异步通信模式后,引脚变为绿色,表示已经配置:
在这里插入图片描述
配置界面右下角也会出现具体的配置框,如下图,我这边默认波特率为115200,如果不是这个数值则修改为这个数值即可,其他参数不用修改:
在这里插入图片描述
到此配置基本结束,点击生成代码。

5 使用库自带函数发送数据

库所自带的发送函数为:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

此函数的输入为句柄、要发送的数据的指针、数据的大小、超时的时间

下面以此函数发送HELLO WORLD到串口助手XCOM:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  unsigned char s_buf[]="hello world\r\n";
  while (1)
  {
		HAL_UART_Transmit(&huart1,s_buf,sizeof(s_buf),0xff);
		HAL_Delay(1000);
  }
}

看看结果,测试成功:
在这里插入图片描述

6 使用重定义后的printf发送数据

大多数人喜欢使用重定义后的printf发送数据,但是这种方式的效率较为低下,因为在重定义时数据的发送是一个字节一个字节发送的,也就是每发送一个字节就会调用一次HAL_UART_Transmit函数。

先在左侧找到usart.c这个c文件并打开:
在这里插入图片描述
在这个文件中的最后的用户代码区添加代码,用户代码区如下(不在这里添加在CUBEMX重新生成代码的时候会被覆盖):
在这里插入图片描述
添加后如下,如果报错FILE没有定义需要添加头文件#include “stdio.h”

/* USER CODE BEGIN 1 */

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#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)
{ 	
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  
	return ch;
}
#endif 

/* USER CODE END 1 */

那么重定义就已经完成。下一步进行printf的调用,修改while(1)中的代码如下则完成。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		printf("hello");
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

效果图片如下:
在这里插入图片描述

6 使用优化后的(类)printf发送数据

大家使用Printf只是因为这个函数比较方便。
但是如果一个和printf一样方便更加高效的函数岂不是可以完全取代printf。
但是大家显然更关注简单而忽略高效,简单对刚刚入门的人来说很重要,但对有经验的人来说高效才是更应该追求的。

找到usart.c这个c文件并打开:
先在这个文件里面添加头文件:#include <stdarg.h>
然后再用户代码区添加:

void Usart1Printf(const char *format,...)
{
	unsigned char UartTxBuf[128]; 
	uint16_t len;
	va_list args;	
	va_start(args,format);
	len = vsnprintf((char*)UartTxBuf,sizeof(UartTxBuf)+1,(char*)format,args);
	va_end(args);
	HAL_UART_Transmit(&huart1, UartTxBuf, len,0xff);
}

这个函数与重定义的区别就是此函数可以将多个字符一下子全部发送,而非一个一个发送:
这个函数可以完全当成printf使用。
例如:

  while (1)
  {
		Usart1Printf("hello");
		Usart1Printf("hello%d",10);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

效果如下:
在这里插入图片描述

7 串口接收

暂未写完

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:54:10  更:2021-07-30 12:55:57 
 
开发: 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年12日历 -2024/12/27 9:46:48-

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