在MCU上的1微秒的延遲實現方案及測量方法

運行環境: stm32h743iit6; 主頻480MHz; APB1; 240MHz; TIM5 240MHz; 預分頻系數為1; 定時器計數頻率240MHz;

應用需求:實現軟件模擬IIC,延遲精度2個微秒;

量變引起質變,當延遲粒度太小時,需要考慮延遲的實現策略是否適合。

目前的延遲策略:

  1. 傳統的基于定時器中斷策略;

  2. polling輪詢等待策略;

對于強迫癥和完美主義的人來講,可能首選考慮的是中斷策略。但是當下形勢變化了,由于延遲時間過于短(2個微秒)所以對延遲精度要求較高。

根據當前判斷,采取的是執行polling輪詢等待策略實現。

實現正確延遲的前提是,必須保證各個節點的時鐘頻率是計算正確的符合實際的!

polling輪詢等待策略的實現

  1. 根據外部為 timer 提供的時鐘源速率、內部預分頻系數等計算得到定時器的計數器的運行時頻率,也就得到了1秒內計數器累加多少次的節拍; 當然可以計算獲得1微秒需要走多少個節拍,這個可能更加實用。

  2. 程序內延遲開始時,直接摘取定時器計數器的當前值,作為開始的測量點;延遲結束后,再次直接讀取定時器的計數器的當前值作為結束的測量點; 由此得到,延遲過程中定時器的計數器走過多少個節拍,也就是累加的增量是多少個。

  3. 根據前兩步得到的,延遲總節拍數除以1微秒的節拍數就可以知道此過程延遲了多少個微秒。

注意:延遲過程內的代碼應該盡量簡潔,就是不要執行過多的不處于測量范圍內的CPU指令,否則這部分也會被算進去導致測量有誤差。

測量時代碼實現上:

  1. 計算延遲 n 微秒需要的總步長,n*STEP,也就是計數器應該累加的增量值N;

  2. 將當前定時器的計數器的數值設置為零,從零開始計數;

  3. polling輪詢 計數器的值 與 N 作比較,使其在不少于N的范圍內繼續等待,否則延遲時間達到,跳出延遲代碼;

  4. 可以將受保護的代碼使?禁?中斷保護起來,運?結束再開啟中斷;

void delay_us (uint32_t us)
{//可以禁用中斷,保證不可打斷volatile uint32_t ticks = us * STEP_OF_TIM5_CNT;TIM5->CNT = 0;while (TIM5->CNT < ticks);//可以禁用中斷,保證不可打斷,且需要覆蓋下面延遲的目的代碼:比如IIC的電平轉換,以保證效果。}

如何測量延遲是否準確

測量延遲節拍數是否符合預期

原理前面講了,可以通過調試軟件觀察得到節拍數,進行驗證。

使用keil仿真調試

可以使用keil仿真觀察直接顯示的時間結果數據。在此之前,需要正確設置好keil,且確保MCU內有ARM debug IP core 的DWT(debug watch point)IP core支持,因為keil就是通過 jlink、stlink 間接獲取DWT的計時數據。那么如何設置好keil呢?這里參考了魚鷹的微博寫的很好,做簡明描述:

實際測試數據

案例2

案例3

案例4

這次延遲5000個微秒,誤差只有1.30個微秒,屬于正常剛好跟上?的誤差延遲對應。說明?較準確了。可能上次有進出中斷導致誤差太?了!。

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

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

相關文章

macos電腦本地搭建mistral-7b大模型出現4-bit量化和緩存不足問題的記錄

問題背景 本人想再本地筆記本電腦上搭建一個mistral-7b的大模型&#xff0c;在搭建的過程中&#xff0c;出現了4-bit量化模式無法處理的問題&#xff0c;以及電腦內存/顯存不足的問題&#xff0c;導致無法搭建 電腦硬件信息 名稱&#xff1a;2019 Mac book pro 內存&#xff1a…

C# 基礎知識總結(帶詳細文字說明)

1. 基礎語法結構 C# 程序由命名空間、類和方法組成。每個程序必須有一個 Main 方法作為入口點。using 指令用于導入命名空間&#xff0c;Console.WriteLine() 是常用的輸出方法。 csharp 復制 下載 using System; // 引入核心命名空間class Program // 類定義 {static v…

C#最佳實踐:為何要統一命名

C#最佳實踐:為何要統一命名 在 C# 編程的世界里,代碼就像是一座龐大的數字城市,而命名則是城市中縱橫交錯的街道名稱與建筑標識。如果沒有統一的命名規范,這座城市將陷入混亂,開發者在其中探索、維護代碼時也會迷失方向。統一命名不僅是一種編程習慣,更是保障代碼質量、…

通過后端連接Opengauss數據庫的方法

文章目錄 通過后端連接Opengauss數據庫的方法一、為什么默認不能訪問&#xff1f;二、要讓普通用戶從宿主機訪問數據庫&#xff0c;需要以下幾個步驟&#xff1a;1. 使用 omm 超級用戶登錄數據庫2. 創建一個應用程序專用用戶&#xff0c;并設置密碼3. 提供給應用程序專用用戶對…

AWS Config:概述、優勢以及如何開始?

在當今云原生架構快速發展的背景下&#xff0c;越來越多企業意識到資源配置管理和合規性審查的重要性。作為 AWS 官方授權代理商&#xff0c;在云上致力于為企業客戶提供全面、可靠的云服務解決方案&#xff0c;幫助企業輕松上云、合規運營。本文將為您詳細解讀 AWS Config ——…

金融領域LLM開源測試集

BizFinBench 中文 金融業務場景基準數據集 結合迭代校準評估框架IteraJudge&#xff0c;對25個先進LLM進行全面評估&#xff0c;發現在金融AI領域與人類期望存在顯著性能差距。 https://arxiv.org/pdf/2505.19457 https://github.com/HiThink-Research/BizFinBench/tree/m…

跨語言RPC:使用Java客戶端調用Go服務端的JSON-RPC服務

在分布式系統開發中&#xff0c;不同編程語言之間進行通信是一個常見的需求。通過遠程過程調用&#xff08;RPC&#xff09;技術&#xff0c;我們可以讓不同的程序像調用本地方法一樣調用遠程的服務。本文將介紹如何使用Go語言編寫一個簡單的JSON-RPC服務&#xff0c;并使用Jav…

UE5 創建AI控制器、AI行為樹和黑板

UE5 創建AI控制器、AI行為樹和黑板 一、創建AI控制器AIController&#xff08;大腦&#xff09; 二、創建AI行為樹和黑板 1&#xff1a;AI人工智能 2&#xff1a;行為樹 3&#xff1a;黑板 三、AI行為樹藍圖和添加黑板 1&#xff1a;添加黑板&#xff08;腦電波&#xff09;…

CDN加速導致CLS升高圖片托管服務器的3個選擇標準!

許多網站為了提升加載速度&#xff0c;會采用CDN加速服務分發圖片等靜態資源 這樣做可能導致CLS&#xff08;累積布局偏移&#xff09;指標升高&#xff0c;拖累SEO評分。 這一問題通常源于CDN的異步加載機制或圖片尺寸未預定義&#xff0c;使得頁面布局在渲染過程中頻繁變動。…

MySQL(77)如何設置自動備份任務?

設置自動備份任務可以確保你的數據庫定期備份&#xff0c;防止數據丟失。以下是如何使用 Bash 腳本和 Cron 任務在 Linux 系統上設置 MySQL 數據庫的自動備份任務的詳細步驟和代碼示例。 1. 編寫備份腳本 首先&#xff0c;我們需要編寫一個備份腳本。這個腳本將包含執行備份的…

.NET 開發中全局數據存儲的幾種方式

文章目錄 一、靜態類與靜態成員實現方式特點優缺點 二、應用程序配置系統1. appsettings.json (ASP.NET Core)使用方式2. 用戶設置 (WinForms/WPF)特點 三、依賴注入容器ASP.NET Core 示例特點 四、內存緩存 (IMemoryCache)實現方式特點 五、分布式緩存 (IDistributedCache)實現…

人才爭奪戰關鍵期,AI如何賦能招聘效率倍增、精準選拔

數智化轉型浪潮席卷全球的今天&#xff0c;人才作為企業核心競爭力的地位日益凸顯。而在傳統招聘流程&#xff0c;尤其是面試環節正面臨效率瓶頸、體驗短板等多項挑戰&#xff0c;典型如&#xff1a; 耗時冗長的篩選與安排&#xff1b;難以避免的主觀評價偏差&#xff1b;海量…

介紹下分布式ID的技術實現及應用場景

什么是分布式ID 分布式ID是指在分布式系統中生成的特定范圍內唯一的標識符&#xff0c;如訂單號、商品ID、鏈路追蹤TraceID。 隨著業務發展&#xff0c;對分布式ID的要求越來越高&#xff0c;其中最基本的要求如下 全局唯一&#xff1a;在任何節點、任何時間生成的ID都必須是…

【leetcode-字母異位詞分組】

排序法 public List<List<String>> groupAnagrams(String[] strs) {//最終值List<List<String>> result new ArrayList<>();//排序法HashMap<String,List<String>> map new HashMap<>(); //遍歷strfor(String str : strs){/…

langchain從入門到精通(九)——ChatGPT/Playground手動模擬記憶功能

1. 摘要緩沖混合記憶 摘要緩沖混合記憶中&#xff0c;所需的模塊有&#xff1a; chat_message_history&#xff1a;存儲歷史消息列表。moving_summary_buffer&#xff1a;移除消息的匯總字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;當…

docker單點安裝Hadoop

1、Docker中拉取jdk8鏡像 拉取鏡像 docker pull openjdk:8-jdk 查看jdk docker run -it openjdk:8-jdk bash which java 2、安裝ubuntu源 拉取鏡像 docker pull ubuntu:22.04 保存 docker save -o ubuntu-22.04.tar.gz ubuntu:22.04 移動到自己想要的目錄 mv /roo…

uniapp項目之小兔鮮兒小程序商城(二) 首頁的實現:自定義導航欄,輪撥圖,前臺分類,熱門推薦,猜你喜歡,下拉刷新,骨架屏

文章目錄 零.首頁最終效果一.自定義導航欄1.新建pages/index/components/CustomNavbar.vue首頁子組件2.在首頁pages/index/index.vue中引入3.隱藏默認導航欄修改標題顏色4.適配不同機型使用到了uniapp的一個api:獲取屏幕邊界到安全區域的距離在子組件中使用 二.輪撥圖1.新建 sr…

RustDesk自建遠程服務器

目錄 服務端 環境linux 安裝 開放端口 客戶端配置 下載客戶端 安裝后配置網絡 參考&#xff1a;RustDesk自建遠程服務器_rustdesk自建服務器-CSDN博客 服務端 環境 linux 安裝 下載 wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/r…

【Axure高保真原型】圖片伸縮展示列表

今天和大家分享圖片伸縮展示列表的3個原型案例&#xff0c;模版都是用中繼器制作的&#xff0c;所以使用也很方便&#xff0c;在中繼器表格里導入對應的圖片&#xff0c;即可自動生成交互效果&#xff0c;具體效果可以點擊下方視頻觀看或打開下方預覽地址查看哦 【原型效果】 …

keil新建工程文件結構和每個文件的作用解析(標準庫版本)

通過網盤分享的文件:STM32工程模板 鏈接:https://pan.baidu.com/s/1YPFgXu1kwuwsCVxrXFSjZg?pwd=1111 提取碼: 1111 --來自百度網盤超級會員v5的分享 這個工程模版是來源于B站江科大的模版,每個人搭建工程文件結構不一樣,僅供參考。 工程文件目錄結構如圖所示 1、DebugC…