新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发。例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断。这样可以降低CPU的loading。上面的情况,如果RX只接收到10个字节怎么办呢?这时候就要用到接收超时中断。当RX FIFO中收到1个字节以后,定时器就开始计数,如果定时器超时都没有再收到下一个字节就会发生接收超时中断(RTO)。
每个IP的初始化都需要先初始化时钟,然后才是IP功能初始化。初始化UART之前需要使能要用的晶振,然后选择时钟源并使能时钟。最后将UART用到的引脚切换为UART功能。

  1. void UART0_Init() {
  2.  
  3. /* UART选择HIRC做时钟源 */
  4.  
  5. CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HIRC;
  6.  
  7. /* 使能UART0 IP的时钟 */
  8.  
  9. CLK->APBCLK |= CLK_APBCLK_UART0_EN;
  10.  
  11. /* PB13用作UART0 接收,PB14用作UART0发送 */
  12.  
  13. SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
  14.  
  15. SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
  16.  
  17. /* Init UART0 */ UART_Open(UART0, );
  18.  
  19. /*默认数据长度为8bit,没有奇偶校验,1个停止位*/
  20.  
  21. /*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/
  22.  
  23. UART_SetLine_Config(UART1, , UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1);
  24.  
  25. }
  26.  
  27. UART_Open会根据UART选择的时钟源计算波特率。
  28. 上面的代码执行之后,UART_WRITE(UART0, 0x31)就会从UART TX引脚发送0x31了。如果要使用printf打印信息,keil project中加入retarget.c就可以,然后由宏定义#define DEBUG_PORT UART0决定printf从哪个UART口打印。
  29. 如果想使用中断接收数据,代码如下:
  30.  
  31. void UART0_Init() {
  32.  
  33. /* 选择UART时钟源 */
  34.  
  35. CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HIRC;
  36.  
  37. /* 使能UART0 IP的时钟 */
  38.  
  39. CLK->APBCLK |= CLK_APBCLK_UART0_EN;
  40.  
  41. /* PB13用作UART0 接收,PB14用作UART0发送 */
  42.  
  43. SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
  44.  
  45. SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
  46.  
  47. /* Init UART0 */ UART_Open(UART0, );
  48.  
  49. /*默认数据长度为8bit,没有奇偶校验,1个停止位*/
  50.  
  51. /*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/
  52.  
  53. UART_SetLine_Config(UART1, , UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1); /*设置接收超时时间为40,单位波特率*/ UART_SetTimeoutCnt(UART0, ); /*设置接收FIFO触发级别为14B*/ UART_SET_RX_FIFO_INTTRGLV(UART0, UART_TLCTL_RFITL_14BYTES);
  54.  
  55. /*使能接收FIFO 阀值中断,和接收超时中断*/
  56.  
  57. UART_ENABLE_INT(UART0, (UART_IER_RDA_IE_Msk | UART_IER_RTO_IE_Msk)); NVIC_EnableIRQ(UART0_IRQn);
  58.  
  59. }
  60.  
  61. /*UART0中断处理函数*/
  62.  
  63. void UART0_IRQHandler(void) {
  64.  
  65. uint8_t u8InChar=0xFF;
  66.  
  67. uint32_t u32IntSts= UART0->ISR;
  68.  
  69. /*发生接收阀值中断或者接收超时中断*/
  70.  
  71. if(u32IntSts & (UART_ISR_RDA_IS_Msk| UART_ISR_RTO_IS_Msk))
  72.  
  73. { /* 读走接收FIFO中所有的数据,直到接收FIFO为空 */
  74.  
  75. while(UART_GET_RX_EMPTY(UART0)==) {
  76.  
  77. /* 从接收FIFO中读一个数据 */
  78.  
  79. u8InChar = UART_READ(UART0);
  80.  
  81. }
  82.  
  83. }
  84.  
  85. }

UART IP有个复位函数:SYS_ResetModule(UART0_RST); 其实新唐的芯片每个IP都有单独的复位控制。什么时候需要复位UART0呢?如果该代码是通过CPU reset执行到的,那原本UART可能在工作,RX FIFO中可能有数据,可能会发生中断等等一些无法预估的事情,这时候最好复位一下UART IP的逻辑。

M0 M4之UART初始化的更多相关文章

  1. M0 M4之GPIO初始化

    新唐所有的M0/M4芯片基本上所有的IO都可以发生中断,为了符合大家的习惯还是有所谓的外部中断EINT0和EINT1.有2跟GPIO脚可以配置为EINT0功能和EINT1功能,分别将发生EINT0中断 ...

  2. M0 M4之Timer初始化

    新唐的定时器一般有很多功能:普通的定时功能,事件计数功能,捕获功能,超时触发ADC等等.大家如果感兴趣可以读一下<NANOB Timer功能介绍以及在弱灌注中的应用.pdf>,虽然各个系列 ...

  3. 新唐M0 M4系统初始化

    系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function Pin 简称MFP寄存器)配置.void SYS_Init(void) { /* 解锁保护寄存器 */ SYS_Un ...

  4. 【AT91SAM3S】串口UART初始化及收发数据

    SAM3S中的UART串口是一个两线异步收发器.这个串口能用来通信或者跟踪.有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间. SAM3S4C中有两个UART.与外设引 ...

  5. M0 M4时钟控制(一)

    时钟控制器为整个芯片提供时钟源,包括系统时钟和所有外围设备时钟.该控制器还通过单独时钟的开或关,时钟源选择和分频器来进行功耗控制.在CPU使能低功耗PDEN(CLK_PWRCTL[7]) 位和Cort ...

  6. M0 M4关于库函数的讲解(以时钟为例)

    #define CLK_PWRCON_PD_WAIT_CPU_Pos 8 #define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_ ...

  7. 关于新塘 M0 M4添加库文件的说明

  8. ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程

    对于S5PV210 UART驱动来说,主要关心的就是drivers/serial下的samsung.c和s5pv210.c连个文件. 由drivers/serial/Kconfig: config S ...

  9. z-stack协议uart分析(DMA)

    1.从ZMain里面的main函数开始分析 2.进入int main( void ); HalDriverInit();   //硬件相关初始化,有DMA初始化和UART初始化 3.进入HalDriv ...

随机推荐

  1. win下安装redis

    redis官方不提供win安装程序,github上有个开源项目提供. https://github.com/MSOpenTech/redis 微软开源团队维护 ## 目录 - 安装 - 启动 - 使用 ...

  2. Java中常见的异常__

    作为一名游戏开发者,程序员,很自然必须熟悉对程序的调试方法.而要调试程序,自然需要对程序中的常见的异常有一定的了解,这些日子很多朋友都提出了很多问题,都是关于游戏中的报错,因此在这里我将一些常见的程序 ...

  3. 装饰者模式——(head first 设计模式3)

    装饰者模式定义 装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 从定义来看,除了提到比继承更有弹性,其他的还是非常模糊,下面就先给出其UML类图. 从UML类 ...

  4. MFC文档(SDI)应用:画图程序(画圆、画线、鼠标事件)

    要求 1. 在客户区输出一条顺时针45度的直线.一个正方形.一个大圆: 2. 在客户区输出一个图标: 3. 当按下鼠标左键时,将以鼠标坐标为圆心画直径为20个单位的小圆. 首先设置两个变量,用来保存颜 ...

  5. spark sql 入门

    package cn.my.sparksql import cn.my.sparkStream.LogLevel import org.apache.spark.{SparkConf, SparkCo ...

  6. u-boot 2011.09 使用自己的board 以及config.h

    一个新的方案,用的UBOOT 可能和上一个方案是同一个,但是配置有可能不一样,今天记录一下通过修改配置文件使用新的 board 文件以及 config.h 进入 u-boot 2011.09 // 打 ...

  7. [shell]shell脚本传入不固定参数的写法,如--help等

    最近在调试一个wifi模块,需要传一些不固定的参数,一下一个参数解析的函数可以搞定这个事情,里面内容好多部分是从一个example中剽窃而来(窃喜) #!/bin/bash # writen by a ...

  8. uboot中变量env(收集)

    Env在u-boot中通常有两种存在方式,在永久性存储介质中(flash.NVRAM等),在SDRAM中.可配置不适用env的永久存储方式,但不常用.U-boot在启动时会将存储在永久性存储介质中的e ...

  9. Java上的jQuery?解析HTML利器—Jsoup

    也许大家有过在java运行平台上解析html的经历,通常的方式是将HTML以XML的形式进行结点解析,调用java本身的xml解析类库.这样的方式很容易理解并且很方便,但习惯用jQuery的各位是否在 ...

  10. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...