新唐單片機項目總結
阿新 • • 發佈:2017-08-24
上升沿 長度 問題: 運行 oat 控制 等待 問題 了解 最近做了兩個單片機項目,新唐的029和mini58ZDE的MCU,都是cortex-M0,一個廠家所以API基本一致,大致了解了串口中斷及定時器功能以及ADC采樣相關的編程內容。
4G項目即mini58zde,主要是從GPS中讀數據然後從另外一個串口轉發出去
GPS模塊 ------ 串口1接收 ----數據處理組包 -----串口0發送------上位機
GPS模塊是不斷地有數據來,數據格式為
$GNRMC,014053.00,A,3205.65222,N,11853.26056,E,0.038,,030817,,,D,V*18
$GNGGA,014053.00,3205.65222,N,11853.26056,E,2,14,0.81,52.6,M,3.1,M,,*41
$GNGSA,A,3,01,09,11,16,08,30,28,,,,,,1.36,0.81,1.09,1*0A
$GNGSA,A,3,03,07,08,01,02,04,13,,,,,,1.36,0.81,1.09,4*08
$GPGSV,4,1,16,01,47,176,41,04,12,058,,07,66,274,,08,55,026,30,0*63
$GPGSV,4,2,16,09,10,223,30,10,03,059,28,11,72,198,46,16,16,098,45,0*6F
$GPGSV,4,3,16,17,02,245,23,22,05,152,18,23,02,197,,27,23,049,18,0*65
$GPGSV,4,4,16,28,17,303,37,30,36,311,29,42,43,137,42,50,43,137,42,0*67
$BDGSV,3,1,10,01,48,143,43,02,37,232,39,03,53,196,43,04,33,121,35,0*78
$BDGSV,3,2,10,05,16,252,,07,76,112,44,08,69,219,44,10,74,327,,0*7E
$BDGSV,3,3,10,13,43,220,42,17,50,110,,0*75
$GNTXT,1,1,01,ANTENNA OPEN*3B
主要處理的數據是GNRMC和GNGGA,用了狀態機的方法判斷前面GMRMC/GNGGA之後直接判斷是否是 ‘*’,因為逐個判斷狀態太多,很復雜而且容易出錯,讀取到 * 之後,再讀校驗位,校驗成功的話,將數據拷貝到 處理緩沖區置標誌位,在主程序中檢測標誌位,然後處理數據,更新數據
串口0 既要接受命令也要返回數據,串口0的數據接受為固定長度的,在這裏也使用了狀態機,提取出命令碼之後,將命令碼寫到命令隊列中,這樣就能及時響應下一個命令,不用死等,數據接收與數據處理獨立運行,不會造成高耦合的現象
串口0 接收數據提取命令碼---------壓入命令隊列 POP(中斷中實現)
串口1 接受提取有效數據-------------更新GPS數據結構體(中斷中實現)
主程序 讀取命令隊列----------------出列PUSH ,根根不同的命令將GPS數據組包通過串口0發出去。
主程序中使能看門狗,使用定時器餵狗。
開發中遇到的一些問題:
1.設計思路有問題,沒理清流程,一開始以為接受到命令碼馬上處理,造成串口0一直要等待
2.看門狗操作寄存器是寫保護,要先解保護才能操作,廠家給的示例不對,造成看門狗使能失敗,餵狗失敗。
3.狀態機使用出錯,狀態太多,兩條命令混合處理,造成代碼混亂,很難理清。
4.鐵塔協議花了很久才明白是怎麽一回事,要多看代碼才行。
5.內部時鐘的配置,要根據實際情況來,沒有外部時鐘就不能用,
029電源控制模塊:
電源充放電管理的一個小模塊,幾個條件限制充放電
低於5度不充電,電壓低於6.1V或者放電時間到了20MIN不放電
使用了GPIO的中斷 確定什麽時候開始放電,電源關閉,下降沿觸發,電池開始放電。重新上電,上升沿,電池可以開始充電。代碼很簡單主要是ADC采樣還有定時器中斷的問題,
電壓和溫度都是通過ADC采樣轉換實現的,使用內部溫度,一個管腳配置成溫度傳感器,然後進行ADC采樣,電壓基準源采用的是3.3V,這個項目沒有串口,打印會造成很多異常,debug下正常但正常跑起來卻有問題,所以調試時盡量少用或者不用printf,整個程序很簡單,就是控制GPIO口
開發中遇到的一些問題:
1.添加printf造成程序異常,定時器異常
2.一上電就進行ADC采樣不對,電壓還沒有升上來,采樣的值很小,等待10ms之後采樣值就對了
3.float 數據計算及比較要註意
新唐單片機項目總結