首頁>Club>
11
回覆列表
  • 1 # 使用者3055188558752

    問題基本出在合併程式碼上了。這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口上通訊的情況了。

    所以合併的思路,就是要了解工程的結構,然後從最低層開始合併,然後單獨除錯,確保每一步都是正常工作的。

    我並不太確定,其他開發者的思路,只是提供一些個人在工作中常用的除錯手段,我想,它也是比較合適新手的。

  • 2 # dadazhu2

    呵呵,你這個應該是的stm32的韌體庫函式的修改版吧。

    DMA_Channel_TypeDef*指的是DMA_Channel_TypeDef的指標,它指向一個地址。

    DMA_CHx應該是一個宏定義,它定義了這個地址。

    x值代表DMA的通道號,根據晶片不同,可能有1~7不等。

    如果想要明白些,用goto difinition檢視宏定義即可。

  • 中秋節和大豐收的關聯?
  • 有人敢曬自己曾經或者現在最愛女人的照片嗎?