STM32 內設驅動最佳實現方式(系列)-前言
/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.0
* @date May-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
STM32可以說是一款使用非常廣泛的晶片了,學電子的不會不知道這個,從大學就開始學然後工作後有可能還會用到。然而通過這麼多年的學習我發現了幾個問題:
1、很多學生、工程師對晶片內部結構不熟悉,導致除錯程式碼過程中出了bug不知到去看哪個地方。
2、對於一個晶片內部模組(例如USART),它的驅動書寫方式有多種,有阻塞、非阻塞、中斷、DMA、DMA+中斷方式,大量的時間耗費在了除錯前四種(非最佳)實現方式上了。
3、淘寶上的開發板有做的不錯的,但是即使這樣,提供的例程程式碼都是一些最基礎的零散片段,學生學習尚可,然而幾乎不能使用在實際專案中。
3、非最佳實現方式可能在某些要求不高的專案上也沒問題,但是如果要上作業系統,或者在時間要求嚴格、中斷非常多且頻繁的場合就沒法用了,除錯這些程式碼費事費力而且全是各種坑。
4、最佳實現方式雖然實現麻煩,但是使用範圍極其廣,不客氣的說,掌握了這些最佳實現方式之後,可以搞定幾乎一切驅動方面的問題,使用五年、十年都不會被淘汰。
5、當對模組的最佳實現方式理解並且掌握之後,可以把大量的時間放在系統整體架構、後期的資料處理、演算法等方面。
在一個使用STM32(或者類似晶片)的專案中,往往60%的時間被浪費在了debug內部模組的過程中,例如:一個專案用I2C阻塞讀狀態的方式讀取資料,花了一個星期除錯完成了,當加入了另一個模組(假設這個模組需要CPU頻繁的響應其中斷),那麼問題就來了,I2C的這種阻塞讀狀態的方式完全不能適用於中斷如此頻繁的場合,I2C一定會卡住,只是時間問題。所以需要再次推導重寫程式碼,一個星期又過去了,然後這種狀態不斷重複……半年過去了項仍然沒有完成,而此時程式碼已經被改的不成樣子了,後期資料處理還沒有做、產品功能也不敢大量新增、演算法還沒有研究……緊接著是大量加班,專案還有可能因為預算問題導致失敗。
在這裡,如果是大公司的話可以無視我說的話,因為大公司有嚴格的程式架構,在這裡我想幫助的是學生、某些小型的新硬體創業公司,因為這些人群可能很難承受時間、金錢上的損失。本來可以用搭積木的方式寫程式碼,為什麼不呢?
所以,本人打算相繼更新一些STM32的內部模組最佳實現方式,把debug內部模組的時間減少到整個專案的10%以下,這樣可以大家把更多的精力放到產品功能、與家人一起享受生活、讀書上,程式設計師的生活本來就該如此輕鬆!
相關推薦
STM32 內設驅動最佳實現方式(系列)-前言
/** ****************************************************************************** * @author Maoxiao Hu * @version V1.0.0 * @date May-2015
UEFI中EHCI驅動的實現框架(二)
urb link cnblogs 異步傳輸 tro insert 傳輸 frame struct 本文從數據結構的角度看一下EHCI的初始化: 下圖是EHCI驅動中涉及的主要數據結構的關系圖: 1.Struct USB2_HC_DEV是Host controller的核心
關於redis分布式鎖的實現方式(轉載)
iss tree red org 實現 方式 分布式 uda master 這個是在網上找到的一個大神寫的(http://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/),對於分布式redis部署的,可以參考
RxJS的另外四種實現方式(三)——性能最高的庫
如何 www table fas set export llb const events 接上篇 RxJS的另外四種實現方式(二)——代碼最小的庫(續) 代碼最小的庫rx4rx-lite雖然在性能測試中超過了callbag,但和most庫較量的時候卻落敗了,於是我下載了
RxJS的另外四種實現方式(三)——效能最高的庫
程式碼最小的庫rx4rx-lite雖然在效能測試中超過了callbag,但和most庫較量的時候卻落敗了,於是我下載了most庫,要解開most庫效能高的原因。 我們先上一組測試資料,這是在我的windows10 上面跑的 dataflow for 10000
RxJS的另外四種實現方式(六)——使用Stream類實現
該實現方式與之前幾種不同的,該實現方式僅針對Nodejs環境。在Nodejs環境中,提供了Stream類,包括Readable、Transform、Writeable等子類都是可擴充套件的。從字面上看,正好對應Rx中的生產者、傳遞者、消費者。 實現該庫的起因是
限界分支法(實際上沒有剪枝,介紹的是廣度優先搜尋):01揹包問題,佇列實現方式(FIFO)
限界分支法:佇列實現方式 前面已經介紹過限界分支法大部分是基於廣度優先搜尋,廣度優先搜尋一般藉助於佇列實現,剪枝的情況可以藉助於優先順序佇列。 實現如下: #%% class FIFO_01_Pack: def __init__(self,N,V,C,W):
自定義的可拖動滑塊驗證碼的實現方式(SlideView)
概述: 最近專案中需要在密碼輸入一定次數後盡心拖動滑塊進行驗證,防止惡意程式程式碼一直測試登入,用了GitHub的一個開源庫SlideView,但是直接依賴原始碼是改不了樣式的,下邊給出自定
JAVA處理Excel的三種實現方式(二)
awm96 2012-05-15 13:49 createExcel(excel6); //modifyExcel(excel2); } static void readExcel(String filePath) throws Exception{ //HSSFWorkb
Android-動態載入外掛化的兩種實現方式(二):介面
上一篇部落格中http://blog.csdn.net/lxping51/article/details/71480239,主要通過反射的方式來實現動態載入外掛化,今天我們以介面的方式來達到目的。介面的實現比反射更為簡單,而且直接呼叫對效能有很大的提高。但是這也
Unity中UGUI人物血條跟隨的幾種實現方式(一)
昨天在群裡有人在做遊戲的時候遇到了一個坑,就是用UGUI做人物血條跟隨遇到了大坑,今天就來說說如何用UGUI來做人物血條跟隨。 第一種: 把Canvas畫布作為Player的子物體。 首先:佈置一下場
【零基礎教學】Unet區域網聯機的實現——最基礎的Unity聯網實現方式(1)
第一部分——Lobby場景的搭建 學習前說明: 專案原始碼:連結:https://pan.baidu.com/s/1g78L9QODXdRjoVcm-odRSg 密碼:0pzo 原始碼引用自Siki老師的Unet基礎系列教程,文章主要以解釋為主,後期會新增一些Si
圖片輪播的兩種實現方式(一)
專案中用到的第一種方法,學習借鑑了https://github.com/qingse/ImageSlideshow 自定義ImageSlideshow,繼承自FrameLayout,在構造方法中,初始化資料: public ImageSlideshow(Context c
經典面試題golang實現方式(一)
以下所有題目的關鍵資訊都會用【】括起來,我們不對題目進行分析,只給出題目的解決方案;如有疑問請不吝賜教。 題目: 請實現一個演算法,確定一個字串的所有字元【是否全都不同】。這裡我們要求【不允許使用額
二分查詢的兩種實現方式(JAVA)
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功
對於STM32使用FSMC驅動傳統8080並口器件方式(TFT)的理解(下)
對於非同步突發的訪問方式,要設定3個時間引數,分別是地址建立時間(ADDSET),資料建立時間(DATAST)和地址保持時間(ADDHLD)。ST提供了4種不同的非同步時序模型,在實際擴充套件中,根據要驅動的外設的特徵確定時序模型,從而確定各時間引數與儲存器讀/寫週期引數指
JS實現繼承的幾種方式(轉)
多繼承 logs 影響 .cn sta 初始化 定義 附錄 style 轉自:幻天芒的博客 前言 JS作為面向對象的弱類型語言,繼承也是其非常強大的特性之一。那麽如何在JS中實現繼承呢?讓我們拭目以待。 JS繼承的實現方式 既然要實現繼承,那麽首先我們得有一個父類,
java實現同步的幾種方式(總結)
副本 增刪改 否則 都是 fin ret 語義 value art 為何要使用同步? java允許多線程並發控制,當多個線程同時操作一個可共享的資源變量時(如數據的增刪改查), 將會導致數據不準確,相互之間產生沖突,因此加入同步鎖以避免在該線程沒有完成操
Nginx反向代理實現會話(session)保持的兩種方式 (轉)
upstream 適用於 反向代理 ip_hash 負載 amp 丟失 tail 基於 http://blog.csdn.net/gaoqiao1988/article/details/53390352 一、ip_hash: ip_hash使用源地址哈希算法,將同一客戶
JS - OOP-繼承的最佳實現方式
not -type 方法 bsp 支持 分享圖片 bject 最好 type 如上圖,使用第三種方式實現繼承最好,也就是加了下劃線的。 但是Object.create方法是ES6才支持的,所以,右邊就寫了一個實現其同樣功能的函數。 JS - OOP-繼承的最佳實現方