STM32F4工程--串口--配置一个发送函数(详细版)

2023-05-16

STM32F4工程--串口--配置一个发送函数(库函数)

  ----芯片:STM32F429IGT6


目录:

一、初始化串口相关的参数

二、初始化串口IO口时钟等参数

三、函数声明

四、主函数(执行函数)

五、补充


一、初始化串口相关的参数

首先在usart.c文件中编写入下代码,稍后为大家解释如何得到的此函数。

#include "usart.h"                 //包含.h函数
UART_HandleTypeDef usrt1_handler;  //定义句柄
void uart1_init(void)              //自定义串口初始化函数
{
    usrt1_handler.Instance=USART1;                     //定义为串口1  
	usrt1_handler.Init.BaudRate=115200;                //波特率为115200
	usrt1_handler.Init.WordLength=UART_WORDLENGTH_8B;  //自长为8
	usrt1_handler.Init.StopBits=UART_STOPBITS_1;       //1位停止位
	usrt1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;  //不设置硬件流
	usrt1_handler.Init.Mode=UART_MODE_TX_RX;           //模式为收发模式
	usrt1_handler.Init.Parity=UART_PARITY_NONE;        //无奇偶检验位
	HAL_UART_Init(&usrt1_handler);                     //使能串口1
}

1、首先需要定义添加usart.h文件,我想这个大家都知道为什么。

#include "usart.h"

2、定义一个串口1初始化函数uart1_init(){},在这里编写一些串口的初始化语句。

在这个函数中,首先需要使能串口1,于是在函数中添加HAL_UART_Init();函数,这个函数声明在stm32f4xx_hal_usart.h,函数在stm32f4xx_hal_usart.c文件中,将.h文件中的HAL_UART_Init函数复制过去。如下图

这个函数的入口函数是一个结构体的指针地址。

#include "usart.h"
void uart1_init(void)
{
	HAL_UART_Init(UART_HandleTypeDef *huart);
}

3、右击HAL_UART_Init(UART_HandleTypeDef *huart);中的UART_HandleTypeDef,点击Go To Definition Of"......."

来找到这个结构体的定义。

4、这样我们就找到了这个结构体,结构体在stm32f4xx_hal_usart.h文件的第116行,这里定义的变量有很多,其中我们这次只用到其中的一部分。结构体如下图:

 这个结构体的 USART_TypeDef   *Instance;定义串口的基地址。UART_InitTypeDef     Init;  这个为定义串口初始化结构体,其余的为串口的收发以及DMA等的配置,在本例程中用不到,就先不解释了。

5、UART_HandleTypeDef usrt1_handler;

这个函数的意思是使用串口初始化结构体定义usrt1_handler变量。我们把它定义为全局变量。一般外设函数都有一个结构体指针,这个叫句柄,其他地方也会引用,故定义为全局变量。

#include "usart.h"

UART_HandleTypeDef usrt1_handler;
void uart1_init(void)
{
	HAL_UART_Init(UART_HandleTypeDef *huart);
}

6、HAL_UART_Init入口参数为指针类型,入口是一个地址,我们就将结构体的地址值赋给他,因为入口参数为一个地址,所以要在usrt1_handler前加取地址符号&。

#include "usart.h"

UART_HandleTypeDef usrt1_handler;
void uart1_init(void)
{
	HAL_UART_Init(&usrt1_handler);
}

7、现在我们只是定义了结构体,但是没有对结构体的成员变量进行初始化。下面我们将对串口结构体进行初始化。

首先是  usrt1_handler.Instance,Instance为USART_TypeDef结构体定义的变量。

右键点击USART_TypeDef,点击Go To Definition Of".......",寻找到他的定义。

好像也看不出什么。

快捷键Ctrl+F,在寻找USART_TypeDef还定义过那些,我们发现了USART1等等。我们将USART1赋值给Instance

于是有了

#include "usart.h"

UART_HandleTypeDef usrt1_handler;
void uart1_init(void)
{
	usrt1_handler.Instance=USART1;
	
	HAL_UART_Init(&usrt1_handler);
}

8、选好了串口1.我们将对串口1进行初始化,方法为:usrt1_handler.Init.=?,init为结构体UART_InitTypeDef所定义的变量,UART_InitTypeDef结构体的定义如下:

结构体中定义了波特率、字长、停止位、模式、硬件流控制、过采量等等,这才是串口外设的一些特性参数。

那么我们应该如何写来定义这些参数呢。

首先定义的为波特率,一般我们使用的为115200、9600都可以。这里使用的是115200.

其次定义的是字长,我们选择的是八位,那我们usrt1_handler.Init.WordLength=8;    我们这样直接等于8?这样合适吗,很显然是不正确的。

我们使用Ctrl+F快捷键,在stm32f4xx_hal_usart.c中搜索WordLength,我们可以搜索到如下语句。

我们查看一下IS_UART_WORD_LENGTH的定义,我们可以看到如下

这里我们可以看到我们可以选择UART_WORDLENGTH_8B和UART_WORDLENGTH_9B,我们这里选择的是UART_WORDLENGTH_8B

#include "usart.h"

UART_HandleTypeDef usrt1_handler;
void uart1_init(void)
{
	usrt1_handler.Instance=USART1;
	usrt1_handler.Init.BaudRate=115200;
	usrt1_handler.Init.WordLength=UART_WORDLENGTH_8B;
	HAL_UART_Init(&usrt1_handler);
}

9、我们可以用同样于字长定义的方法将下面一些参数进行定义,就可以得到本节最开始的那个函数。


二、初始化串口IO口时钟等参数

usart.c文件中编写入下代码

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
		GPIO_InitTypeDef GPIO_Initure;
    if(huart->Instance==USART1)
    {
			__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
			__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
		
			GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
			GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
			GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
			GPIO_Initure.Speed=GPIO_SPEED_HIGH;		//高速
			GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
			HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9

			GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
			HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
		}
}

1、这个函数我想大家都能看懂,但是大家可能想为什么使用这个函数名,因为这个函数在stm32f4xx_hal.c函数中有定义,并定义为__weak函数

在hal库中这个函数被HAL_UART_Init();函数所调用。

2、也正是因为被HAL_UART_Init函数所调用,于是我们在函数内添加了 if(huart->Instance==USART1) 来判断是否是串口1,如果是串口1,才会执行下面的IO等参数的初始化。


三、函数声明

usart.h文件中编写入下代码,来进行函数声明和句柄的引用。

#ifndef _USART_H
#define _USART_H
#include "sys.h"
#include "stdio.h"	

extern UART_HandleTypeDef usrt1_handler;
void uart1_init(void);
#endif

四、主函数(执行函数)

在main.c文件中加入如下代码

/**************************************************************************
**作者:        小丁工程               
**时间:        2020.10.19
***************************************************************************/
#include "sys.h"
//---------------------主函数-------------------------------------------------


int main(void)
{
    u8 p[]="test";
    HAL_Init();//========================初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);//======设置时钟,180Mhz
    delay_init(180);//===================初始化延时函数
    uart1_init();	
    while(1)
    {			
			HAL_UART_Transmit(&usrt1_handler,p,sizeof(p),1000 );
			delay_ms(300);	
		}
}
//---------------------end-----------------------------------------------------

HAL_UART_Transmit();函数为发送函数,入口参数有四个,基地址、数据、数据长度、最大等等时间。


五、补充

1、__weak函数为弱函数,意义为在没有用户函数的情况下执行此函数,当有用户定义此函数时,__weak函数视为没有。两个不冲突。

2、sizeof(),求字符串的长度。


(写此文章远远比想象的难,可能还有一些地方说的不是很清楚,非常欢迎私信和留言进行交流,如果对大佬您有帮助的话,还希望能给点个赞)(侵删)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4工程--串口--配置一个发送函数(详细版) 的相关文章

  • STM32F4应用DMA——串口收发不定长数据

    STM32F4应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 xff0c 可以减轻CPU负担 xff0c 只需设置一些参数即可发送想要发送的数据 xff0c 以下是STM32F407VE芯片测试过的部分代码 xff0c 可
  • 手把手入门stm32f4 (1)

    GPIO 1 一共有7组IO xff0c 每组有16个口 即一共有16 7 61 112个口 2 每个口基本上都可以触发中断 xff08 区别于51 xff0c 51只有P3 2 P3 2 xff09 3 共有8中输入输出模式 xff08
  • STM32F4无人机动力旋翼拉力测试

    更多交流欢迎关注作者抖音号 xff1a 81849645041 目的 了解无人机电调 电机转速 旋翼拉力与油门给定信号之间的关系 xff0c 可以通过相关设备进行拉力测试 实验原理 飞机旋翼绕旋翼旋转轴旋转时 xff0c 每个叶片的工作类同
  • STM32F4无人机6轴运动处理组件MPU6050

    目的 学习MPU6050的原理 MPU6050初始化方法 原理 MPU6050是9轴运动处理传感器 它集成了3轴MEMS陀螺仪 xff0c 3轴MEMS加速度计 xff0c 以及一个可扩展的数字运动处理器DMP xff08 Digital
  • FreeRTOS在STM32F4上移植

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第二章学习笔记 第一章笔记 FreeRTOS简介与源码下载 一 移植 1 准备工程文件 MCU用的是STM32F429的CORE xff0c 用keli创建一个基础工
  • STM32F4_串口通信详解

    目录 1 串口相关介绍及使用 1 1 串口设置的一般步骤 xff1a 1 1 1 串口时钟和GPIO时钟使能 1 1 2 设置引脚复用器映射 1 1 3 GPIO端口模式设置 1 1 4 串口参数初始化 1 1 5 开启中断并且初始化NVI
  • STM32F4教程从零开始0——从官网获取固件库

    从大二到现在玩stm32也有两年了 xff0c 估计以后用stm32 的机会不多了 xff0c 所以打算写一系列的教程来纪念一下陪我走过大学时光 xff0c 成为我的科技竞赛重要利器的STM32F4 这系列的教程将用stm32F407VGT
  • STM32F4 使用结构体配置功能

    1 IIC配置 void IIC Mode Config void I2C InitTypeDef I2C InitStructure I2C InitStructure I2C Mode 61 I2C Mode I2C IIC模式 I2C
  • STM32F4串口通信(UART)详解

    UART串口通信 我们在生活中处处都会接触到或者是用到通信 QQ 微信 电话 这些都是最常见的人与人之间远程无线通信的方式 那么也有像红外遥控 蓝牙数据传输等器件或硬件之间的通信 这些通信方式都有一些共同点 无线 易受干扰 信号变差 等 而
  • STM32F4配置内部时钟(HSI)

    STM32F4配置内部时钟 半年多没更新了 xff0c 今天配置F4的时候内部时钟问题整了2个小时 xff0c 记录下这个坑 有些板子由于没有贴外部晶振 xff0c 所以代码运行起来的时候时钟就会出问题 xff0c 本来配置的中断是1ms实
  • 玩转X-CTR100 l STM32F4 l BMP280气压计传感器

    我造轮子 xff0c 你造车 xff0c 创客一起造起来 xff01 塔克创新资讯 塔克社区 www xtark cn 塔克博客 www cnblogs com xtark 本文介绍X CTR100控制器 扩展BMP280气压计传感器 xf
  • STM32F4 UART基础(HAL库)

    文章目录 概述 96 UART 96 初始化 96 UART 96 参数初始化 96 UART 96 句柄 96 UART 96 初始化结构体 96 UART 96 参数初始化函数 96 UART 96 时钟初始化 96 UART GPIO
  • STM32F4 422串口通信

    STM32F429 422串口通信 422串口的硬件原理图如下 xff1a 422串口和232串口不同的是引脚的电平控制 xff0c 还有DE是发送使能 xff0c 置高即可 xff1a RE是接收使能 xff0c 置低即可 422接出来的
  • (转)stm32F4-----DMA的FIFO作用和用法

    在STM32F4系列中DMA增加了个FIFO 这个FIFO的作用是什么 xff1f 当我使能这个FIFO时 xff08 DMA InitStructure DMA FIFOMode 61 DMA FIFOMode Enable xff09
  • STM32F4中断(Interrupt)详解

    STM32F4中断 Interrupt 详解 文章目录 STM32F4中断 Interrupt 详解一 中断是什么 二 STM32的中断体系2 1 STM32的中断分类2 2 STM32中断优先级2 2 1 抢占优先级2 2 2 响应优先级
  • STM32F407的CAN通信实验CAN1CAN2的设置

    CAN2的初始化参照上一篇博文就OK了 需要修改的地方 配置过滤器 CAN FilterInitStructure CAN FilterNumber 14 那为什么要修改额 查datasheet 双 CAN CAN1 主 bxCAN 用于管
  • 家庭IOT监测之摄像头OV7670测试

    本篇目标 使用STM32F407驱动摄像头OV7670 并上位机显示照片结果 材料准备 STM32F4标准工程 stm32f407自建标准工程 stm32f4标准工程 git仓库地址 STM32F4摄像头测试工程 里面包含ov7670驱动文
  • 使用HAL库开发STM32:系统时间基础及进阶使用

    文章目录 目的 基础使用 进阶使用 总结 目的 HAL库默认提供了系统时间 系统时间默认情况下由SysTick定时器计数产生 系统时间一方面用于HAL库自身调用 另一方面用户也可以使用 为开发带来便利 本文提到的相关使用主要应用于未使用OS
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • STM32:从自定义引导加载程序跳转到应用程序时发生硬故障

    我正在开发带有自定义引导加载程序和应用程序的 STM32F401 MCU 编译器是GCC 5 2 1 没有运行优化 在以下跳转序列后的第一次中断后 我遇到了硬故障 引导加载程序 gt 应用程序 gt 引导加载程序 gt 应用程序 从引导加载

随机推荐

  • Ubuntu16.04搭建gitea1.14.1

    以下教程为在Ubuntu16 04上搭建gitea1 14 1 xff0c 同时附上官方教程链接 文章目录 1 数据库准备1 1 登录数据库1 2 创建gitea用户1 3 创建gitea数据库1 4 给gitea用户赋予数据库的权限1 5
  • ubuntu16.04搭建spice-html5用于配合KVM

    文章目录 0 配置需求1 启动spice客户端2 配置websockify3 配置spice html54 浏览器访问 0 配置需求 Firefox或Chrome浏览器 xff0c IE浏览器也可以 xff0c 但是效果不是太好 WebSo
  • python 数据挖掘中的数值计算

    一 环境安装 环境配置 xff1a OS xff1a Red Hat 4 4 7 11 查看命令 xff1a uname a xff1a 电脑以及操作系统的相关信息 cat proc version xff1a 正在运行的内核版本 cat
  • 银河麒麟下libguestfs-tools中virt工具无法使用情况

    银河麒麟下libguestfs tools中virt工具无法使用情况 问题描述 xff1a 在银河麒麟高级服务器版本V10下安装libguestfs tools工具包后 xff0c 使用virt xx等一系列命令都会出现以下错误 xff1a
  • ubuntu16.04搭建containerd

    本博客具体介绍在ubuntu16 04下安装containerd的过程 xff0c 有关ctr的命令都要有root权限才能运行 搭建过程 下载containerd安装包解压containerd安装包到根目录下启动containerd并设置开
  • KVM安装Windows11系列(一)

    本教程系列为KVM安装Windows11 xff0c 会分成两部分 xff0c 第一部分会跳过Windows11的硬件要求TPM和安全启动 xff0c 第二部分会安装TPM模拟器进行模拟 文章目录 软件环境下载Windows11镜像和驱动创
  • 容器技术对比(Docker/LXC/LXD/Multipass)

    DockerLXCLXDMultipass基本介绍为了打破 程序即应用 的观念 xff0c 通过镜像imges将作业系统核心除外 xff0c 运作应用程序所需的系统环境 xff0c 由下而上打包 xff0c 达到应用程序跨平台间的无缝接轨运
  • KVM虚拟机配置静态IP(一):Ubuntu16.04

    该系列文章为制作KVM虚拟机镜像的同时配置静态IP xff0c 为用户直接提供好固定IP xff0c 无需手动配置 系列文章目录 Ubuntu16 04Ubuntu18 04Centos6Centos7 文章目录 系列文章目录软件环境一 安
  • KVM虚拟机配置静态IP(二):Ubuntu18.04

    该系列文章为制作KVM虚拟机镜像的同时配置静态IP xff0c 为用户直接提供好固定IP xff0c 无需手动配置 系列文章目录 Ubuntu16 04Ubuntu18 04Centos6Centos7 文章目录 系列文章目录软件环境一 安
  • KVM虚拟机配置静态IP(三):Centos6

    该系列文章为制作KVM虚拟机镜像的同时配置静态IP xff0c 为用户直接提供好固定IP xff0c 无需手动配置 系列文章目录 Ubuntu16 04Ubuntu18 04Centos6Centos7 文章目录 系列文章目录软件环境一 安
  • KVM虚拟机配置静态IP(四):Centos7

    该系列文章为制作KVM虚拟机镜像的同时配置静态IP xff0c 为用户直接提供好固定IP xff0c 无需手动配置 系列文章目录 Ubuntu16 04Ubuntu18 04Centos6Centos7 文章目录 系列文章目录软件环境一 安
  • KVM下Ubuntu18.04打开设置注销问题

    问题描述 xff1a 在KVM中创建Ubuntu18 04 xff0c 打开系统设置 xff0c 发现直接注销 xff08 不是锁屏 xff0c 因为所有程序都退出 xff09 解决思路 在google上搜索发现大多数都是指向显卡问题 xf
  • cloud-init中NoCloud配置

    本文章主要记录cloud init工具中NoCloud数据源的使用方法 xff0c 可以搭配KVM镜像制作系列文章 xff0c 为用户定制操作系统 文章目录 NoCloud使用方法1 安装并初始化文件2 修改cloud init配置文件3
  • winform界面设计

    来自于以下两个地址 xff0c 为便于查阅 xff0c 所以全复制到了自己的BLOG xff1a http dotnet chinaitlab com VCNET 436373 html http www aspxboy com priva
  • cloud-init离线安装编程环境

    本博客主要介绍通过cloud init工具实现在Ubuntu16 04操作系统和KVM虚拟化技术下实现创建虚拟机同时离线安装编程环境 文章目录 1 准备离线安装包1 xff09 下载软件包2 xff09 创建放置软件包的磁盘3 xff09
  • openEuler22.03安装zabbix4.0

    以下教程为openEuler22 03安装zabbix4 0 xff0c 主要原因是openEuler官方和zabbix官方提供的提供的软件源中没有相关软件 xff0c 因此需要使用zabbix源码进行编译 xff0c 并且安装过程中会出现
  • 1.2 SingleThreadExecutor

    线程池工具类给我们提供了一些常见的线程池 xff0c 这篇来谈一谈SingleThreadExecutor线程池 使用方式 创建方式比较简单 xff0c 直接使用工具创建就ok xff0c Executors newSingleThread
  • pycharm终止代码运行时报错:进程已结束,退出代码137 (interrupted by signal 9: SIGKILL)

    在pycharm中调试代码 xff0c 终止时报错 xff1a 进程已结束 退出代码137 interrupted by signal 9 SIGKILL 网上查找时 xff0c 遇到这个问题的一般是训练网络时的内存不足 xff0c 进程被
  • 【多机多卡】mmsegmentation训练报错“RuntimeError: NCCL error in: /opt/pytorch/pytorch/torch/csrc/distributed/”

    多机多卡训练代码 xff1a 报错信息 xff1a RuntimeError NCCL error in opt pytorch pytorch torch csrc distributed c10d ProcessGroupNCCL cp
  • STM32F4工程--串口--配置一个发送函数(详细版)

    STM32F4工程 串口 配置一个发送函数 xff08 库函数 xff09 芯片 xff1a STM32F429IGT6 目录 一 初始化串口相关的参数 二 初始化串口IO口时钟等参数 三 函数声明 四 主函数 xff08 执行函数 xff