在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > SAM4E單片機之旅——9、UART與MCK之MAINCK

            SAM4E單片機之旅——9、UART與MCK之MAINCK

            作者: 時間:2017-02-21 來源:網(wǎng)絡(luò) 收藏

              為得到更高的帶寬,需要使用更高的波特率。波特率的計算已經(jīng)介紹過了,現(xiàn)在就嘗試下調(diào)整外設(shè)的時鐘頻率??梢杂卸喾N方法調(diào)整外設(shè)時鐘(MCK)的頻率,這里先介紹先主要時鐘(MAINCK)的設(shè)置,其中包括外部晶振的使用。

            本文引用地址:http://www.biyoush.com/article/201702/344242.htm

              外設(shè)的時鐘(MCK)可以在慢時鐘(SLCK)、主要時鐘(MAINCK)和MAINCK經(jīng)鎖相環(huán)升頻后的時鐘PLLACK三者中選擇,并可以對選擇的時鐘進行分頻。重置時,MCK使用的時鐘為MAINCK,且不分頻。

              MAINCK可以選擇使用一個嵌入的快速RC振蕩器,或是一個晶體振蕩器產(chǎn)生時鐘。快速RC振蕩器啟動時間較短,但不是太精確;而晶體振蕩器則相反。同時,RC振蕩器可以選擇輸出時鐘的頻率(4/8/12 MHz)。重置時,MAINCK使用RC振蕩器,頻率為4 MHz。

              一、 使用芯片嵌入的快速RC振蕩器

              在PMC時鐘產(chǎn)生器主要振蕩器寄存器(CKGR_MOR)中,可以對MAINCK進行一系列的設(shè)置。注意,在修改該寄存器的值時,需要同時往其KEY字段寫入一個魔數(shù):0x37,否則寫入不生效。

              使能快速RC振蕩器。在設(shè)置RC振蕩器的頻率之前,需要先使能它,并且要等到它運行穩(wěn)定(即不能同時使能RC振蕩器和設(shè)置它的頻率):

              /* 使能RC震蕩器 */

              PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD /* 密碼 */

              | (PMC->CKGR_MOR| CKGR_MOR_MOSCRCEN)

              ;

              /* 等待時鐘穩(wěn)定 */

              while(!(PMC->PMC_SR & PMC_SR_MOSCRCS))

              ;

              設(shè)置RC振蕩器頻率為12 Mhz。設(shè)置后同樣需要等待它運行穩(wěn)定。

              /* 設(shè)置快速RC振蕩器頻率為12 MHz */

              PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD

              | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCRCF_Msk)

              | CKGR_MOR_MOSCRCF_12_MHz

              ;

              /* 等待穩(wěn)定 */

              while(!(PMC->PMC_SR & PMC_SR_MOSCRCS))

              ;

              為MAINCK選擇快速RC振蕩器。

              /* 切換至RC振蕩器 */

              PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD

              | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCSEL)

              ;

              /* 等待切換完成 */

              while (!(PMC->PMC_SR & PMC_SR_MOSCSELS))

              ;

              設(shè)置。此時,若將_BRGR中CD字段的值設(shè)為13,則理論的波特率值為 12M/(16 * 13) = 57692 Hz,若PC端選擇使用57600 Hz的波特率,則誤差約為0.16%。

              1UART0->UART_BRGR = UART_BRGR_CD(13 );

              接下來,將PC端串口的波特率設(shè)置為57600 Hz,嘗試下通信是否正常。

              若在PC端接收到的是亂碼,可能就是RC振蕩器不夠精確引起的。其產(chǎn)生的時鐘頻率受工作溫度和電壓等因素的影響,所以需要校準(zhǔn)??梢酝ㄟ^PMC振蕩器校準(zhǔn)寄存器(PMC_OCR)來進行校準(zhǔn),但在這里不做討論。

              二、 使用外部晶振

              可以使用一個外部的晶振以提供更為精確的頻率。使用的晶振是由開發(fā)板攜帶的,在芯片手冊中,對其的介紹為“3~20 MHz晶振”,即表示具體的頻率是由開發(fā)板的生產(chǎn)廠家決定的。晶振的一個缺點是需要一定的啟動時間,而且由于芯片無法了解使用的芯片的具體信息,所以用戶必須手動指定這個啟動時間。

              _EK所攜帶的晶振的頻率為12 MHz,啟動時間為15625 us。具體可以查閱開發(fā)板的電路圖:

            wps_clip_image-3865

             

              或者也可以參考頭文件“sam4e_ek.h”中相關(guān)的定義:

              /** Board oscillator settings(晶振頻率) */

              #define BOARD_FREQ_MAINCK_XTAL (12000000U)

              /** board main clock xtal statup time (主要時鐘晶振啟動時間)*/

              #define BOARD_OSC_STARTUP_US 15625

              接下來就可以進行具體的設(shè)置了。

              使用新的頭文件?,F(xiàn)在需要了解開發(fā)板相關(guān)的信息,所以需要使用新的頭文件:

              //#include 

              #include 

              但是在新的頭文件中,修改CKGR_MOR密碼的宏沒有定義,所以需要自己定義:

              1#define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37)

              禁用PB8和PB9引腳的輸出。這一步是可選的。PB8和PB9的系統(tǒng)功能分別是XOUT和XIN,即是使用晶振時要用到的引腳。由于PIO控制器中的配置對引腳的輸入沒有影響,所以無需配置引腳的復(fù)用,只需禁用輸出即可。

              /* 禁用PB8和PB9引腳的輸出 */

              Pio* xtal_pio = PIOB;

              const uint32_t pio_mask = PIO_PB8 | PIO_PB9;

              xtal_pio->PIO_PER = pio_mask;

              xtal_pio->PIO_ODR = pio_mask;

              計算晶振啟動時間參數(shù)。需要制定一個16位的值(MOSCXTST)來表明晶振啟動的時間,具體計算方法為:啟動時間 = MOSCXTST * 8 * SLCK周期。

              uint32_t slowck_freq = CHIP_FREQ_SLCK_RC;

              volatile uint32_t xt_start =

              (BOARD_OSC_STARTUP_US * slowck_freq / 8 / 1000000);

              if (xt_start > 0xFF)

              xt_start = 0xFF;

              使能晶振,并等待其運行穩(wěn)定。使能晶振時,必須同時使用旁路模式。

              PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD

              | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCXTBY)

              | CKGR_MOR_MOSCXTEN

              | CKGR_MOR_MOSCXTST(xt_start)

              ;

              /* 等待晶振運行穩(wěn)定 */

              while (!(PMC->PMC_SR & PMC_SR_MOSCXTS))

              ;

              讓MAINCK切換為晶振時鐘源,并等其運行穩(wěn)定。

              /* 切換至晶振 */

              PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD

              | CKGR_MOR_MOSCSEL ;

              /* 等待切換完成 */

              while (!(PMC->PMC_SR & PMC_SR_MOSCSELS))

              ;

              由于MCK的時鐘并未改變,均是12 MHz,所以不用修改UART的設(shè)置,就可以正常通信了。



            關(guān)鍵詞: SAM4E UART

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉