Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78333
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 14
  • 用 户 组: 普通用户
  • 注册时间: 2018-09-15 14:26
文章分类

全部博文(63)

文章存档

2018年(63)

我的朋友

分类: 嵌入式

2018-09-15 14:31:37

原文地址:Cortex_A9----UART 作者:小米拍客光

一、看原理图
    找到UART对应的引脚
    GPA1_0
    GPA1_1

    配置功能
    GPA1CON
    GPA1CON[1] [7:4]:0x2 = UART_2_TXD
    GPA1CON[0] [3:0]:0x2 = UART_2_RXD
    禁止上下拉
    GPA1PUD

二、串口的传输协议
    1个start位   起始位
    5-8个数据位
    0或者1个奇偶校验位
    1或者两个停止位
    我们常用的: 1个起始位,8个数据位,没有奇偶校验位,1个停止位   8N1

    ULCON2
    0x3     8N1
    UCON2
    Transmit Mode [3:2]: 01 = Interrupt request or polling mode   //我们用的是轮询(polling)
    Receive Mode  [1:0]: 01 = Interrupt request or polling mode


    UTRSTAT2
    Transmitter empty [2] : 0 = Not empty
                                      1 = Transmitter empty
    Transmit buffer empty [1]: 0 = Buffer is not empty
                                           1 = Buffer is empty 
    Receive buffer data ready [0] : 0 = Buffer is empty
                                                1 = Buffer has a received data
 
    UTXHn
    UTXHn  [7:0]  RWX  Transmits data for UARTn  
    URXHn
    URXHn  [7:0]  R  Receives data for UARTn 

    UBRDIVn                  53
    UBRDIVn  [15:0]  RW  Baud-rate division value 
    UFRACVALn                5
    UFRACVALn  [3:0]  RW  Determines the fractional part of Baud-rate divisor. 

    DIV_VAL = UBRDIVn + UFRACVALn/16
    or
    DIV_VAL = (SCLK_UART/(bps * 16)) - 1

    DIV_VAL = (40000000/(115200 *  16)) – 1
    = 21.7 – 1
    = 20.7
    UBRDIVn = 20 (integer part of DIV_VAL)    (取整)
    UFRACVALn/16 = 0.7
    Therefore, UFRACVALn = 11                 (四舍五入)

    DIV_VAL = (100000000/(115200 *  16)) – 1
    = 54.3 – 1
    = 53.3
    UBRDIVn = 53 (integer part of DIV_VAL)
    UFRACVALn/16 = 0.3   UFRACVALn  = 16*0.3 =4.8 ==>  5



  1. #include "exynos_4412.h"
  2. #include "adc.h"


  3. void delay_ms(unsigned int Time)
  4. {
  5.         unsigned int i,j;
  6.         for(i=0;i for(j=0;j<3000;j++);
  7. }

  8. /* UART初始化 */
  9. void myuart_init()
  10. {
  11.         /* 设置GPA1_0和GPA1_1引脚为uart的输入和输出功能 */
  12.         GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);
  13.         /* 设置GPA1_0和GPA1_1引脚禁止上下拉 */
  14.         GPA1.PUD = GPA1.PUD & (~(0xF << 0));
  15.         / * 设置UART传输模式:8N1 */
  16.         UART2.ULCON2 = UART2.ULCON2 & (~(0x3 << 0)) | (0x3 << 0);
  17.         UART2.UCON2 = UART2.UCON2 & (~(0x5 << 0)) | (0x5 << 0);


  18.         /*
  19.         * 设置波特率
  20.         * Baud-rate 115200: src_clock:100Mhz
  21.         * DIV_VAL = (100*10^6 / (115200*16) -1) = (54.3 - 1) = 53.3
  22.         * UBRDIV2 = (Integer part of 53.3) = 53 = 0x35
  23.         * UFRACVAL2 = 0.3*16 = 0x5
  24.         * */
  25.         UART2.UBRDIV2 = 53;
  26.         UART2.UFRACVAL2 = 5;
  27.         return ;
  28. }


  29. /* UART发送数据 */
  30. void transmit_char(unsigned char data)
  31. {
  32.         /* 等待发送缓冲区为空再将数据放入发送缓冲区中 */
  33.         while(!(UART2.UTRSTAT2 & (0x1 << 1)));
  34.         UART2.UTXH2 = data;
  35.         return ;
  36. }


  37. /* UART接收数据 */
  38. unsigned char receive_char()
  39. {
  40.         unsigned temp_data;
  41.         while(!(UART2.UTRSTAT2 & (0x1 << 0)));
  42.         temp_data = UART2.URXH2;
  43.         return temp_data;
  44. }

  45. int main()
  46. {
  47.         /* UART初始化 */
  48.         myuart_init;
  49.         delay_ms(500);
  50.         /* ADC初始化 */
  51.         adc_init();
  52.         delay_ms(500);
  53.         while(1)
  54.         {
  55.                 transmit_char(adc_Converter_Value());
  56.                 printf("adc value: %x \n", adc_Converter_Value());
  57.                 delay_ms(2000);
  58.         }

  59.         return 0;
  60. }
















阅读(690) | 评论(0) | 转发(0) |
0

上一篇:Cortex_A9----ADC

下一篇:深入理解SP、LR和PC

给主人留下些什么吧!~~