最近的項目搗鼓msp430需要用到dac轉換以輸出模擬信號,項目代碼是接手前同事的 有些地方調試不通,以前沒有接觸過msp430晶元,更是沒搞過這種晶元io口時序驅動層的東西,甚至純c的都是頭一次作為工作正式用。沒辦法 萬事開頭難嘛 ,硬著頭皮網上到處翻資料 找晶元的手冊 找dac外設的寄存器說明, ...
最近的項目搗鼓msp430需要用到dac轉換以輸出模擬信號,項目代碼是接手前同事的 有些地方調試不通,以前沒有接觸過msp430晶元,更是沒搞過這種晶元io口時序驅動層的東西,甚至純c的都是頭一次作為工作正式用。沒辦法 萬事開頭難嘛 ,硬著頭皮網上到處翻資料 找晶元的手冊 找dac外設的寄存器說明,功夫不負有心人 最終還是被我解決了。
記錄一下解決的過程
首先對以前的代碼瀏覽了一遍,以及對網上到處抄過去抄過來的文章有了個初步的大概套路瞭解。首先這是一個12位的dac外設 ,先對他進行初始化就是 設置參考電壓源 設置各個寄存器 打開外設,然後12位嘛 自然是0x00~0xfff輸出對應電壓。就像下麵這樣,事先我已經確保了硬體連線是正確的,知道了DAC12_0CTL是寄存器控制位,知道了DAC12ENC是使外設工作,DAC12_0DAT是輸出模擬量。
1 //不能使用內部參考電壓 會影響到溫度感測器 2 //ADC12CTL0 = REFON + REF2_5V; // 參考電壓為內部2.5v 3 DAC12_0CTL = DAC12AMP_5 + DAC12IR + DAC12LSEL_0;//控制寄存器設置,自動更新數據,內基準為滿量程 4 DAC12_0CTL |= DAC12SREF_2;//使用外部參考電壓 外部的為3.3v 5 DAC12_0CTL |= DAC12ENC; // 啟動DAC模塊(DAC12LSEL_0時此句可以省,這裡設置為1) 6 DAC12_0DAT = 0x0000; //DAC初值為0,更新這個寄存器就可以更改DAC輸出數據
好我們繼續往下工作,然後在網上翻到了一篇晶元的中文手冊 https://www.docin.com/p-301491113.html 找到了第119頁關於DAC外設描述的位置,主要就是這幅圖。
學單片機入門的時候這種框圖也見識過 知道是單片機內部機制的描述 跟內部機制是對應的,自己憑這種圖真正解決問題的話是頭一遭。進而我觀察到了自己代碼跟圖上有聯繫關係,怎麼個聯繫法呢 ,那就是DAC12SREFX吸引了我的關註,因為代碼里跟圖上單詞是相似的,原來代碼里寫的是DAC12SREF_0 ,進而我跟蹤到了他的定義。
1 #define DAC12SREF_0 (0*0x2000u) /* DAC12 reference 0: Vref+ */ 2 #define DAC12SREF_1 (1*0x2000u) /* DAC12 reference 1: Vref+ */ 3 #define DAC12SREF_2 (2*0x2000u) /* DAC12 reference 2: Veref+ */ 4 #define DAC12SREF_3 (3*0x2000u) /* DAC12 reference 3: Veref+ */
通過後面的註釋以及其它網站的說明瞭解到Vref+是內部參考電壓源 Veref+是外部參考電壓源,再進而發現下麵還有一個寄存器描述表,我知道事情有眉目了。
通過對照硬體原理圖我已經事先知道了確實是使用的0號通道,也就是DAC12_0CTL,再結合上面的框圖知道了第01是vref 通過框圖看到也是對應的節點也是連在一起的。23是veref,我們是使用外部電壓參考源那麼使用2。對照框圖和寄存器說明 以及註釋 覺得直接使用
DAC12SREF_2應該就對了,那麼我們還是來確保驗證一下吧。1 #define DAC12SREF_2 (2*0x2000u) /* DAC12 reference 2: Veref+ */
2*0x2000u對照上面的寄存器說明可以看到第14 和13 位是二進位的10 ,也正好契合到框圖的DAC12SREFX處梯形的第三個。說明根據以前經驗的推測都是正確的。由於我用的IAR工具里沒法調試,於是把初始化的幾個巨集定義玲出來在vc++里查看了最終組合出的位元組值,以及把對應的二進位位對照寄存器說明進行了一個確認。然後DAC12_0DAT進行輸出 ,測試一下,大功告成,一切正常。
經過這一過程,感覺人真是神奇 對吧, 通過對現象規律關聯思索 對現象的預測 建立假想模型 ,主觀能動性加上摸索學習能力,竟然也可以解決未知的問題。