極海APM32F107V6 gpio模擬串口

一、原理部分

之前用外設都是直接用的硬件自帶的庫,雖然以前有學過原理和時序,但是因為工作其實也很少會有需要gpio模擬串口的情況,但總會有串口用完,但是需要一個類似打印串口的情況。今天也是開整,然后用硬件的庫對比一下。

1、協議要點

①、異步通訊:

????????通信雙方沒有共享時鐘信號。依靠預先約定好的波特率 (Baud Rate) 來同步。

②、數據幀格式 (常見):

????????起始位 (Start Bit): 1位,低電平 (邏輯0)。標志著數據幀的開始,用于同步接收方。

????????數據位 (Data Bits): 5-9位(通常8位)。從最低有效位 (LSB) 開始發送/接收。

????????校驗位 (Parity Bit): 可選,1位(奇校驗、偶校驗或無校驗)。用于簡單的錯誤檢測。

????????停止位 (Stop Bit): 1位、1.5位或2位,高電平 (邏輯1)。標志數據幀的結束,并為下一幀提供緩沖空間。

????????空閑狀態 (Idle State): 當沒有數據傳輸時,數據線保持高電平。

????????波特率: 定義了每秒傳輸的符號(位)數。例如,9600 bps 表示每秒傳輸9600位數據。位周期 (Bit Time) 是波特率的倒數:T_bit = 1 / BaudRate。這是軟件模擬時最關鍵的參數。

③、時間計算

例如現在波特率為9600,T_bit = 1 / 9600 ≈ 0.0001041667 秒 = 104.1667 微秒 (μs)

用我們最常見的格式,8為數據位,1位起始位,1位停止位,即10位

計算傳輸一個字節 (10位) 所需的總時間 (T_frame):
T_frame = 10 位 * T_bit = 10 * 104.1667 μs ≈ 1041.667 μs ≈ 1.042 ms

可以理解為 大約 1 毫秒 發送一個字節。

發送端要求:需要在 104.17 μs 的整數倍時間點精確切換GPIO電平。

接收端要求:需要在起始位下降沿后等待1.5*T_bit ≈156.25us進行第一次采樣(定位到數據位中間),之后每隔104.17us?采樣一次后續位

波特率115200的話即速度是 9600 波特率的 12 倍,這里就不再寫那么長

2、GPIO 模擬發送 (TX)?

①、配置:

將選定的GPIO引腳配置為推挽輸出模式,初始狀態設置為高電平(空閑狀態)。

②、發送一個字節的流程:

a. 起始位:

將GPIO引腳拉低,并保持1個完整的位周期 (T_bit)。這告訴接收方數據開始傳輸。

b. 數據位 (LSB First):

從要發送字節的最低位 (bit 0) 開始。

根據該位的值是0還是1,將GPIO引腳設置為低電平或高電平。

保持這個電平狀態1個完整的位周期 (T_bit)。

接著發送下一位 (bit 1),重復上述電平設置和延時過程。

依此類推,直到發送完指定的數據位數 (通常是8位)。

c. 校驗位 (如果啟用):

計算已發送數據位的奇偶性 (奇校驗或偶校驗)。

根據計算結果,將GPIO引腳設置為相應的電平 (0或1)。

保持這個電平狀態1個完整的位周期 (T_bit)。

d. 停止位:

將GPIO引腳拉高。

保持高電平狀態1個 (或1.5/2個) 完整的位周期 (T_bit)。這標志著一幀數據的結束,并使線路恢復到空閑狀態。

需要注意的點為:

精確的時序: 每個位(起始位、數據位、校驗位、停止位)的電平持續時間必須嚴格等于位周期 (T_bit)。這是模擬成功的最核心要求。任何累積的時序誤差都會導致通信失敗。

位順序: 嚴格遵守協議約定的位順序(通常是LSB first)。

中斷的影響這里我就先不考慮了,因為我只是回顧下原理,不是真的要用模擬gpio來實現項目需求

3、GPIO 模擬接收 (RX)?

①、配置:

將選定的GPIO引腳配置為浮空輸入或上拉輸入模式(確保空閑時為高電平)。

②、檢測起始位:

持續輪詢(或在中斷中檢測)GPIO引腳狀態。

當檢測到引腳從高電平變為低電平(下降沿)時,可能是一個起始位開始。

③、同步與采樣:

檢測到下降沿后,不能立即采樣數據。需要避開信號邊沿可能不穩定的區域。

關鍵延時: 等待 1.5個位周期 (1.5 * T_bit)。這個延時將采樣點定位到第一個數據位 (LSB) 的中間位置。這是提高抗噪性和采樣穩定性的常用技巧。

④、讀取數據位:

在預期的采樣點(每個數據位的中間位置),讀取GPIO引腳的電平狀態。

將讀取到的電平值 (0或1) 存入接收字節的對應位(從LSB開始)。

每讀取完一位,等待1個位周期 (T_bit) 到達下一位的采樣點。

重復這個過程,讀取完所有數據位 (如8位)。

⑤、讀取校驗位 (如果啟用):

在下一個采樣點(等待1個位周期后),讀取GPIO引腳的電平作為校驗位。

根據協議(奇/偶校驗)和收到的數據位計算期望的校驗位,與實際收到的校驗位比較,進行錯誤檢查(可選)。

⑥、檢測停止位:

在下一個采樣點(等待1個位周期后),讀取GPIO引腳的電平。期望是高電平 (1)。

如果檢測到高電平,說明停止位有效,一幀數據接收基本完成(可考慮校驗結果)。

如果檢測到低電平,說明發生了幀錯誤(Frame Error)

需要注意的點為:1.5 * T_bit 和后續的 1 * T_bit 延時必須非常準確。采樣點定位在位的中間是最佳實踐。

二、配置工程

我的板子是APM32F107VC EVAL_V1.0

因為之前看是pin to pin,我以為是完全兼容,所以用cubemx生成了工程,后來程序一直跑不了,查了一下要用極海官方的sdk才行。

在官方下載sdk和pack即可

之前都是用IAR,現在公司用keil,就用回keil

我用的是他串口中斷的例程做base

APM32F107_EVAL_SDK_v1.0\Examples\USART\USART_Interrupt\Project\MDK

如上圖復制到自己工程的文件夾

再將路徑改一下

然后這里每個都要重新添加一下

編譯成功,跑了一下程序OK

三、修改程序

1、定義的結構體和宏

用PD13做TX,PD14做RX

我這里做的波特率9600,沒有做太高的

tx rx初始化,其中rx配置為中斷

2、初始化

其中rx配置為外部中斷

兩個定時器,定時器5做幀間隔的計時,定時器6為判斷數據是否結束(跟之前stm32接收不定長數據差不多STM32+Cubemx+Esp8266(一)串口接收不定長數據_stm32cubemx esp8266-CSDN博客)

2、發送部分

單個字符

字符串

發送數組

這里我是直接延時硬等,可以再加一個定時器用作發送。

3、接收部分

在接收首個低電平的時候,即為起始幀,然后打開定時器5處理后邊的數據

定時器5的中斷就是數據處理

這里我是1為起始位,8位數據位,1位停止位,無校驗,依次處理就好,用UART_TEST_Handle.rxBitCount作判斷當前在第幾位。數據保存到UART_TEST_Handle.rxBuffer這個buff,

然后每收到一個字節都打開定時器6,定時器6做了11位的時間,若是定時器6中斷溢出則說明這幀數據結束,標志位置1

4、主函數

檢測標志位是否置1,置1則發送rx的buffer,相當于回顯

實際上我這里雖然做了發送隊列,但我接收buff沒做,所以也是只能發一條而已。這個是之前打印其他比較多的時候做的隊列

四、驗證程序:

成功

然后發0x55,用邏輯分析儀看看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93610.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據可視化-94】2025 亞洲杯總決賽數據可視化分析:澳大利亞隊 vs 中國隊

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

鏈表基本運算詳解:查找、插入、刪除及特殊鏈表

在上一篇文章中,我們介紹了線性表的基本概念和順序存儲。本文將深入探討單鏈表的基本運算,并介紹循環鏈表和雙向鏈表這兩種特殊的鏈表結構,幫助讀者全面掌握鏈表的操作技巧。 文章目錄1.單鏈表基本運算鏈表的查找操作按序號查找按值查找鏈表的…

8.19作業

1.聊天室1.1服務器#include <myhead.h> #define SER_PORT 8888 #define SER_IP "192.168.174.128"struct msg {char type;char usrname[20];char msgtext[1024]; };int main(int argc, const char *argv[]) {int sfd socket(AF_INET,SOCK_STREAM,0);if (sfd-1…

95、23種設計模式之建造者模式(4/23)

建造者模式&#xff08;Builder Pattern&#xff09;是23種經典設計模式中的創建型模式之一&#xff0c;其核心思想是將復雜對象的構建過程與其表示分離&#xff0c;使得同樣的構建流程可以生成不同結構或配置的對象。以下從定義、結構、應用場景、優缺點及代碼示例展開分析&am…

LIA-X - 一張照片生成任意表情肖像動畫視頻 精準操控面部動作 支持50系顯卡 一鍵整合包下載

LIA-X 是一個可解釋的潛在肖像動畫生成器&#xff0c;只需要一張照片加一段驅動視頻生成任意表情肖像動畫&#xff0c; 旨在將驅動視頻中的面部動態精細地轉移到源肖像上&#xff0c;同時提供對頭部、嘴巴和眼睛的精細控制。同時支持圖像和視頻的編輯任務&#xff0c;比如對頭部…

Google 的 Opal:重新定義自動化的 AI 平臺

1. 真實世界測試&#xff1a;結果出乎意料 我讓 Opal 接受了三項極具挑戰性的任務&#xff1a; 1.1. 博客生成器挑戰 我的提示&#xff1a;“研究并撰寫一篇關于 2 億美元融資對無代碼&#xff08;no-code&#xff09;影響的文章。” 發生了什么&#xff1a;Opal 不僅僅是寫…

【FreeRTOS】任務通知

任務通知通知狀態的三種取值taskNOT_WAITING_NOTIFICATION&#xff1a;任務沒有在等待通知taskWAITING_NOTIFICATION&#xff1a;任務在等待通知taskNOTIFICATION_RECEIVED&#xff1a;任務接收到了通知&#xff0c;也被稱為 pending(有數據了&#xff0c;待處理)如下面兩個場景…

BEV:隱式相機視角轉換-----BEVFormer

一、背景 基于imp投影的相機視角轉換&#xff0c;對相機的內外參依賴較高&#xff0c;BEV 網格融合固定&#xff0c;可能對小目標不夠敏感&#xff1b;考慮通過transformer的方式進行相機的視角轉換&#xff0c;BEV query 可以自適應關注關鍵區域&#xff0c;提高小目標檢測&am…

zsh 使用筆記 命令行智能提示 bash智能

目錄 安裝&#xff1a; 升級&#xff1a; zsh 有什么用&#xff1f; zsh 安裝&#xff1a; sudo apt update sudo apt install zsh -y 升級&#xff1a; omz update zsh 有什么用&#xff1f; 相比 bash&#xff0c;zsh 更智能、更方便&#xff0c;常見優勢有&#xff…

Laya的適配模式選擇

文章目錄SCALE_FIXED_AUTOSCALE_SHOWALLSCALE_FULLSCALE_FIXED_HEIGHTSCALE_FIXED_WIDTHSCALE_NOSCALESCALE_EXACTFITSCALE_NOBORDERdemoSCALE_FIXED_AUTO NO.1會透&#xff0c;拉伸能解決官網解釋&#xff1a;應用保持設計比例不變&#xff0c;全屏顯示全部內容(類似showall&…

Android中flavor的使用

在我的開發中&#xff0c;有這樣的需求&#xff0c;有一個項目&#xff0c;需要適配不同的執法儀設備&#xff0c;這些執法儀都是Android系統的&#xff0c;而且有的有系統簽名&#xff0c;有的沒有&#xff0c;比如我共有四款型號&#xff0c;有三款有系統簽名&#xff0c;每款…

如何使用DeepSeek解析長pdf的文本

直接使用python工具解析pdf文件&#xff0c;可能因為格式兼容問題&#xff0c;導致解析出的文本幾乎不可讀。 這里嘗試使用Deepseek解析pdf文件&#xff0c;這里僅考慮文本&#xff0c;不考慮其他要素。 1 解析第一步 將pdf作為附件上傳到deepseekchat界面&#xff0c;輸入如…

W3C CSS 活動

W3C CSS 活動 引言 CSS(層疊樣式表)是現代網頁設計中不可或缺的技術之一。W3C(萬維網聯盟)作為全球互聯網標準制定的主要組織,定期舉辦各類CSS相關的活動,旨在促進CSS技術的發展與普及。本文將詳細介紹W3C CSS活動,包括活動內容、參與方式以及活動意義。 活動內容 1…

React Native 與 UniApp 對比

React Native 優點: 由 Facebook 開發維護&#xff0c;社區生態強大 使用 JavaScript/TypeScript 開發&#xff0c;學習曲線相對平緩 真正的原生渲染&#xff0c;性能接近原生應用 支持熱重載&#xff0c;開發效率高 可訪問所有原生平臺 API 大型應用案例豐富(如 Faceboo…

Dijkstra和多層圖 0

眾所周知&#xff0c;Dijkstra經常拿來解決不帶負權和環的單元最短路。我們先來看一下他的實現過程 (由于樸素版用的不多&#xff0c;我們直接上堆優化) 模板 #include<bits/stdc.h> #define mf(x,y) make_pair(x,y)//x距離&#xff0c;y節點 using namespace std; …

【驅動】RK3576:桌面操作系統基本概念

1、桌面操作系統 我們常說的Ubuntu、Debian、麒麟、統信等都是總包工頭; 他們把linux內核、根文件系統(遵循 Linux 標準文件系統層次結構FHS)、包管理(軟件、庫)、桌面環境(GNOME、Xfce等)、初始化系統(Systemd)、各種服務與守護進程、安全組件等整合成一個完整的桌面…

sfc_os!SfcQueueValidationRequest函數分析之sfc_os!IsFileInQueue

第一部分&#xff1a;1: kd> kc# 00 sfc_os!SfcQueueValidationRequest 01 sfc_os!SfcWatchProtectedDirectoriesWorkerThread 02 kernel32!BaseThreadStart1: kd> dvRegVal 0x01129164ChangeType 5vrd 0x012bfef0Status 0n1988337684vrdexisting 0x012bffdc//// if…

100202Title和Input組件_編輯器-react-仿低代碼平臺項目

文章目錄1 開發兩個問卷組件1.1 Title組件1.2 Input組件1.3 畫布靜態展示TItle和Input2 Ajax獲取問卷數據&#xff0c;并存儲到Redux store2.1 API接口2.2 組件列表存儲到Redux store統一管理2.3 重構useLoadQuestionData3 在畫布顯示問卷列表&#xff0c;點擊可選中3.1 Redux獲…

設置計劃任務自動備份mysql

windows系統下1.創建mysql自動備份腳本mysqlback.bat需將此腳本存放在mysql的bin文件夾下。確保此腳本執行成功了在進行第2步做計劃任務。echo off REM 定義備份目錄backup_dir、備份的文件名filename set "backup_dirD:\mysqlback" set "filenamemysqlback_%da…

飛機起落架輪軸深孔中間段電解擴孔內輪廓檢測 - 激光頻率梳 3D 輪廓檢測

摘要&#xff1a;飛機起落架輪軸深孔中間段電解擴孔內輪廓檢測存在精度要求高、結構復雜等挑戰。本文針對電解擴孔特殊工藝特征&#xff0c;探討激光頻率梳 3D 輪廓檢測技術的應用&#xff0c;分析其檢測原理、技術優勢及在輪軸深孔檢測中的實踐&#xff0c;為電解擴孔內輪廓高…