首页->【玩CortexM0】

192 0

[Nuvoton M0516] 实验四 UART实验

M0516的UART输出需要看寄存器编程手册6.10 UART接口控制器一章。M0516提供2个独立的UART,本例设置一路学习他的寄存器写方式操作UART传输。在这一章节中,可以看到UART的寄存器控制字也有不少,需要关心没有几个:RX_FIFO、TX_FIFO:读取发送缓存——如果读了就发,可以不用设置、UA0_IER:中断相关的寄存器以及他们的控制位、UART0_INT:中断使能,等。本例采用UART中断控制方式才做UART,因此针对UART的初始化采用案例中的初始化[UART.c],中断处理函数也较为复杂一点,需要事先定义多个函数名。下边开始设置:

首先在定义区增加:

//UART

#define RXBUFSIZE 64

#define AP_Program_LD        1

#define PAGE_Size            512

#define APROM_Start_Address  0x00000000 //A21=0,A20=0

#define LDROM_Start_Address  0x00100000 //A21=0,A20=1

#define CONFIG_Start_Address 0x00300000 //A21=1,A20=1

#define APROM_Size           0x00010000 //128K Bytes

#define LDROM_Size           0x00001000 //4096 Bytes

在变量区增加:

volatile uint8_t comRbuf[RXBUFSIZE];

volatile uint16_t comRbytes=0;

volatile uint16_t comRhead=0;

volatile uint16_t comRtail=0;

volatile int32_t g_bWait=1;

在主函数main前边增加UART初始化函数:

//UART Initial

void uartInit(void){ 

 P3_MFP=P3_MFP & (~(P31_TXD0 | P30_RXD0)) | (TXD0 | RXD0); //P3.1_P3.0 for UART0|TX,RX

 IPRSTC2 |=UART0_RST;//Reset UART0

 IPRSTC2 &=~UART0_RST;//to normoal mode

 APBCLK |=UART0_CLKEN;//UART0 Clock Enable

 CLKSEL1 =CLKSEL1 & (~UART_CLK) | UART_22M;//Select Internal Clock for UART0

 CLKDIV &=~(15<<8);//DIV=0

 UA0_FCR |=TX_RST;//Reset TX_FIFO

 UA0_FCR |=RX_RST;//Reset RX_FIFO

 UA0_LCR &=~PBE;//Disable Jiaoyan

 UA0_LCR =(UA0_LCR & (~WLS)) | WL_8BIT;//Data=8bits

 UA0_LCR &=NSB_ONE;//1 Stop

 UA0_BAUD |=DIV_X_EN;//Mode2:DIV_X_EN = 1

 UA0_BAUD |=DIV_X_ONE;//Mode2:DIV_X_ONE =1

 UA0_BAUD |=((22118400/115200)-2);//Baud=UART_CLK/(UA_BAUD+2)

}

在主函数main中加入:

uartInit();

在循环语句while(1)中加入:

printf("PWM0=%d PWM1=%d\r\n",CMR0A,CMR2A);

最后在主函数体main之后加入UART0中断处理函数:

//UART Interupt

void UART0_IRQHandler(void){

  uint8_t bInChar[1]={0xFF};

  if(UA0_ISR & RDA_INT){//检查中断

    while(UA0_ISR & RDA_IF){//数据有效?

      while(UA0_FSR & RX_EMPTY);//wait

      bInChar[0] = UA0_RBR;     //读字符

      if(bInChar[0] == '0'){

        g_bWait = 0;

      }

      if(comRbytes < RXBUFSIZE){//缓冲区满?

        comRbuf[comRtail] = bInChar[0];//字符队列

        comRtail = (comRtail == (RXBUFSIZE-1)) ? 0 : (comRtail+1);

        comRbytes++;

      }

    }

    printf("\nTransmission Test:");

  }else if(UA0_ISR & THRE_INT){//发送中断?

    uint16_t tmp;

    tmp = comRtail;

    if(comRhead != tmp){

      bInChar[0] = comRbuf[comRhead];

      while((UA0_FSR&TX_FULL) != 0);//发送fifo满?

      UA0_THR = bInChar[0];         //发送

      comRhead = (comRhead == (RXBUFSIZE-1)) ? 0 : (comRhead+1);

      comRbytes--;

    }

  }

}

实验结果见图41,图42


楼主可见