<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

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

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

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

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

  /* 使能RC震蕩器 */

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

  | (PMC->CKGR_MOR| CKGR_MOR_MOSCRCEN)

  ;

  /* 等待時(shí)鐘穩定 */

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

  ;

  設置RC振蕩器頻率為12 Mhz。設置后同樣需要等待它運行穩定。

  /* 設置快速RC振蕩器頻率為12 MHz */

  PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD

  | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCRCF_Msk)

  | CKGR_MOR_MOSCRCF_12_MHz

  ;

  /* 等待穩定 */

  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字段的值設為13,則理論的波特率值為 12M/(16 * 13) = 57692 Hz,若PC端選擇使用57600 Hz的波特率,則誤差約為0.16%。

  1UART0->UART_BRGR = UART_BRGR_CD(13 );

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

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

  二、 使用外部晶振

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

  _EK所攜帶的晶振的頻率為12 MHz,啟動(dòng)時(shí)間為15625 us。具體可以查閱開(kāi)發(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 (主要時(shí)鐘晶振啟動(dòng)時(shí)間)*/

  #define BOARD_OSC_STARTUP_US 15625

  接下來(lái)就可以進(jìn)行具體的設置了。

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

  //#include 

  #include 

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

  1#define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37)

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

  /* 禁用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;

  計算晶振啟動(dòng)時(shí)間參數。需要制定一個(gè)16位的值(MOSCXTST)來(lái)表明晶振啟動(dòng)的時(shí)間,具體計算方法為:?jiǎn)?dòng)時(shí)間 = 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;

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

  PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD

  | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCXTBY)

  | CKGR_MOR_MOSCXTEN

  | CKGR_MOR_MOSCXTST(xt_start)

  ;

  /* 等待晶振運行穩定 */

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

  ;

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

  /* 切換至晶振 */

  PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD

  | CKGR_MOR_MOSCSEL ;

  /* 等待切換完成 */

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

  ;

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



關(guān)鍵詞: SAM4E UART

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>