|
剛剛做完一個(gè)練手的項(xiàng)目,寫一下心得總結(jié)。
1、關(guān)于全局變量,因?yàn)橐粋(gè)項(xiàng)目必然會(huì)有很多的.c和.h。固然會(huì)用到全局變量,在一個(gè).c中定義一個(gè)變量,在其.h中用extren聲明該變量,將該變量包含到其他的.c中,那么其他的.c也就能使用該變量了。
2、現(xiàn)在寫單片機(jī)程序的基本框架就是,把每一個(gè)用的外設(shè)分為一個(gè)個(gè)模塊,在定時(shí)器中分時(shí)間逐個(gè)掃描。但是,發(fā)現(xiàn)了一個(gè)弊端,就是如果該時(shí)間掃描時(shí)間過長,就會(huì)導(dǎo)致中斷混亂,不能按時(shí)進(jìn)入或者跳出中斷。所以,就僅僅再定時(shí)器中斷里面用標(biāo)志位進(jìn)行置位,在while(1)中進(jìn)行判斷,定時(shí)一段時(shí)間給需要掃描時(shí)間長的函數(shù)。一般定時(shí)器掃描應(yīng)該是比較快的,因?yàn)榭欤匀蝿?wù)進(jìn)行不完,下一次中斷已經(jīng)來了,比如一個(gè)任務(wù)需要10ms,而定時(shí)器中斷是2ms,那么就會(huì)出現(xiàn)錯(cuò)誤,所以就讓10ms之內(nèi)一直做這個(gè)任務(wù),雖然定時(shí)器還是會(huì)中斷,在進(jìn)行完這件事之前,標(biāo)志位不會(huì)置位為其他事件。
3、在用屏幕的時(shí)候出現(xiàn)的一個(gè)問題。屏幕雖然廠家會(huì)給出官方的顯示函數(shù),直接調(diào)用即可,但是有時(shí)不符合自己的要求,比如想要顯示一個(gè)變量等等(其實(shí)還是自己基礎(chǔ)不行哈);
這是一個(gè)顯示函數(shù)

可以看出,他的第三個(gè)形參是一個(gè)指針形變量,但是再寫實(shí)參的時(shí)候,該如何寫變量呢?
有兩種方法:
指針型變量,指向的是地址。前者“字符串”,指針指向字符串第一個(gè)字符地址,使字符一個(gè)一個(gè)顯示,直到遇到字符串結(jié)束符“\0”顯示結(jié)束。后者,定義High[]為一個(gè)數(shù)組,把需要顯示的變量分成百位、十位、個(gè)位等等。。。在分別放到數(shù)組里面,關(guān)鍵的是,數(shù)組最后一個(gè)值要放“\0”,否則,無法判斷是否需要顯示結(jié)束。將數(shù)組命作為實(shí)參,道理如上。
一開始,我顯示變量的時(shí)候用的是&在加上變量,可是因?yàn)闆]有結(jié)束符“\0”,導(dǎo)致無法判斷顯示結(jié)束,而出現(xiàn)錯(cuò)誤。
4、用到了睡眠模式,其實(shí)就是一條內(nèi)核指令,只要執(zhí)行就能進(jìn)入睡眠狀態(tài),一開始睡眠指令放在定時(shí)器中斷里面了,發(fā)現(xiàn)竟然睡不著。。。拿出來才行了。在一個(gè)就是喚醒,有兩種方式,取決于你進(jìn)入睡眠的指令,我用的是任意中斷喚醒,所以如果程序中用的定時(shí)器中斷等等的話,要先關(guān)閉這些中斷,只留下你自己設(shè)定的用來喚醒的中斷線就好。
5、上電復(fù)位,有兩種上電復(fù)位的方法,一種是,不清除寄存器的配置。另一種是將寄存器配置清除掉,其實(shí)來說,這種方法,就好似硬件復(fù)位。
具體指令:
__set_FAULTMASK(1);
NVIC_SystemReset();
好了結(jié)束了
|
評(píng)分
-
查看全部評(píng)分
|