博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创龙TMS320C6748开发板串口和中断学习笔记
阅读量:5088 次
发布时间:2019-06-13

本文共 3141 字,大约阅读时间需要 10 分钟。

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,修改之后搞定。
 
 
 

 

转载于:https://www.cnblogs.com/429512065qhq/p/8423900.html

你可能感兴趣的文章
3.0.35 platform 设备资源和数据
查看>>
centos redis 安装过程,解决办法
查看>>
IOS小技巧整理
查看>>
WebDriverExtensionsByC#
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
sublime 配置java运行环境
查看>>
在centos上开关tomcat
查看>>
重启rabbitmq服务
查看>>
正则表达式(进阶篇)
查看>>
无人值守安装linux系统
查看>>
【传道】中国首部淘宝卖家演讲公开课:农业本该如此
查看>>
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>