zoukankan      html  css  js  c++  java
  • 创龙TMS320C6748开发板串口和中断学习笔记

    1. 硬件上,底板有2个串口,UART1和UART2(使用了MAX3232电平转换芯片),其中UART2也可以转RS485的。

    2. 看下数据手册部分,不过一直不理解过采样的意思,16字节的FIFO

    Three Configurable 16550-Type UART Modules:
    –with Modem Control Signals
    –16-Byte FIFO
    –16xor13x Oversampling Option

    3. 本次的例程是中断机制,DSP6748的中断系统是什么样的?在DSP是通过中断向量表作为相应的中断服务程序的入口,中断优先级自高至低。在TMS320C6748中共有16个,前4个中断,编程一般用不到,TI公司总共留给用户12个可自定义的中断,如下图

    中断优先级
      
    中断名称
    描述
    0
    Reset
    复位中断
    1
    NMI
    不可屏蔽中断
    2
    Reserved
    预留(不可操作)
    3
    Reserved
    预留(不可操作)
    4
    INT4
    用户自定义中断
    5
    INT5
    用户自定义中断
    6
    INT6
    用户自定义中断
    7~13
    INT7~13
    用户自定义中断
    14
    INT14
    用户自定义中断
    15
    INT15
    用户自定义中断
    外部的中断事件有128个,如下图(省略了一部分)
    需要把用到的中断事件分配到12个可用的中断。
    但是外部有128个中断事件,而CPU只留了12个用户中断,完全不够分啊,所以当使用到的中断特别多的情况下,复用中断事件有非常重要的意义。这个时候有一个中断组合器,中断组合器就是把几个中断事件合并成一个,从下图可以看出,只能中断事件4-127合并到0-3里面。当然这是在中断事件特别多的情况下,假如你只有2-3个中断事件,可以不使用中断组合器。中断组合器在上图的Interrupt selector里面。

    4. 看下代码部分,使能模块

    void PSCInit(void)
    {
        // 对相应外设模块的使能也可以在 BootLoader 中完成
        // 使能 UART2 模块
        PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
    }

    串口配置

    void UARTInit(void)
    {
        // 配置 UART20 参数
        // 波特率 115200 数据位 8 停止位 1 无校验位
        UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
        // 使能 UART2
        UARTEnable(SOC_UART_2_REGS);
        // 使能接收 / 发送 FIFO
        UARTFIFOEnable(SOC_UART_2_REGS);
        // 设置 FIFO 级别
        UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
    }

    串口中断配置

    void UARTInterruptInit(void)
    {
        IntRegister(C674X_MASK_INT4, UARTIsr);
        IntEventMap(C674X_MASK_INT4, SYS_INT_UART2_INT);
        IntEnable(C674X_MASK_INT4);
        // 使能中断
        unsigned int intFlags = 0;
        intFlags |= (UART_INT_LINE_STAT  |  
                     UART_INT_TX_EMPTY |    
                     UART_INT_RXDATA_CTI);
        UARTIntEnable(SOC_UART_2_REGS, intFlags);
    }

    中断的C674X_MASK_INT4是什么意思?这个中断4就是上面说的CPU留了12个用户中断的其中之一。

    #define C674X_MASK_INT4 4
    #define C674X_MASK_INT5 5
    #define C674X_MASK_INT6 6
    #define C674X_MASK_INT7 7
    #define C674X_MASK_INT8 8
    #define C674X_MASK_INT9 9
    #define C674X_MASK_INT10 10
    #define C674X_MASK_INT11 11
    #define C674X_MASK_INT12 12
    #define C674X_MASK_INT13 13
    #define C674X_MASK_INT14 14
    #define C674X_MASK_INT15 15

    中断服务函数ISR

    void UARTIsr()
    {
        static unsigned int length = sizeof(txArray);
        static unsigned int count = 0;
        unsigned char rxData = 0;
        unsigned int int_id = 0;
        // 确定中断源
        int_id = UARTIntStatus(SOC_UART_2_REGS);
        // 清除 UART2 系统中断
        IntEventClear(SYS_INT_UART2_INT);
        // 发送中断
        if(UART_INTID_TX_EMPTY == int_id)
        {
            if(0 < length)
            {
                // 写一个字节到 THR
                UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
                length--;
                count++;
            }
            if(0 == length)
            {
                // 禁用发送中断
                UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
            }
         }
        // 接收中断
        if(UART_INTID_RX_DATA == int_id)
        {
            rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
            UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
        }
        // 接收错误
        if(UART_INTID_RX_LINE_STAT == int_id)
        {
            while(UARTRxErrorGet(SOC_UART_2_REGS))
            {
                // 从 RBR 读一个字节
                UARTCharGetNonBlocking(SOC_UART_2_REGS);
            }
        }
        return;
    }

    代码主要是这4部分组成的。

    5. 程序运行测试一下,编译的时候点下工程才能编译,连接目标开发板,下载UART2_INT.out文件,点击运行,打开串口终端,发现串口不通,开始查找原因
    6. 实际测试发现,TMS320C6748有2个PSC的时钟域(power and sleep control电源和时钟控制),UART0是在PSC0,UART1和UART2是在PSC1,刚开始用错了PSC,修改之后搞定。
     
     
     
  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8423900.html
Copyright © 2011-2022 走看看