当前位置:首页 > 单片机 > 单片机
[导读]为得到更高的带宽,需要使用更高的波特率。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振荡器和设置它的频率):

1234567/* 使能RC震荡器 */PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD /* 密码 */| (PMC->CKGR_MOR| CKGR_MOR_MOSCRCEN);/* 等待时钟稳定 */while(!(PMC->PMC_SR & PMC_SR_MOSCRCS));

设置RC振荡器频率为12 Mhz。设置后同样需要等待它运行稳定。

12345678/* 设置快速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振荡器。

1234567/* 切换至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。具体可以查阅开发板的电路图:

或者也可以参考头文件“sam4e_ek.h”中相关的定义:

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

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

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

12//#include #include

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

1#define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37)

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

12345/* 禁用PB8和PB9引脚的输出 */Pio* xtal_pio = PIOB;constuint32_t pio_mask = PIO_PB8 | PIO_PB9;xtal_pio->PIO_PER = pio_mask;xtal_pio->PIO_ODR = pio_mask;

计算晶振启动时间参数。需要制定一个16位的值(MOSCXTST)来表明晶振启动的时间,具体计算方法为:启动时间 = MOSCXTST * 8 * SLCK周期。

12345uint32_t slowck_freq = CHIP_FREQ_SLCK_RC;volatileuint32_t xt_start =(BOARD_OSC_STARTUP_US * slowck_freq / 8 / 1000000);if(xt_start > 0xFF)xt_start = 0xFF;

使能晶振,并等待其运行稳定。使能晶振时,必须同时使用旁路模式。

12345678PMC->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切换为晶振时钟源,并等其运行稳定。

123456/* 切换至晶振 */PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD| CKGR_MOR_MOSCSEL ;/* 等待切换完成 */while(!(PMC->PMC_SR & PMC_SR_MOSCSELS));

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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭