cortex-a9uart

Green Green     2022-08-14     727

关键词:

一、Exynos4412 UART 的特性

      Exynos4412 中UART,有4 个独立的通道,每个通道都可以工作于中断模式或DMA 模式,即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。

    使用系统时钟时,Exynos4412 的 UART 波特率可以达到 4Mbps 。波特率可以通过编程进行 。

    Exynos4412 UART 的通道 0有 256 字节的发送 FIFO 和 256 字节的接收FIFO ;通道 1、4有 64 字节的发送 FIFO 和 64 字节的接收FIFO;通道 2、3有 16 字节的发送FIFO 和 16 字节 的接收 FIFO 。发送数据时, CPU 先将数据写入发送FIFO 中,然后 UART 会自动将FIFO 中的数据复制到“发送移位器” (Transmit Shifter )中,发送移位器将数据一位一位地发送到 TxDn 数据线上 (根据设定的格式,插入开始位 、较验和停止)。接收数据时,“移位器” (Receive Shifter )将 RxDn 数据线上的数据一位一位的接收进来,然后复制到FIFO 中, CPU即可从中读取数据。

     Exynos4412 UART的每个通道支持停止位有 1位、 2位,数据位有 5、6、7或 8位,支持校验功能,另外还有红外发送 /接收功能。

Exynos4412 UART结构图:

技术分享

 

二、uart初始化步骤:

1、将所涉及的UART通道管脚设为UART功能

      比如 UART 通道 0中, GPA0_0 、GPA0_1 分别用作 RXD0 、TXD0,要使用 UART 通道 0时,先设置 GPA0CON 寄存器将 GPA0_0 、GPA0_1 引脚的功能设为 RXD0 、TXD0 。

2、 选择UART的时钟源

   技术分享

        Exynos4412 UART的时钟源有八种选择: XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。
选择好时钟源后,还可以通过 DIVUART0 ~4设置分频系数 设置分频系数 ,由 CLK_DIV_PERIL0 寄存器控制。 从分频器得到的时钟被称为SCLK UART 。

       SCLK UART 经过上图中的“ UCLK Generator”后,得到UCLK ,它的频率就是UART 的波特率。“ Generator UCLK Generator ”通过这 2个寄存器来设置: UBRDEVn 、UFRACVALn (在下面描述)。

 

3.、设置波特率:UBRDIVn寄存器(UART BAUD RATE DIVISOR)、UFRACVALn寄存器

      根据给定的波特率、所选择时钟源频率,可以通过以下公式计算 UBRDIVn 寄存器 (n 为 0~4,对应 5个 UART 通道 )的值。

      UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1

     上式计算出来的 UBRDIVn 寄存器值不一定是整数, UBRDIVn 寄存器取其整数部分,小部分由 UFRACVALn 寄存器设置, UFRACVALn 寄存器的引入,使产生波特率更加精确。

例如,当UART clock为100MHz时,要求波特率为115200 bps,则:

100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25

UBRDIVn = 整数部分 = 53

UFRACVALn/16 = 小数部分 = 0.25

UFRACVALn = 4



4. 设置传输格式:ULCONn寄存器(UART LINE CONTROL)

ULCONn 寄存器 (n 为 0~4) 格式如下图所示:

技术分享

 

5. 设置UART工作模式:UCONn寄存器(UART CONTROL)

 

技术分享

技术分享

 

6. UFCONn寄存器(UART FIFO CONTROL)、UFSTATn寄存器(UART FIFO STATUS)

        UFCON n寄存器用于设置是否使用FIFO,设置各 FIFO的触发阀值,即发送 FIFO中有多少个数据时产生中断、接收 FIFO 中有多少个数据时产生中断。并可以通过设置UFCON n寄存器来复位各个 FIFO 。

        读取 UFSTAT n寄存器可以知道各个 FIFO 是否已经满、其中有多少个数据。

不使用 FIFO 时,可以认为 FIFO 的深度为1,使用 FIFO 时 Exynos4412 的 FIFO 深度最高可达到256 。


7. UMCONn寄存器(UART MODEM CONTROL)、UMSTATn寄存器(UART MODEM STATUS)

       这两类寄存器用于流量控制,这里不介绍。


8. UTRSTATn寄存器(UART TX/RX STATUS)

       UTRSTAT n寄存器用来表明数据是否已经发送完毕、是否已经接收到数据,格式如下表所示,下面说的“缓冲区”,其实就是下图中的 FIFO ,不使用 FIFO 功能时可以认为其深度为 1。

技术分享

 

9. UERSTATn寄存器(UART ERROR STATUS)

      用来表示各种错误是否发生,位 [0] 至位 [3] 为 1时分别表示溢出错误、校验错误、帧错误、检测到“ break ”信号。读取这个寄存器时,它会自动清 0。

      需要注意的是,接收数据时如果使用 FIFO ,则 UART 内部会使用一个“错误 FIFO ”来表明接收 FIFO 中哪个数据在接收过程发生了错误。 CPU 只有在读出这个错误的数据时,才会觉察到发生了错误 。要想清除“FIFO ”,则必须读出错误的数据,并读出UERSTATn 寄存器。

 

10. UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)

       CPU 将数据写入这个寄存器, UART即会将它保存到缓冲区中,并自动发送出去。

 

11. URXHn寄存器(UART RECEIVE BUFFER REGISTER)

      当 UART 接收到数据时,读取这个寄存器,即可获得数据。

 

三、示例程序编写

#include "exynos_4412.h"

void delay_ms(unsigned int time);
void sendch(const char ch);
void sendstr(const char *str);
void recvch(char *ch);
void recvstr(char *str);

void myuart_init(void)
{
    //设置引脚功能 UART RX TX
    GPA1.CON = GPA1.CON & ~0xff | 0x22;
    //设置传输格式  无校验 停止位:1 数据位:8
    UART2.ULCON2 = UART2.ULCON2 & ~0x7f | 0x3;
    //设置接收、发送方式
    UART2.UCON2 = UART2.UCON2 & ~0xf | 0x5;
    //设置波特率 115200
    UART2.UBRDIV2 = 53;
    UART2.UFRACVAL2 = 4;
    //DIV_VAL = (SCLK_UART / (bps * 16)) - 1
}

int main()
{
    char buf[] = "uart send: hello world!
";
    char recvbuf[100];
    myuart_init();

    while(1)
    {
        sendstr(buf);
        delay_ms(1000);
    }

    return 0;
}

void delay_ms(unsigned int time)
{
    int i, j;
    while(time--)
    for(i = 0; i < 5; i++)
        for(j = 0; j < 610; j++);
}
void sendch(const char ch)
{
    /*等待发送器发送完成*/
    while(!(UART2.UTRSTAT2 & 0x2));
    UART2.UTXH2 = ch;
    if (ch == 
)
    {
        sendch(
);
    }
}

void sendstr(const char *str)
{
    while(*str != )
    {
        sendch(*str++);
    }
}

void recvch(char *ch)
{
    /*等待接收完成*/
    while(!(UART2.UTRSTAT2 & 0x1));
    *ch = UART2.URXH2;
}

void recvstr(char *str)
{
    while(1)
    {
        recvch(str);
        if(*str == 
 )
        {
            *str = ;
            break;
        }
        str++;
    }
}

 












NEON 汇编代码在 Cortex-A72 与 Cortex-A53 上需要更多周期

】NEON汇编代码在Cortex-A72与Cortex-A53上需要更多周期【英文标题】:NEONassemblycoderequiresmorecyclesonCortex-A72vsCortex-A53【发布时间】:2021-12-1114:36:03【问题描述】:我正在AArch32模式下的两个ARMv8处理器上对ARMv7NEON代码进行基准测试:Corte... 查看详情

Cortex-A8 是不是支持软件中断?

】Cortex-A8是不是支持软件中断?【英文标题】:DoesCortex-A8supportsoftwareinterrupts?Cortex-A8是否支持软件中断?【发布时间】:2018-10-2507:29:08【问题描述】:Cortex-A8是否支持软件生成中断,即Cortex-A8中是否有任何指令可以生成软件中断... 查看详情

armprocessorsdmips/mhzcomparison(代码片段)

CoreArchitecturebitsDMIPS/MHzDMIPS/MHz*ARM11v7-A321.25 Cortex-A7v7-A321.91.9Cortex-A8v7-A322.02.0Cortex-A9v7-A322.02.5Cortex-A15v7-A324.03.4Cortex-A17v7-A324.03.2Cortex-A32v8-A322.32.3Cortex-A35v8-A32/642.52.5Cortex-A53v8-A32/642.32.3Cortex-A55v8-A32/642.32.7Cortex-A57v8.2-A32/644.64.1Cortex-A7... 查看详情

Cortex-A8 强制内存缓存

】Cortex-A8强制内存缓存【英文标题】:Cortex-A8Forcingmemorycaching【发布时间】:2012-05-0610:28:07【问题描述】:有必要使用函数实时处理大量数字(~1Mb),例如voidprocessData(char*data).在目标平台上运行了以下测试:intj=10;while(j--)processData(d... 查看详情

高效的浮点比较 (Cortex-A8)

】高效的浮点比较(Cortex-A8)【英文标题】:Efficientfloatingpointcomparison(Cortex-A8)【发布时间】:2012-04-3010:12:25【问题描述】:有一个很大的(~100000)浮点点变量数组,并且有一个阈值(也是浮点点)。问题是我必须将数组中的每个... 查看详情

cortex-a7mpcore架构详细介绍(代码片段)

目录0.ARM架构的历史简介1.Cortex-A7MPCore简介2.Cortex-A处理器运行模型3.Cortex-A寄存器组3.1通用寄存器3.1.1未备份寄存器3.1.2备份寄存器3.1.3程序计数器R153.2程序状态寄存器0.ARM架构的历史简介摘自:「ARM架构」是一种怎样的处理器... 查看详情

Cortex-A57 可以双发 128 位 neon 指令吗?

】Cortex-A57可以双发128位neon指令吗?【英文标题】:CanCortex-A57dual-issue128-bitneoninstructions?【发布时间】:2015-12-0208:23:06【问题描述】:Cortex-A57优化指南指出,大多数在128位矢量数据上运行的整数指令都可以双发出(第24页,整数... 查看详情

TI AM3517 Cortex-A8 上的浮点设置/错误

】TIAM3517Cortex-A8上的浮点设置/错误【英文标题】:Setup/ErrorswithFloatingPointonTIAM3517Cortex-A8【发布时间】:2015-08-2516:24:26【问题描述】:执行时遇到未定义的指令异常:0xED2D8B0EVPUSHD8-D14(注意:该语句由编译器生成,作为C语言函数... 查看详情

如何在 Cortex-A9 上读/写 FPSCR?

】如何在Cortex-A9上读/写FPSCR?【英文标题】:Howtoread/writeFPSCRonCortex-A9?【发布时间】:2013-08-0816:54:34【问题描述】:我正在开发基于ARMCortex-A9的系统运行软件,该软件使用嵌套中断;然而,实现嵌套中断的方法似乎存在缺陷,因... 查看详情

如何测量 ARM Cortex-A53 处理器中的程序执行时间?

】如何测量ARMCortex-A53处理器中的程序执行时间?【英文标题】:HowtomeasureprogramexecutiontimeinARMCortex-A53processor?【发布时间】:2015-07-1920:05:18【问题描述】:我正在使用以下方法读取cortex-a15中的时钟:staticvoidreadticks(unsignedint*result)s... 查看详情

cortex-a

...ortexA系列的CPU的相关信息,以便在芯片选型时提供帮助。Cortex-A发布时间Cortex-A支持的位数及架构Cortex-A系列的芯片ARMv7-A内核的比较从DMIPS/MHz角度的cpu性能比较A5(1.57)<A7(1.9)<A8(2.0)<A9(2.5)<A12(3.0)<A15(3.5~4.1)<A17(4.0)ARMv8-A内... 查看详情

tina_linux_key_快速配置使用指南(代码片段)

...表1-1:适用产品列表产品名称内核版本平台架构R18Linux-4.4cortex-a53(64位)R30Linux-4.4cortex-a53(64位)R328Linux-4.9cortex-a7(32位)R329Linux-4.9cortex-a53(64位)R818Linux-4.9cortex-a53(64位)R818BLinux-4.9cortex-a53(64位)MR813Linux-4.9cortex-a53(64位)MR813BLinux-4.9cortex-a53(64... 查看详情

arm裸机开发篇1:cortex-a7开发环境搭建

写在前面:本文章为《ARMCortex-A7裸机开发篇》系列中的一篇,全系列总计11篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。针对FS-MP1A开发板,除了Cortex-A7裸机开发篇外,还包括其他多... 查看详情

arm裸机开发:中断系统(代码片段)

...中断向量表1.2中断控制器1.3中断使能1.4中断服务函数二、Cortex-A7中断介绍三、Cortex-A7中断控制器GIC3.1GIC控制器简介3.2GIC中断ID管理3.3GIC逻辑分块四、Cortex-A7CP15协处理器五、Cortex-A7中断使能5.1总中断使能5.2中断源使能六、Cortex-A7中... 查看详情

ARM Cortex-A53 中的性能监控单元数量

】ARMCortex-A53中的性能监控单元数量【英文标题】:NumberofPerformanceMonitoringUnitsinARMCortex-A53【发布时间】:2018-12-1307:15:28【问题描述】:ARMCortex-A53中有多少个性能监控单元(PMU)?是每个内核一个PMU还是整个处理器一个PMU?【问题讨... 查看详情

在 ARM cortex-a 系列上启用 neon

】在ARMcortex-a系列上启用neon【英文标题】:EnableneononARMcortex-aseries【发布时间】:2013-10-1409:38:33【问题描述】:我想在裸金属皮质A-15上初始化NEONcp。在关注ARM\'sdirectives之后,我在平台初始化序列的末尾写了这个序列:MOVr0,#0x00F00... 查看详情

ARM Cortex-A7 中的事件计数器

】ARMCortex-A7中的事件计数器【英文标题】:EventcountersinARMCortex-A7【发布时间】:2015-11-0408:30:48【问题描述】:ARMCortex-A7支持多少个事件计数器,如何选择/读取/写入这些计数器?例如如果运行:./perfstat-eL1-dcache-loads,branch-loadssleep1... 查看详情

如何在 ARM Cortex-A8 中设置特权模式?

】如何在ARMCortex-A8中设置特权模式?【英文标题】:HowtosetprivilagedmodeinARMCortex-A8?【发布时间】:2015-06-1115:07:19【问题描述】:我必须使用TiSitaraam335x处理器的Neon协处理器。要启用霓虹灯,我必须启用FPEXC(浮点异常寄存器)的第... 查看详情