在这里插入图片描述


👨‍💻个人主页:@开发者-削好皮的Pineapple!

👨‍💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 削好皮的Pineapple! 原创

👨‍💻 收录于专栏:C语言到基于STM32 的智能矿探小车


请添加图片描述

请添加图片描述

文章目录

    • 🎶一、UART通信
    • 🎶二、基于STM32F407固件库UART的配置流程
        • 2.1 时钟使能
        • 2.2 GPIO的配置
        • 2.3 把GPIO复用成对应的串口
        • 2.4 串口初始化
        • 2.5 串口中断的配置
        • 2.6 NVIC的配置
        • 2.7 打开串口
        • 2.8 中断服务函数的格式
        • 2.9串口接收数据/发送数据的接口
    • 🎶三、HC05模块
        • 结束语🥇


前言
-本文是对UART通信、基于STM32F407固件库UART的配置流程以及HC05模块相关知识的笔记总结,涵盖了通信的基本概念、配置步骤和模块使用等内容,旨在为后续的嵌入式开发提供参考。


🎶一、UART通信


  • UART 是异步全双工串行通信。
  • 通信的前提:通信双方要同步。
    • 同步机制和异步机制的区别在于通信双方是否有相同的参考(时钟线)。
      • 有通用时钟线属于同步机制。
      • 没有通用时钟线属于异步机制。
    • 异步:通信双方没有通用时钟线,通信双方需要提前约定用相同的波特率进行通信。
  • 单工通信:A 单向发送数据到 B(A ----> B)。
  • 双工通信:
    • 半双工通信:接收数据和发送数据不能够同时进行(A ------> B 与 A <------ B 不同时)。
    • 全双工通信:接收数据和发送数据可以同时进行(A ------> B 与 A <------ B 同时)。
  • 串行:发送/接收数据只用了一根数据线,每次只能 1bit 1bit 发送/接收。
  • 支持串口(UART)通信的设备通常具有如下引脚:
    设备A设备B
    TxRx
    RxTx
    VCCVCC
    GNDGND
  • 对于STM32F407本次使用的开发板上提供了三个UART引脚:P4(UART1)、P5(UART2)和P6(UART3)处。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

🎶二、基于STM32F407固件库UART的配置流程


2.1 时钟使能
  • 使能对应GPIO时钟:RCC_AHB1PeriphClockCmd
  • 使能对应的USARTx(USART1、USART2和USART3)时钟:
    • 对于USART1,应该使用 RCC_APB2PeriphClockCmd
    • 对于USART2和USART3,应该使用 RCC_APB1PeriphClockCmd
2.2 GPIO的配置
  • 使用 GPIO_Init 函数配置。
    • Tx:复用模式,推挽模式。
    • Rx:复用模式,浮空模式。
  • 注意:对于通信一般选择高速电平切换。
2.3 把GPIO复用成对应的串口
  • 使用 GPIO_PinAFConfig 函数,函数格式为:GPIO_PinAFConfig(GPIO_TypeDef * GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
    • GPIOx:指定具体的GPIO组号,如GPIOA、GPIOB等。
    • GPIO_PinSource:指定具体的引脚编号,如GPIO_PinSource0、GPIO_PinSource1……GPIO_PinSource15。
    • GPIO_AF:指定具体要复用成的功能,如GPIO_AF_USART1(复用成串口1的引脚)、GPIO_AF_USART2(复用成串口2的引脚)等。
  • 注意:该接口不支持位或。例如UASRT1的Tx接PA9,Rx接PA10时,配置如下:
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_UASRT1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10 , GPIO_AF_UASRT1);
    
2.4 串口初始化
  • 使用 USART_Init 函数,函数格式为:USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef * USART_InitStruct)
    • USARTx:指定具体的串口,如USART1、USART2、USART3。
    • USART_InitStruct 结构体成员:
      • USART_BaudRate:指定具体的波特率,如115200、9600等。
      • USART_WordLength:指定数据位,常用 USART_WordLength_8b
      • USART_StopBits:指定停止位,常用 USART_StopBits_1
      • USART_Parity:奇偶校验位,常用 USART_Parity_No(无校验),还有USART_Parity_Even(偶校验)、USART_Parity_Odd(奇校验)。
      • USART_Mode:指定串口模式,USART_Mode_Rx(接收数据)、USART_Mode_Tx(发送数据)、USART_Mode_Rx | USART_Mode_Tx(收发数据)。
      • USART_HardwareFlowControl:硬件控制流,常用 USART_HardwareFlowControl_None(无控制流)。
2.5 串口中断的配置
  • 使用 USART_ITConfig 函数,函数格式为:USART_ITConfig(USART_TypeDef * USARTx, uint16_t USART_IT, FunctionalState NewState)
    • USARTx:指定具体的串口,如USART1、USART2、USART3。
    • USART_IT:指定触发因素,如 USART_IT_RXNE(接收数据触发中断)。
    • NewStateENABLE(使能)。
2.6 NVIC的配置
  • 使用 NVIC_Init 函数,中断通道分别为 USART1_IRQnUSART2_IRQn 等。
2.7 打开串口
  • 使用 USART_Cmd 函数,函数格式为:USART_Cmd(USART_TypeDef * USARTx, FunctionalState NewState)
    • USARTx:指定具体的串口,如USART1、USART2、USART3。
    • NewStateENABLE(使能)。
2.8 中断服务函数的格式
  • 以USART1为例:
    void USART1_IRQHandler(void)
    {if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET) //接收到数据{//...USART_ClearITPendingBit( USART1,  USART_IT_RXNE);}
    }
    
2.9串口接收数据/发送数据的接口
  • 接收数据:

    USART_ReceiveData(USART_TypeDef * USARTx)
    
    • USARTx:指定用什么串口接收数据,如USART1、USART2、USART3。
    • 返回值:返回接收到的数据。
    • 说明:由于不能预料对方什么时候发送数据,一般开启串口接收数据的中断,该接口一般在中断服务函数中调用。
  • 发送数据:

    USART_SendData(USART_TypeDef * USARTx, uint16_t Data)
    
    • USARTx:指定用什么串口发送数据,如USART1、USART2、USART3。
    • Data:要发送的数据。
  • 相关配置修改:

    • smt32f4xx.h 的第144行 HSE_VALUE 为8000000。
    • system_stm32f4xx.c 的第371行把25修改成8即可。
    • 串口1用来下载程序,可按照串口1的配置流程,实现串口2和串口3的配置。
#include "stm32f4xx.h"
#include "uart.h"//串口1为例 Tx (PA9) Rx(PA10)
void uart_init(int bond)
{GPIO_InitTypeDef  GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef  NVIC_InitStruct;//1.时钟使能RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//2.GPIO初始化//TX 复用推挽GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA, & GPIO_InitStruct);//RX 复用浮空GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA, & GPIO_InitStruct);//3.把GPIO复用成对应的功能GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_USART1);GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_USART1);//4.串口初始化USART_InitStruct.USART_BaudRate = bond;//指定波特率USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStruct);//5.串口接收数据中断USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);//6.NVIC的配置NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStruct);//7.打开串口USART_Cmd( USART1, ENABLE);
}u8 recv; //串口1接收数据//串口中断服务函数
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET) //接收到数据{recv = USART_ReceiveData(USART1);USART_SendData(USART1, recv);USART_ClearITPendingBit( USART1,  USART_IT_RXNE);}
}
#ifndef __UART_H__
#define __UART_H__
#include "stm32f4xx.h"//串口1为例 Tx (PA9) Rx(PA10)
void uart_init(int bond);extern u8 recv;#endif

🎶三、HC05模块


  • HC05模块与单片机的连接:
    HC05模块单片机
    VCC5V
    GNDGND
    TXD(发送数据的引脚)单片机的RX
    RXD(接收数据的引脚)单片机的TX

在这里插入图片描述

  • 蓝牙的相关信息:

    • 蓝牙的连接密码:1234。
    • 蓝牙的设备名称:需要通过AT指令修改。
  • 修改蓝牙设备名称的方法:

    1. 接线:
      • VCC ----------- P4处的5V
      • GND ----------- P4处的GND
      • TX ---------- UART1处的1号引脚
      • RX ---------- UART1处的2号引脚
    2. 如果按住按钮发送没有反应:
      • 按住按钮重新给蓝牙模块上电,直到蓝牙模块上的指示灯闪烁变慢,说明此时进入了AT指令模式。
      • 把波特率更改成38400,再尝试发送 AT+NAME=XXX【回车】。
  • 注意:请用手机配对自己的蓝牙设备,为了避免麻烦,蓝牙建议使用串口2或者串口3。

  • 工作原理:

    • 手机与蓝牙模块通过无线信号连接,蓝牙模块和单片机之间通过串口(USART2、USART3)通信。
    • 手机发送给蓝牙模块的数据,蓝牙模块会完完整整的通过串口发送给单片机。
    • 连接方式为 TX -------------- RX,RX -------------- TX。
    • 在主函数直接调用,用手机蓝牙串口APP控制小车的运动状态。
#include "stm32f4xx.h"
#include "exit.h"
#include "car.h"
#include "delay.h"
//#include "remote.h"
#include "uart.h"
#include "led.h"// 声明全局变量recv
extern uint8_t recv;int main(void) {SystemInit();car_init();//remote_Init();delay_init();  // 初始化定时器led_init();uart_init(9600);  // 初始化串口通信while(1) {if(recv == '1') {led_ctrl(D4, ON);}else if(recv == 'F') {car_up();}else if(recv == 'B') {car_back();}else if(recv == 'L') {car_left();}else if(recv == 'R') {car_right();}else if(recv == 'S') {car_stop();}delay_ms(1);  // 实现实时循环,控制循环频率}
}

在这里插入图片描述


结束语🥇

🔥 订阅专栏持续学习:C语言到基于STM32的智能矿探小车
💬 欢迎点赞、收藏、留言讨论,一起攻克嵌入式开发!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88924.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88924.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88924.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计总监的“轻量化”新武器:用Adobe Express,音频一键驱动动画

在快节奏的创意项目中&#xff0c;如何将复杂的设计理念或冗长的研究报告&#xff0c;快速转化为易于理解、富有吸引力的动态内容&#xff0c;是衡量一个团队沟通效率的关键。作为一名在海外设计界工作了十余年的设计师&#xff0c;我发现&#xff0c;最高效的团队&#xff0c;…

零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

✔零知开源是一个真正属于国人自己的开源软硬件平台&#xff0c;在开发效率上超越了Arduino平台并且更加容易上手&#xff0c;大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码&#xff0c;让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品&…

Linux流量分析:tcpdump wireshark

前言 最近因为工作需要&#xff0c;研究了下如何使用tcpdump和wireshark分析业务流量。如果要使用tcpdump分析具体的HTTP请求耗时&#xff0c;需捕获网络数据包并分析时间戳信息&#xff0c;重点关注TCP连接的建立、HTTP请求发送到响应接收的全过程。 以下是具体步骤和技巧&…

深度学习图像分类数据集—角膜溃疡识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;角膜溃疡识别分类&#xff1a;[dot, mix, slice] 训练数据集总共有270张…

功能强、超好用【PDF转换工具】的介绍下载与安装教程

Windows 电脑上一款简单好用的PDF转换工具&#xff0c;可以轻松地将其他文档转换为 PDF 格式&#xff0c;也可以将 PDF 文件转换为其他格式&#xff0c;如常见的 Word、Excel、PPT 等。 此外软件还支持 Office 文档合并分割、旋转页面、拼接页面、删除文字、删除页面、添加水印…

c# 钉钉应用实现监听审批事件以及获取审批结果的流程

oa的操作已经测试了一遍 image.png如果是自建oa则代表发起的审批是跳转网页&#xff0c;否则钉钉打开后是一个表单界面&#xff0c;不需要调整自己搞得oa。 所以我感觉目前公司的需求更适合官方oa 表单来填写,更灵活&#xff0c;还支持用户配置。 但是用户点了审批&#xff0c;…

Typecho架构深度剖析:轻量级博客系统的设计哲学与实现原理

文章目录 深度解析Typecho:轻量级博客系统的架构设计与实现1. Typecho概述与技术背景1.1 发展历程1.2 核心特性2. 系统架构设计分析2.1 核心架构图2.2 核心组件3. 核心模块实现分析3.1 路由系统实现3.2 数据库抽象层4. 插件系统深度解析4.1 Hook机制实现4.2 插件开发示例5. 性…

LangChain 内存(Memory)

1. 为什么需要内存&#xff1f; 大型语言模型&#xff08;LLM&#xff09;本身是无状态的。这意味着每次你向 LLM 发送一个请求&#xff08;Prompt&#xff09;&#xff0c;它都会独立处理这个请求&#xff0c;完全不记得之前任何的交互。这在构建一次性问答应用时没问题&#…

基于定制开发开源AI智能名片S2B2C商城小程序的社群游戏定制策略研究

摘要&#xff1a;本文聚焦社群游戏定制领域&#xff0c;深入探讨以社群文化和用户偏好为导向的定制策略。通过分析互动游戏活动、社群文化塑造等关键要素&#xff0c;结合定制开发开源AI智能名片S2B2C商城小程序的技术特性&#xff0c;提出针对性游戏定制方案。研究旨在提升社群…

自动驾驶决策与规划

目录 自动驾驶决策与规划概述 决策与规划体系结构 分层递阶式决策规划 反应式体系结构 混合式体系结构 决策与规划系统的关键环节 路径规划 轨迹规划 行为决策 异常处理 自动驾驶的路径规划技术 维诺图法 栅格法 Dijkstra算法 A*算法 自动驾驶的行为决策方法 …

C++编译期计算:常量表达式(constexpr)全解析

在C性能优化领域&#xff0c;"将计算尽可能转移到编译期"是一条黄金法则。编译期计算&#xff08;Compile-Time Computation&#xff09;能显著减少程序运行时的开销&#xff0c;提升执行效率&#xff0c;同时还能在编译阶段暴露潜在错误。C11引入的constexpr关键字及…

【micro:bit】从入门到放弃(一):在线、离线版本的使用

1、离线版 micro:bit 1)下载地址 https://makecode.microbit.org/offline-app 2)双击安装包,makecode-microbit-setup-win64.exe,自动安装,安装成功后图标如下图所示 3)运行程序,查看版本信息 4)主界面如下 5)编程界面 点击“新建项目”或者“导入”进入编程界…

Flink Forward Asia 2025 主旨演讲精彩回顾

作为 Apache Flink 社区备受瞩目的年度盛会之一&#xff0c;由阿里云承办的 Flink Forward Asia 2025 于 7 月 3 日在新加坡正式拉开帷幕。From Real-Time Data Analytics to Real-Time AI&#xff0c;Flink 生态全面拥抱 AI本次大会上&#xff0c;Apache Flink 中文社区发起人…

车道偏离预警(LDW)功能介绍

车道偏离预警&#xff08;LDW&#xff09;功能介绍 LDW功能 通过摄像头监测前方车道线&#xff0c;当车辆偏离车道线时&#xff0c;系统发出报警提醒。 系统框图报警条件 最早报警线最迟报警线报警临界线 设置在 最早/最迟报警线 之间接口定义 输入/输出系统算法 横向偏离速度模…

软考(软件设计师)计算机网络-网络层

obsidian做markdown笔记太爽了&#xff0c;康奈尔模板笔记看起来舒服&#xff0c;CSDN试了几种方式&#xff0c;不支持&#xff0c;只能贴图了&#xff0c;将就看吧&#x1f60f;&#xff08;狗头保命&#xff09;工作原理图解 #mermaid-svg-e5Tgpt26jUftujKn {font-family:&qu…

nginx反向代理实现跨域请求

记录一个项目中遇到的跨域请求问题&#xff0c;解决跨域问题无非几种办法&#xff1a;1、后端解决&#xff0c;推荐的做法&#xff0c;可以看我之前写的文章&#xff0c;fastadmin的后台配置跨域&#xff1b;2、前端配置proxy代理&#xff08;开发环境用&#xff09;&#xff1…

利用Wisdom SSH高效搭建CI/CD工作流

在软件开发流程中&#xff0c;CI/CD工作流对于提升效率与确保质量起着关键作用。Wisdom SSH作为一款强大工具&#xff0c;其官网为ssh.wisdomheart.cn&#xff0c;借助AI助手能大幅简化CI/CD工作流的搭建过程。假设服务器已完成基础配置&#xff0c;下面为您介绍如何利用Wisdom…

深度学习-循环神经网络RNN

文章目录序列模型循环神经网络案例词的表示输出的表示矩阵运算表示交叉熵损失时间反向传播算法BPTT梯度消失与梯度爆炸GRULSTM总结序列模型 循环神经网络 st是上一个隐层的输出&#xff0c;体现序列数据之间有很强的关联性。 案例 > S0是初始输入&#xff0c;一般是0&#…

【Linux网络编程】Socket - TCP

目录 V1版本 - Echo Server 初始化服务器 启动服务器 客户端 一些BUG与问题 解决服务器无法一次处理多个请求的问题 多进程版本 多线程版本 线程池版本 V2版本 - 多线程远程执行命令 V1版本 - Echo Server 初始化服务器 TCP大部分内容与UDP是相同的&#xff0c;我们…

知识图谱构建简单分享

最近系统性地学习了知识图谱构建的关键技术&#xff0c;并结合医疗领域知识&#xff0c;完成了一个医疗知识图谱项目的实践。以下是整理的项目架构&#xff0c;欢迎交流指正。说明&#xff1a;当前项目实际实现主要应用了数据预处理、模型设计与预训练、模型优化与测试等核心技…