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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM