回覆列表
-
1 # 使用者3055188558752
-
2 # dadazhu2
呵呵,你這個應該是的stm32的韌體庫函式的修改版吧。
DMA_Channel_TypeDef*指的是DMA_Channel_TypeDef的指標,它指向一個地址。
DMA_CHx應該是一個宏定義,它定義了這個地址。
x值代表DMA的通道號,根據晶片不同,可能有1~7不等。
如果想要明白些,用goto difinition檢視宏定義即可。
問題基本出在合併程式碼上了。這2個功能在STM32上並不衝突。
合併程式碼出現問題是很常見的,特別是合併2個別人寫的程式,而自己對DMA,DAC和UART,LCD程式碼並不熟悉的情況下,很容易複製少程式碼,相容沒做好等等,導致一個功能無法使用。
合併一個工程,其實就是複製複製它的驅動程式碼和應用程式到另一個工程中。以題主的LCD工程為例,設定串列埠波特率,收發模式,停止位等等是串列埠的驅動,STM32透過串列埠傳送資料去配置LCD各種工作模式,如對比度,亮度等等是LCD的驅動程式。驅動看起來就是在完成一些初始化的工作。
所以,我們要知道,哪一部分程式碼是負責串列埠初化的,當你找到這部分程式碼以後,就可以把他複製到工程中,串列埠的初始化還包括使能時鐘(port口時鐘和uart外設時鐘),配置IO口為複用模式,甚至還可能有中斷等等,可以按以下思路來合併一個工程(以LCD合併到ADC為例):
串列埠驅動的合併:當我們把串列埠的驅動合併過去以後,我們就可以使用簡單的傳送函式來看看,串列埠是否正常工作,而這些函式其實就是串列埠的應用程式了,如果我們能正常收發資料,那麼我們就繼續合併LCD驅動的程式碼。LCD驅動的合併:其實LCD的初始化就是透過與串列埠資料互動來通訊的,把這部分移植過去以後,就呼叫LCD顯示函式,來看看能不能在LCD上畫一個字元等,來確認驅動程式是否成功,如果不是,就需要檢視和LCD和串列埠的通訊是否正常,這個可以透過和原工程進行對比。這裡我們就會遇到一個問題,我怎麼知道要複製哪些程式碼?那些就是驅動,那些又是應用程式?這就要求我們外設有一定的瞭解,當然有些程式把驅動單獨寫一個檔案,這樣直接的整個檔案複製過去,通常就完成驅動的合併,但是最好還是需要掌握其配置流程,否則除錯就無從起手,特別STM32很多程式都是“野程式”,甚至作者提供的程式碼都存在一定的設計缺陷。
還有另一個問題,我們怎麼知道,串列埠和IIC通訊的情況,這就需要一個示波器,但是更好的可能是邏輯分析儀,邏輯分析儀可以捕獲IO口上的電平,並解析資料,這樣你就可以知道這個IO口上通訊的情況了。
所以合併的思路,就是要了解工程的結構,然後從最低層開始合併,然後單獨除錯,確保每一步都是正常工作的。
我並不太確定,其他開發者的思路,只是提供一些個人在工作中常用的除錯手段,我想,它也是比較合適新手的。