• 创龙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,修改之后搞定。
     
     
     
  • 相关阅读:
    05月27日总结
    05月18日总结
    05月24日总结
    05月21日总结
    05月25日总结
    05月20日总结
    GCC的使用
    wsl2使用
    常见Hash算法位数
    记一次网络漏洞扫描任务——Red Hat部署Nikto
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8423900.html
Copyright © 2020-2023  润新知