串口學習和藍牙通信HC05(第八天)

在這里插入圖片描述


👨?💻個人主頁:@開發者-削好皮的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;當前項目實際實現主要應用了數據預處理、模型設計與預訓練、模型優化與測試等核心技…