我現(xiàn)在每次執(zhí)行CH375FileClose()成功之后,拔出U盤(pán)時(shí)單片機(jī)死機(jī)(需冷起)或自動(dòng)復(fù)位了。。。是沒(méi)有先停掉U盤(pán)的緣故嗎? CH375FileClose()之后這個(gè)讀寫(xiě)U盤(pán)的函數(shù)就結(jié)束了,功能應(yīng)完結(jié),但如果程序等待u盤(pán)拔出,在實(shí)際拔出之后單片機(jī)死機(jī);如果程序不等待拔出,那單片機(jī)直接死機(jī)。怎么會(huì)這樣? 哪位有想法不妨說(shuō)說(shuō)。。請(qǐng)教了
應(yīng)該不是上述原因?qū)е履銌纹瑱C(jī)復(fù)位,出現(xiàn)復(fù)位只有可能是電源電壓過(guò)低導(dǎo)致單片機(jī)復(fù)位,這個(gè)可能和你的電源系統(tǒng)有關(guān)系,比如加大你的供電電流在USB口的電源和地之間跨接一個(gè)47UF的電解電容等等,都應(yīng)該可以解決你上面的問(wèn)題。
是死機(jī)還是復(fù)位?復(fù)位可能是電源抖動(dòng)產(chǎn)生的.死機(jī)的話你需要程序停在什么地方了.個(gè)人認(rèn)為這不是同一個(gè)情況.
不好意思,是復(fù)位,MCU復(fù)位了。目前我保持在9600波特率上(復(fù)位了也不致于375通信卡住)。
我采用了EXAM12的安全拔出代碼,在所有工作做完后檢測(cè)一個(gè)按鍵的按下以繼續(xù),在按鍵前我拔出U盤(pán),沒(méi)有出問(wèn)題,但按下鍵之后就自動(dòng)復(fù)位了。。 什么情況會(huì)產(chǎn)生代碼級(jí)的復(fù)位呢?畢竟復(fù)位發(fā)生在U盤(pán)拔出之后一段時(shí)間了。
按鍵后運(yùn)行的是什么代碼?調(diào)用一個(gè)僅聲明但未定義的函數(shù)會(huì)導(dǎo)致MCU復(fù)位
發(fā)現(xiàn)問(wèn)題:(9600波特率,MCU晶振11.0592M) 1)CH375FileOpen()函數(shù)執(zhí)行需要20秒;CH375FileCreate()函數(shù)執(zhí)行需要24秒;其它的375函數(shù)很快。 2)流程:CH375LibInit、CH375DiskConnect、CH375DiskReady、CH375FileCreate、CH375FileClose這個(gè)順序走下來(lái),沒(méi)有對(duì)文件內(nèi)容操作的函數(shù),但U盤(pán)文件里會(huì)寫(xiě)入一個(gè)字符。 3)如果加入CH375FileModify()函數(shù),程序在跳回到main函數(shù)的循環(huán)檢查時(shí),會(huì)引發(fā)MCU復(fù)位!但如果注釋掉CH375FileModify()這行函數(shù)調(diào)用語(yǔ)句,就不會(huì)復(fù)位。我不明白。
大俠~~~~~
(1)每個(gè)庫(kù)函數(shù)的代碼量不同,耗時(shí)自然也不同,F(xiàn)ileOpen是讀,而FileCreate是寫(xiě),寫(xiě)過(guò)程需要擦寫(xiě)U盤(pán)中的Flash,自然要慢一些 (2)新建文件,默認(rèn)是寫(xiě)入一字節(jié)隨機(jī)數(shù)據(jù) (3)把程序貼出來(lái)看看
1)U盤(pán)中文件是否很多?建議先把U盤(pán)格式化之后在操作.三個(gè)讀寫(xiě)函數(shù)中不需要在加入延時(shí). 2)在創(chuàng)建文件成功之后,默認(rèn)的文件長(zhǎng)度就是1個(gè)字節(jié). 3)CH375FileModify()修改的不對(duì),請(qǐng)參考我們的例程操作.
另外建議把波特率修改高一下,參考CH375DS1,例如115200甚至更高,這樣會(huì)提高速度.9600本身就很慢,數(shù)據(jù)才1KB/S.
波特率、U盤(pán)操作時(shí)間,這些都好說(shuō),改過(guò)來(lái)了。謝謝 關(guān)鍵是現(xiàn)在執(zhí)行完U盤(pán)操作后會(huì)復(fù)位啊,,
//fileMain.c extern void Func1(); //at file1.c void main() { CH375LibInit(); ……
while(1) { if(Key1_Press) { Func1(); }
…… } }
//file1.c extern void ExportData(); //at file2.c void Func1() { ExportData(); }
//file2.c void ExportData() { uchar xdata buf[8]={0}; …… //ch375除初始化外的操作 …… //connect,diskready,filecreate,filemodify,fileclose.
}
程序如上描述
我用到不少xdata 變量和 跨文件extern函數(shù),看375LIB要求Memory Model為small型,我現(xiàn)在用的是Large,所以有一個(gè)warning,我前面一直都沒(méi)管它,是不是它的問(wèn)題呢?
實(shí)驗(yàn)證明了確實(shí)存在問(wèn)題: 在單獨(dú)的測(cè)試375工作的工程里,向U盤(pán)文件寫(xiě)(CH375ByteWrite)和屬性修改(CH375FileModify)可順利執(zhí)行,寫(xiě)U盤(pán)工作圓滿完成。但在我手里這個(gè)代碼量很大的工程里,雖然U盤(pán)操作只是作為響應(yīng)一個(gè)按鍵按下的函數(shù),但如果調(diào)用了這兩個(gè)函數(shù)之一(實(shí)際上代碼是從上面測(cè)試工程直接拷貝來(lái)的),在U盤(pán)操作完成,這個(gè)函數(shù)結(jié)束跳出的時(shí)候,MCU自動(dòng)復(fù)位了。 沒(méi)有開(kāi)啟看門(mén)狗。
我判斷復(fù)位位置的方法是在375操作函數(shù)里最后一行執(zhí)行按鍵等待,而后在上層main函數(shù)調(diào)用語(yǔ)句之后再等待按鍵,現(xiàn)象是第一次的按鍵等待看到了,第二次沒(méi)到就已經(jīng)復(fù)位了。兩次按鍵是不同的。
調(diào)試信息貼出來(lái)了 linking... *** WARNING L14: INCOMPATIBLE MEMORY MODEL MODULE: .\CH375HF5.LIB (CH375BYT) MODEL: SMALL *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DATETOSTR?DS1302 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_TIMETOSTR?DS1302 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_AT24C64_WRITE_BYTE?AT24C64 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_AT24C64_READ_BYTE?AT24C64 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_CON_DISP?ST7920 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_STRINGCOPY?CH375HFT *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?EXPORTDATATOFLASH?CH375HFT *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?CH375BYTEREAD?CH375BYT Program Size: data=131.3 xdata=762 code=18607 creating hex file from "PS"... "PS" - 0 Error(s), 9 Warning(s).
首先一個(gè)編譯的模式不正確,我們的HF5的庫(kù)是SMALL模式編譯,而你的工程好象是LARGE模式編譯。 你使用LIBC測(cè)試下看可以不可以? 如果你確定是加了你自己的程序之后出現(xiàn)問(wèn)題的話,那么你需要看下你的MAP文件,可能出現(xiàn)的RAM沖突的問(wèn)題存在。
你好,hcn。是的我確實(shí)是LARGE模式編譯,如果用small的話data區(qū)不夠用,若定義為xdata的變量,因還用了extern來(lái)跨文件使用,編譯提示我redifinition。 如果不用extern,似乎不便。。真需要保持一致嗎?
就是覺(jué)得沖突,MAP文件就是那個(gè).M51文件吧,我正在研究。
MAP文件好長(zhǎng),發(fā)現(xiàn)一句話:OVERLAY MAP OF MODULE: PS (PS) 這個(gè)PS就是我的main所在的文件,上面問(wèn)題就是函數(shù)返回到main時(shí)會(huì)復(fù)位,是這個(gè)原因么?
在說(shuō)明的具體點(diǎn),你要不這樣,拿我們的LIBC測(cè)試下看,這個(gè)庫(kù)是LARGE模式編譯的,還有你可以把MAP文件涉及到RAM那部分的拿出來(lái)看下。個(gè)別時(shí)候只要你共用了一部分RAM可能會(huì)出現(xiàn)這個(gè)問(wèn)題。