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

发布者:SparklingStar22最新更新时间:2017-01-07 来源: eefocus关键字:SAM4E  单片机  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,否则写入不生效。

  1. 使能快速RC振荡器。在设置RC振荡器的频率之前,需要先使能它,并且要等到它运行稳定(即不能同时使能RC振荡器和设置它的频率):

    1
    2
    3
    4
    5
    6
    7
    /* 使能RC震荡器 */
    PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD  /* 密码 */
                | (PMC->CKGR_MOR| CKGR_MOR_MOSCRCEN)
                ;
    /* 等待时钟稳定  */
    while(!(PMC->PMC_SR & PMC_SR_MOSCRCS))
        ;
  2. 设置RC振荡器频率为12 Mhz。设置后同样需要等待它运行稳定。

    1
    2
    3
    4
    5
    6
    7
    8
    /* 设置快速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))
        ;
  3. 为MAINCK选择快速RC振荡器。

    1
    2
    3
    4
    5
    6
    7
    /* 切换至RC振荡器 */
    PMC->CKGR_MOR =  CKGR_MOR_KEY_PASSWD
                | (PMC->CKGR_MOR & ~CKGR_MOR_MOSCSEL)
                ;
    /* 等待切换完成 */
    while (!(PMC->PMC_SR & PMC_SR_MOSCSELS))
        ;
  4. 设置UART。此时,若将UART_BRGR中CD字段的值设为13,则理论的波特率值为 12M/(16 * 13) = 57692 Hz,若PC端选择使用57600 Hz的波特率,则误差约为0.16%。

    1
    UART0->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”中相关的定义:

1
2
3
4
/** Board oscillator settings(晶振频率) */
#define BOARD_FREQ_MAINCK_XTAL (12000000U)
/** board main clock xtal statup time (主要时钟晶振启动时间)*/
#define BOARD_OSC_STARTUP_US 15625

接下来就可以进行具体的设置了。

  1. 使用新的头文件。现在需要了解开发板相关的信息,所以需要使用新的头文件:

    1
    2
    //#include
    #include

    但是在新的头文件中,修改CKGR_MOR密码的宏没有定义,所以需要自己定义:

    1
    #define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37)
  2. 禁用PB8和PB9引脚的输出。这一步是可选的。PB8和PB9的系统功能分别是XOUT和XIN,即是使用晶振时要用到的引脚。由于PIO控制器中的配置对引脚的输入没有影响,所以无需配置引脚的复用,只需禁用输出即可。

    1
    2
    3
    4
    5
    /* 禁用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;
  3. 计算晶振启动时间参数。需要制定一个16位的值(MOSCXTST)来表明晶振启动的时间,具体计算方法为:启动时间 = MOSCXTST * 8 * SLCK周期。

    1
    2
    3
    4
    5
    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;
  4. 使能晶振,并等待其运行稳定。使能晶振时,必须同时使用旁路模式。

    1
    2
    3
    4
    5
    6
    7
    8
    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))
        ;
  5. 让MAINCK切换为晶振时钟源,并等其运行稳定。

    1
    2
    3
    4
    5
    6
    /* 切换至晶振 */
    PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD
            | CKGR_MOR_MOSCSEL ;
    /* 等待切换完成 */
    while (!(PMC->PMC_SR & PMC_SR_MOSCSELS))
        ;

由于MCK的时钟并未改变,均是12 MHz,所以不用修改UART的设置,就可以正常通信了。


关键字:SAM4E  单片机  UART  MCK  MAINCK 引用地址:SAM4E单片机之旅——9、UART与MCK之MAINCK

上一篇:SAM4E单片机之旅——10、UART与MCK之PLL
下一篇:SAM4E单片机之旅——8、UART初步

推荐阅读最新更新时间:2024-03-16 15:29

51单片机模拟串口源程序
单片机模拟串口实验,在没有串口的单片机上想使用串口功能这就需要模拟一个串口了 单片机源程序如下: #include reg51.h typedef unsigned char BYTE; typedef unsigned WORD; typedef bit BOOL; #define BAUD 0xFE80 /* 9600bps@11.0592MHz */ sfr AUXR = 0x8E; sbit RXB = P3^0; /* 定义串口TX RX端口 */ sbit TXB = P3^1; BYTE TBUF,RBUF; BYTE TDAT,RDAT; BYTE TCNT,RCNT
[单片机]
单片机看门狗程序
*此程序实现单片机 看门狗 WDT的功能*/ #include p18f458.h unsigned long i; /*系统初始化子程序*/ void initial() { TRISD = 0X00; /*D口设为输出*/ } /*延时子程序*/ void DELAY() { for (i=19999;--i;) continue; } /*主程序*/ main () { initial(); /*初始化,设定看门狗的相关寄存器*/ PORTD = 0X00; /*D口送00H,发光 二极管 亮*/ DELAY(); /*给予一定时间的延时*/ PORTD = 0XFF; /*D口送FFH,发光
[单片机]
PIC单片机的输入和输出操作方法介绍
pic单片机是学习单片机人士必定接触的一款器件,因此大家对pic单片机或多或少具备一定了解。而在pic单片机学习过程中,pic单片机内部硬件资源接口是需要大家掌握的基本内容之一。其中,I/O更是pic单片机的实际基础操作。 I/O口单片机作为一个控制器件必定有数据输入和输出。输入量可能是温度、压力、转速等,而输出量可能是开关量和数据,以保证受控过程在规定的范围内运行。数据的输入和输出都需通过单片机内部有关电路,再与引脚构成输入/输出(I/O)端口。PIC16F84单片机芯片有两个I/O端口(PROTA和PORTB)。端口A为5位口,端口B为8位口,共占用13位引脚。每个端口由一个锁存器(即数据存储器中的特殊功能寄存器05H、0
[单片机]
PIC<font color='red'>单片机</font>的输入和输出操作方法介绍
详解80C51单片机的四种I/O口
在80C51单片机中有4个双向的8位I/O口P0~P3,在无片外存储器的系统中,这4个I/O口的每一位都可以作为准双向通用I/O使用。 在具有片外存储器的系统中,P0口作为地址线的低8位以及双向数据总线,P2口作为高8位的地址线。这4个I/O口除了可以按字节寻址外,还可以按位寻址。 P0口 下图给出了P0口的逻辑结构,它由一个锁存器,两个三态输入缓冲器,一个多路复用开关,一个与门,一个非门以及控制电路和驱动电路组成。 “锁存器,是数字电路中的一种具有记忆功能的逻辑元件。锁存,就是把信号暂存以维持某种电平状态,在数字电路中则可以记录二进制数字信号 0 和 1 。 只有在有锁存信号时输入的状态被保存到输出,直到下一个锁
[单片机]
详解80C51<font color='red'>单片机</font>的四种I/O口
Raspberry Pi Pico微控制器开发板即将登陆e络盟
安富利旗下全球电子元器件产品与解决方案分销商e络盟宣布供应首款采用Raspberry Pi定制芯片的微控制器开发板Raspberry Pi Pico。Raspberry Pi Pico开发套件延续了Raspberry Pi一贯的高性能、低成本及易用性,售价仅4美元,为微控制器市场带来了革命性改变。客户自2021年1月25日起即可从e络盟网站购买Raspberry Pi Pico。 Raspberry Pi Pico开发板采用Raspberry Pi全新RP2040微控制器芯片,具备高度灵活性及超高性价比,能够直接部署至最终产品,从而缩短产品上市时间。RP2040芯片板载一个大容量片上存储器和多种I/O接口选项,其高性能特性能够
[嵌入式]
Raspberry Pi Pico<font color='red'>微控制器</font>开发板即将登陆e络盟
将电池供电型微控制器系统耗电减到最少
    今日的便携式产品设计对所用的电池会有些相互冲突的要求,例如更丰富的产品功能会增加耗电,使用者也希望电池使用时间更长,但不断缩小的产品体积和成本限制却使电池容量无法增加,因此节省电力就成为最重要的考虑。传统设计为了将耗电减到最少,通常都尽可能减少电流消耗;但其实电池的蓄电量是电压、电流和时间的乘积,要有效提升整个系统的电源效率,就必须同时考虑这三项变量。微控制器系统若以电池做为电源,这些电池又能由使用者更换,则可采用专为因应这些变量而设计的微控制器,因为这些微控制器可通过芯片内置电压转换等功能和传统低耗电操作模式来解决前述问题。     电池特性     多数低端和中端便携式产品都会使用可替换的电池或充电电池,这些电池还能
[电源管理]
将电池供电型<font color='red'>微控制器</font>系统耗电减到最少
德州仪器宣布推出Sub-1GHz无线微控制器CC1310
德州仪器(TI)(NASDAQ: TXN)日前宣布推出其SimpleLink 超低功耗平台的下一代器件,致力于帮助用户将超低功耗和远程连通性轻松添加至他们的物联网(IoT)设计中。全新的SimpleLink Sub-1 GHz CC1310无线微控制器(MCU)可为楼宇和工厂自动化、警报与安全、智能电网及无线传感器网络应用提供长达20年的电池使用寿命。 CC1310无线MCU专门针对超低功耗和远程应用而设计,其特性包括: 基于超低功耗无线电、集成的ARM Cortex -M3 MCU、传感器控制器、低功耗模式、0.6 A的睡眠电流以及高达158的ULPBench 评分实现了延长的电池使用寿命。 在由一颗纽
[物联网]
基于单片机C8051F021和时钟芯片实现定时采集存储系统的设计
随着科技的高速发展,现代工业测控领域的很多应用中都需要实现大量数据的定时采集存储。以为海流计设计的海流数据采集存储接口电路为例,介绍一种定时采集存储系统的工作原理及其实现方法。 1 总体结构 在很多情况下,尤其是恶劣的工作环境下,高性能的单片机和大容量的Flash存储器是数据采集存储系统的最佳选择,本文介绍的系统也是基于这样的考虑。系统硬件结构并不复杂,包括高性能单片机C8051F021、实时时钟芯片SD2300、大容量Flash存储器K9G8G08及其外围电路,如图1所示。工作原理也较为简单,通过串口将单片机C8051F021与海流计相连,通过对单片机的编程实现对海流计的控制和使用。同时,为了实现定时采集和数据存储的功能,还
[单片机]
基于<font color='red'>单片机</font>C8051F021和时钟芯片实现定时采集存储系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved