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