您的位置 首页 厂商

SAM4E单片机之旅——9、UART与MCK之MAINCK

为得到更高的带宽,需要使用更高的波特率。UART波特率的计算已经介绍过了,现在就尝试下调整外设的时钟频率。可以有多种方法调整外设时钟(MCK)的频率,这里先介绍先主要时钟(MAINCK)的设置,其

  为得到更高的带宽,需求运用更高的波特率。UART波特率的核算现已介绍过了,现在就测验下调整外设的时钟频率。能够有多种办法调整外设时钟(MCK)的频率,这儿先介绍先首要时钟(MAINCK)的设置,其间包含外部晶振的运用。

  外设的时钟(MCK)能够在慢时钟(SLCK)、首要时钟(MAINCK)和MAINCK经锁相环升频后的时钟PLLACK三者中挑选,并能够对挑选的时钟进行分频。重置时,MCK运用的时钟为MAINCK,且不分频。

  MAINCK能够挑选运用一个嵌入的快速RC振荡器,或是一个晶体振荡器发生时钟。快速RC振荡器发动时刻较短,但不是太准确;而晶体振荡器则相反。一起,RC振荡器能够挑选输出时钟的频率(4/8/12 MHz)。重置时,MAINCK运用RC振荡器,频率为4 MHz。

  一、 运用芯片嵌入的快速RC振荡器

  在PMC时钟发生器首要振荡器寄存器(CKGR_MOR)中,能够对MAINCK进行一系列的设置。留意,在修正该寄存器的值时,需求一起往其KEY字段写入一个魔数:0x37,不然写入不收效。

  使能快速RC振荡器。在设置RC振荡器的频率之前,需求先使能它,并且要比及它运转安稳(即不能一起使能RC振荡器和设置它的频率):

  /* 使能RC震动器 */

  PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD /* 暗码 */

  | (PMC->CKGR_MOR| CKGR_MOR_MOSCRCEN)

  ;

  /* 等候时钟安稳 */

  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))

  ;

  设置UART。此刻,若将UART_BRGR中CD字段的值设为13,则理论的波特率值为 12M/(16 * 13) = 57692 Hz,若PC端挑选运用57600 Hz的波特率,则差错约为0.16%。

  1UART0->UART_BRGR = UART_BRGR_CD(13 );

  接下来,将PC端串口的波特率设置为57600 Hz,测验下通讯是否正常。

  若在PC端接收到的是乱码,或许便是RC振荡器不行准确引起的。其发生的时钟频率受工作温度和电压等要素的影响,所以需求校准。能够经过PMC振荡器校准寄存器(PMC_OCR)来进行校准,但在这儿不做评论。

  二、 运用外部晶振

  能够运用一个外部的晶振以供给更为准确的频率。运用的晶振是由开发板带着的,在芯片手册中,对其的介绍为“3~20 MHz晶振”,即标明详细的频率是由开发板的生产厂家决议的。晶振的一个缺陷是需求必定的发动时刻,并且因为芯片无法了解运用的芯片的详细信息,所以用户有必要手动指定这个发动时刻。

  SAM4E_EK所带着的晶振的频率为12 MHz,发动时刻为15625 us。详细能够查阅开发板的电路图:

wps_clip_image-3865

 

  或许也能够参阅头文件“sam4e_ek.h”中相关的界说:

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

  #define BOARD_FREQ_MAINCK_XTAL (12000000U)

  /** board main clock xtal statup time (首要时钟晶振发动时刻)*/

  #define BOARD_OSC_STARTUP_US 15625

  接下来就能够进行详细的设置了。

  运用新的头文件。现在需求了解开发板相关的信息,所以需求运用新的头文件:

  //#include 

  #include 

  但是在新的头文件中,修正CKGR_MOR暗码的宏没有界说,所以需求自己界说:

  1#define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37)

  禁用PB8和PB9引脚的输出。这一步是可选的。PB8和PB9的体系功用分别是XOUT和XIN,便是运用晶振时要用到的引脚。因为PIO控制器中的装备对引脚的输入没有影响,所以无需装备引脚的复用,只需禁用输出即可。

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

  核算晶振发动时刻参数。需求拟定一个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;

  使能晶振,并等候其运转安稳。使能晶振时,有必要一起运用旁路形式。

  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切换为晶振时钟源,并等其运转安稳。

  /* 切换至晶振 */

  PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD

  | CKGR_MOR_MOSCSEL ;

  /* 等候切换完结 */

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

  ;

  因为MCK的时钟并未改动,均是12 MHz,所以不必修正UART的设置,就能够正常通讯了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/207305.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部