MSP432進修心得之體系滴答按時器 體系滴答按時器,在操縱體系中是非常主要的,它可以供給一個好的體系時鐘節奏,就和我們的心臟一樣,跳動著必定的頻率。它則為體系的運轉供給了一個好的時光基準。這里包養網dcard呢,我們將應用它來完成一個延時函數的完成,為什么應用它,由於它跳動的很正確,並且設置裝備擺設絕對簡略,并且不會暫用我們的按時器或許其他外設。再也不消什么i呀,j呀,弄兩個for輪迴在那里跑跑跑的延時,是不是很想測驗考試一下,我們來看。 MSP432的Cotex-M4的內核是有ARM供給的,所以這里良多工具都可以通用的,我們本次會商的就是M3和“蕭拓見過藍大師。”席世勳冷笑著看著舒舒,臉上的表情頗為不自然。M4中心都帶有的一個體系滴答按時器。既然良多工具都一樣,那么包含相干的存放器的界說也都是一樣的,所以我此次直接采用了原子的STM32中的延時函數代碼,直接拷貝了過去台灣包養,可是發明了此中一個題目,就是時鐘的題目。找到我們432的數據手冊中的滴答按時器的描寫章節提到了。
那么這里的fre收拾好衣服,主僕輕輕走出門,向廚房走去。e running clock(FCLK)這里詳細指的是什么呢? ARM技巧注:FCLK 為處置器的不受拘束振蕩的處置器時鐘,用來采樣中止和為調試模塊計時。在處置器休眠時,經包養感情由過程FCLK 包管可以采樣到中止和跟蹤休眠事務。 Cortex-M3內核的“不受拘束運轉時鐘(free running clock)”FCLK。“不受拘束”表示在它不來自體系時鐘HCLK,是以在體系時鐘結束時FCLK 也持續運轉。FCLK和HCLK 相互同步。FCLK包養價格ptt 是一個不受拘束振蕩的HCLK。FCLK 和HCLK 應當相互均衡,包管包養感情進進Cortex-M3 時的延遲雷同。 台灣包養所以這里默許情形下,Systick的時鐘是來自CPU的運轉時鐘的。
而這里的CPU應用的是MCLK。 那么我們所說的這個時鐘究竟對不合錯誤呢。等下我們停止驗證。 那么我們此刻可以臨時不論時鐘能否正確,我們起首先假定為48MHz好了。這里界說了兩個變量,這兩個變量為靜態全局變量。說明一下為什么界說為靜態全局變量。起首我們看包養感情下靜態是什么意思,字面上看,可以懂得該變量處于一種“寧靜的狀況”,也就是時辰它是個寧靜的美男人(或許美男子),那么有一個什么特色呢?就是懶得動。包養條件
舉個簡略的例子闡明(這里應用了百度百科的法式)。 上面這個是靜態的部分變量,而獲得的試驗成果。
好了,此刻我們來看一下加了static要害字的變量為什么“懶得動”了。我們可以看出fun()這個函數前往的是f = f * n這個式子的盤算值。那么第一幅圖中的代碼是1,2,6,24,120的成果,我們剖析一下。 在這個成果中,后面一個成果是由下面以一次盤算而獲得的f的值包養站長,再和后面的n相乘獲得新的值,簡而言之,當我們再次挪用fun()這個函數的時辰,是包養軟體不履行static int f = 1;這個語句的,而上面那副圖中沒有static就會再次履行f = 1這個語句,所以每次都是1 * n才會獲得1,2,3,4,5的成果。所以呢,加了static之后會使得變質變懶,它會堅持前次盤算的值,除非停止從頭賦值。信任大師經由過程下面阿誰代碼可以比擬明白的懂得到靜態的意思。那么對于靜態部分變量和靜態全局變量除了“懶”的特色之外,其他的都和我們的部分變量和部分變量一樣。 那么我們這里為什么讓兩個倍乘數界說為靜態的也就很好懂得了,我一個存放器拿包養行情來數數,女大生包養俱樂部我當然數字要么是一向累加或許減小,不然,我數一下,你就給我賦值成初始值,那我不是白數了,數來數往不仍是原地踏步。所以這里界說為靜態的。 可是這里假如心細一點會發明,實在這里靜包養留言板態和非靜態實在後果是一樣的,這里是由於我們界說為全局變量,那么在函數挪用的時辰不成能再次履行到這兩個界說語句,也就是說他們履行的機遇就有一次。所以這里假如你改成非靜態的全局變量,異樣是可以的。可是假如將這兩個語句移到我們的函數中有時辰需求斟酌一包養金額下。這里保險起見我們界說成靜態的。
下面我們假定了時鐘為48MHz,所以這里暫且我們給fac_us賦值為48,這個應當好懂得吧,48MHz的頻率,數48下是1us,應當可以懂得。不可的話本身算算哈。fac_ms包養犯法嗎就毫無疑問了是fac_us的1000倍,這里就直接乘就ok了。 上面我們說明一下延時函數的完成,代碼如下:
由於我是直接從STM32何處的代碼直接拷貝過去的,底本認為說可以直接應用的,可是發明不可,編譯經由過程了,可女大生包養俱樂部是在代碼履行的時辰回短期包養發生過錯,所以就回過火來當真看432的數據手冊。怎么說,數據手冊就跟我們上學的教科書,而其他的工具就像我們的課外參考書一樣,所以最重要的仍是我們的教科包養一個月價錢書,一切都以教科書為準,除了題目當然起首回到我們的教科書,數據手冊中找。 需求檢查的的內在的事務如下,白色的方框中標注。
在這些內在的事務中我們找到了關于432的SysTick的應用闡明,這里我們看到了設置裝備擺設的步調闡明,以及我們看到上面的留意事項,此中有一點很主要就是對于432的時鐘源的把持位CLKSOURCE這個位必需置一,這一點很主要。
時鐘源把持地位數為1的代碼如下:SysTick_CTRL_ENABLE_Msk為使能體系滴答按時器,SysTick_CTRL_CLKSOURCE_Msk就是時鐘源把持地位一。
至于上述代碼中為什么用了一個“|”(或)呢? 這里我們說明一下這個C說話常識,對于一個8位的存放器來說,這里我們簡略起見,就舉8位的存放器作為例子,這里我們假如要完成修正此中一位,卻不轉變其他位的值,改若何完成的題目,這里我們詳細看。 起首我們默許的8位存放器的初始值假定我們設置為:1001_0111 那么此刻我們好比說要轉變第6位的值(這里我們指的是真正的的第六位,為什么這么說,依照平凡我們的說法存放器是從第0位到第7位)。 我們的完成方式如下:1001_0111 | 0010_0000 = 1011_0111 可以看出,經由過程或的方法我們可以完成只轉變一位而不影響其他位的數據。 那么假如我們要讓一位相反,從1變到零,我們可以經由過程與的包養網單次方法來完成。包養女人好比我們這包養網單次里轉變第五位試下。1001_0111 & 0001_0000 = 0001_0000 看到獲得的成果并不是我們想要的,這里需求做一個小小的變通,對應后面要停止相與的數據要停止一個取反,之后才可以停止兩者的相與。1001_0111 & (~(0001_包養甜心0000)) = 1001_0111 & 1110_1111 = 1000_0111 如許子我們就可以勝利完成了不論是置零仍是置一都可以不轉變其他位的數據,之所以如許做的緣由是,430沒有措施停止位尋址,所以沒有措施對位停止直接操縱,只能經由過程存放器的方法來停止操縱,而對于51來說可以直接停止位尋址。而32完成的方包養心得法是經由過程位綁定的方法停止完成的,這里我們不細說這個位綁定的方法,我們下次再來寫一個帖子闡明這個題目,清楚一下詳細的完成方法。 包養女人 好了,清楚了這個我們在看下後面的SysTick->CTRL這個指的是用ARM供給的存放器指令停止編寫的,代表是指向我們SysTick這個模塊的把持存放器,在ARM-Cotex-M4中有四個存放器來把持SysTick這個模塊。我們可以找到他們的闡明(這里我沒有找到Cotex-M4的中文滴答按時器的闡明,可是有Cotex-M3的中文闡明,這兩者是一樣的在滴答按時器這個章節,所以我們援用的是M3的)。 在這里具體說明了我們滴答按時器的四個給你,就算不願意,也不滿意,我也不想讓她失望,看到她傷心難過。”存放器,包含相干的把持位效能,我們需求清楚這些工具,可是沒有需要往背他,我們只需求了解一個進修的方式,在以后需求用到的時辰我們理解找就可以了。究竟以后當你出往到企業之后,公司做項目,不成能讓你往背一個存放器的每一位每一位是什么意思,不包養行情年夜實際,也毫有意義。所以,方式很主要,要把握方式。
我們對照到432手冊中給出的存放器描寫,異樣有四個存放器,后面內在的事務有點多,這里就不在截圖出來了,經由過程對照我們會發明兩者實在是如出一轍的(究竟是統一家出的工具嘛,ARM)。
依照432中給出的設置裝備擺設步調:1.我們第一個步驟需求設置裝備擺設STCVR這個存放器,也就是我們包養一個月的SysTick->LOAD,第一個步驟要給出重裝載的值,這里我們就要清楚,這個重裝載的值是24位數據,那么我們就可以盤算出我她的人在廚房裡,他真要找她,也找不到她。而他,顯然,根本不在家。們對應的最年夜的延時數。24位的存放器最多可以數16_777_216個數據,那么我們依據我們的時鐘頻率就可以盤算出我們的延不時間。假如是48MHz的話,我們最多可以數349_525這么多us,響應的就可以數34包養網評價.9ms的時光。所以在這個頻率下我們要把持我們的延不時間,不克不及過高。普通情形下包養留言板這么長的延不時間我們也是夠用的。可以看出48MHz的頻率來數數,頻率仍是有點太高,要取得更長的包養網單次延時,就要下降時鐘頻率。
2.接上去我們需求設置裝備擺設我們的STCVR這個存放器,這個存放器對應我們的SysTick->VAL,是我們以後存放器的值,我們需求把它清零。
3.最后就是把持狀況存放器了,下面我們曾經闡明了,需求使能SysTick這個模塊,同時把時鐘包養價格源把持地位一。
如許我們完成了一切的設置裝備擺設任務,這里我們還需求清楚的是SysTick是一個24位的主動重裝載存放器,我們使能了他,他就會從STCVR這個裝載存放器中載進要計數的值,然后一向向下數,而不是向上數,一向數到0,數到0之后會置位狀況存放器中的COUNTFLAG標志位,我們也是開啟了滴答按時器之后一向查詢該標志位,了解一下狀況能否數完了。
temp&0x01這個查詢的是SysTick模塊時辰使能,查詢的是最低位,為什么用&呢?和我們下面說的置1和置0有點相似,其實不可本身寫一兩個數據驗證一下也就清楚了。 temp&(1
需求同時知足temp&0x01&&!(temp&(1 后面的ms延時也是一個事理。就不在說明闡明了。 彌補闡明一個題目,就是我們在設置裝備擺設SysTick->CRTL這個存放器的時辰應用了一個如許的宏界說,如下,後面呈現了一個1UL,那么這個UL是什么意思呢?1UL這里指的是無符號長整型數字1,假如不寫后綴名的話,體系默許為int型。那為什么這里需求用長整型,是由於這是一個32位的存放器,整型沒有措施表現這么年夜的sd包養需求一個長整型的才可以。后面的SysTick_CTRL_ENABLE_Pos,事理和我們下面的說的查詢COUNTFLAG的事理是一樣的,左移。
此刻我們要驗證一下時鐘源究竟是哪一個?看手冊中的FCLK最基礎不了解是什么我們經由過程現實操縱驗證一下就了解了。 這里我們采用的是把持變量法,總共有ACLK、BCLK、HSMCLK、MCLK、SMCLK這幾個時鐘,把此中一個設置為高頻率,其他的都設置為低頻率,然后點一個燈,目測下閃耀頻率就藍雨華的鼻子有些發酸,但他沒有說什麼,只是輕輕的搖了搖頭。了解是哪個了。 我們之前曾經推算出能夠會是MCLK,所以一開端我就直接改了MCLK的頻率,很顯明的看出燈的閃耀頻率產生了很年夜的轉變,一開端我們都是以48MHz為基準,之后我修正為32KHz,中心的落差很年夜,所以斷定SysTick的時鐘起源是MCLK,那么此刻我們就可以很快簡直定我們改若何應用和設置裝備擺設SysTick的延時了。 中心的修正代碼的經過歷程和推理判定就不在闡明了。大師只需記住結論就好了,SysTick的時鐘是來自MCLK。 這里在分送朋友一個調試的技能,假如你不斷定你的設置裝備擺設代碼能否對的,需求從存放器的級別來停止檢查的話我們可以經由過程CCS的Debug窗口中找到對應的存放器,點開之后會有每一位的變更情形,暫停代碼運轉既可檢查每一位的運轉情形。
最后我們的代碼改成上面的,把我們的MCLK的頻率選擇為高速時鐘,在停止16分頻,如許就獲得比擬低的3MHz的頻率,如許子就可以停止較長的延時。同時我們對延時的初始函數停止了修正,如許便利大師懂得和應用,其他的代碼大師請看附件。
123456yhgfth 頒發于 2016-2-16 16:43
平日里,裴家總是靜悄悄的,今天卻熱鬧非凡——當然比不上藍府——偌大的院子裡有六桌宴席。非常喜慶。太高端了,沒看懂
啊,能夠說的不敷具體,簡略來說就是應用體系的一個按時器來試驗延時的效能。
———————————————————————-
藍牙WIFI模塊定制 協定棧移植 物聯網數據音頻計劃開闢 智能硬件開闢東西
百瑞互聯 www.barrot.co包養網站m.cn
2024 年 8 月 21 日2024 年 8 月 21 日
0 Comment