嵌入式軟件開發(fā) 基礎問題(1)
1.在內(nèi)部可以確定上下拉,為什么需要外部上/下拉?
????因為在上電的過程中,我們無法確定芯片引腳的電平。GD32的芯片在默認是浮空輸入。這時候體現(xiàn)為高電平和低電平都是合理的。只有芯片工作起來之后配置了GPIO,才算正式的接管GPIO。這正在自己制作的小作品中可以忽視。但是在實際的產(chǎn)品中,可能一個電平出現(xiàn)了微妙級別的誤觸發(fā),就可能導致儀器炸毀。
????以GD32為例,我們實測在Reset信號過來之后,需要140ms左右芯片才運行到主函數(shù)。但是從晶振起振到主函數(shù)運行只有1ms。除了使用外圍電路來確定GPIO的電平狀態(tài),這140ms都將處于不可控的狀態(tài)。
2.為什么有了標準庫,還要用寄存器配置?
? ??寄存器直接配置比使用標準庫快很多。而且配置GPIO的過程中,可能導致短時間的異常電平。比如說GPIO的配置可能會產(chǎn)生1us異常下拉。但是使用寄存器,這個異常時間就被壓到了60ns。我這里找到一個測試IO輸出的博文,可以充分的展現(xiàn)出標準庫和寄存器之間的差距
https://news.eeany.cn/application/352910-59.html
3.為什么同源重要的中斷,和不重要的中斷不能使用同源中斷。
????比如說硬件過流的中斷,和編碼器的中斷使用了同一個中斷源Line10_15。雖然在中斷函數(shù)中可以判斷具體是哪個線。但是這判斷不是百分百可靠的。不要相信芯片總是按照理想的情況下工作。
4.我遇到的一些奇怪的現(xiàn)象。
? ? 1.GD32并口通信過長導致ADC自動被關掉。這是大佬們解決問題時發(fā)現(xiàn)的問題。
? ? 2.SPI通信DMA數(shù)據(jù)錯開了一個字節(jié)。不使用DMA的時候,用while函數(shù)等待收發(fā)的標志時。數(shù)據(jù)位置正常。但是使用DMA進行收發(fā)。原先第二個數(shù)據(jù)跑到了第三個數(shù)據(jù)的位置。最后解決現(xiàn)象的方法時將SPI的頻率拉高。由原先的128分頻,修改到了32分頻及以下的頻率。DMA數(shù)據(jù)都是正確的。最終將頻率定在了8分配。最終認為是時序原因,但是沒有具體測信號驗證。