在线时间6 小时
UID3070386
注册时间2015-12-27
NXP金币0
该用户从未签到
注册会员

- 积分
- 59
- 最后登录
- 2017-7-3
|

楼主 |
发表于 2016-3-4 13:15:54
|
显示全部楼层
1、LPC1768的串口初始化配置,如下:
#define BSP_SER_U2_PINS (DEF_BIT_10 | DEF_BIT_11) // P0.10-->TXD2, P0.11-->RXD3
#define BSP_SER_U3_PINS (DEF_BIT_00 | DEF_BIT_01) // P0.0-->TXD3,P0.1-->RXD3
void BSP_SerInit (CPU_INT08U ser_id, CPU_INT32U baud_rate)
{
CPU_INT16U div; /* Baud rate divisor */
CPU_INT08U divlo;
CPU_INT08U divhi;
CPU_INT32U pclk_freq;
BSP_SerRxData = 0;
BSP_Ser2RxData = 0;
BSP_Ser3RxData = 0;
/* ------------ COMPUTE DIVISOR BAUD RATE ----------- */
/* Get the peripheral frequency */
switch (ser_id)
{
case BSP_SER_COMM_UART_00:
pclk_freq = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART0);
break;
case BSP_SER_COMM_UART_01:
pclk_freq = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART1);
break;
case BSP_SER_COMM_UART_02:
pclk_freq = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART2);
break;
case BSP_SER_COMM_UART_03:
pclk_freq = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART3);
break;
default:
break;
}
div = (CPU_INT16U)(((2 * pclk_freq / 16 / baud_rate) + 1) / 2);
divlo = div & 0x00FF; /* Split divisor into LOW and HIGH bytes */
divhi = (div >> 8) & 0x00FF;
if (ser_id == BSP_SER_COMM_UART_00)
{
BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART0);
/* ------------------- ENABLE UART0 I/Os ------------------ */
BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U0_PINS, BSP_GPIO_OPT_FNCT_2);
/* --------------------- SETUP UART0 ---------------------- */
BSP_SER_REG_U0_LCR = DEF_BIT_07; /* Set divisor access bit */
BSP_SER_REG_U0_DLL = divlo; /* Load divisor */
BSP_SER_REG_U0_DLM = divhi;
BSP_SER_REG_U0_LCR = 0x03; /* 8 Bits, 1 Stop, No Parity */
BSP_SER_REG_U0_IER = 0x00; /* Disable both Rx and Tx interrupts */
BSP_SER_REG_U0_FDR = DEF_BIT_NONE;
BSP_SER_REG_U0_FCR = DEF_BIT_00; /* Enable FIFO, flush Rx & Tx */
BSP_IntVectSet((CPU_INT08U )BSP_INT_SRC_NBR_UART0,
(CPU_FNCT_VOID)BSP_SerISR_Handler );
BSP_IntEn(BSP_INT_SRC_NBR_UART0);
}
else if (ser_id == BSP_SER_COMM_UART_01)
{
BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART1);
/* ------------------- ENABLE UART1 I/Os ------------------ */
BSP_GPIO_Cfg(BSP_GPIO_PORT2_FAST, BSP_SER_U1_PINS, BSP_GPIO_OPT_FNCT_3);
/* --------------------- SETUP UART1 ---------------------- */
BSP_SER_REG_U1_LCR = DEF_BIT_07; /* Set divisor access bit */
BSP_SER_REG_U1_DLL = divlo; /* Load divisor */
BSP_SER_REG_U1_DLM = divhi;
BSP_SER_REG_U1_LCR = 0x03; /* 8 Bits, 1 Stop, No Parity */
BSP_SER_REG_U1_IER = 0x00; /* Disable both Rx and Tx interrupts */
BSP_SER_REG_U1_FDR = DEF_BIT_NONE;
BSP_SER_REG_U1_FCR = DEF_BIT_00; /* Enable FIFO, flush Rx & Tx */
BSP_IntVectSet((CPU_INT08U )BSP_INT_SRC_NBR_UART1,
(CPU_FNCT_VOID)BSP_SerISR_Handler );
BSP_IntEn(BSP_INT_SRC_NBR_UART1);
}
else if (ser_id == BSP_SER_COMM_UART_02)
{
BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART2);
/* ------------------- ENABLE UART2 I/Os ------------------ */
BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U2_PINS, BSP_GPIO_OPT_FNCT_2);
/* --------------------- SETUP UART2 ---------------------- */
BSP_SER_REG_U2_LCR = DEF_BIT_07; /* Set divisor access bit */
BSP_SER_REG_U2_DLL = divlo; /* Load divisor */
BSP_SER_REG_U2_DLM = divhi;
BSP_SER_REG_U2_LCR = 0x03; /* 8 Bits, 1 Stop, No Parity */
BSP_SER_REG_U2_IER = 0x01; /* Enable Rx interrupt, and disable Tx interrupt */
BSP_SER_REG_U2_FDR = DEF_BIT_NONE;
BSP_SER_REG_U2_FCR = DEF_BIT_NONE; /* Disable FIFO, flush Rx & Tx */
BSP_IntVectSet((CPU_INT08U )BSP_INT_SRC_NBR_UART2,
(CPU_FNCT_VOID)BSP_IntHandlerUART2 );
BSP_IntEn(BSP_INT_SRC_NBR_UART2);
}
else if (ser_id == BSP_SER_COMM_UART_03)
{
BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART3);
/* ------------------- ENABLE UART3 I/Os ------------------ */
BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U3_PINS, BSP_GPIO_OPT_FNCT_3);
/* --------------------- SETUP UART3 ---------------------- */
BSP_SER_REG_U3_LCR = DEF_BIT_07; /* Set divisor access bit */
BSP_SER_REG_U3_DLL = divlo; /* Load divisor */
BSP_SER_REG_U3_DLM = divhi;
BSP_SER_REG_U3_LCR = 0x03; /* 8 Bits, 1 Stop, No Parity */
BSP_SER_REG_U3_IER = 0x01; /* Enable Rx interrupt, and disable Tx interrupt */
BSP_SER_REG_U3_FDR = DEF_BIT_NONE;
BSP_SER_REG_U3_FCR = DEF_BIT_NONE; /* Disable FIFO, flush Rx & Tx */
BSP_IntVectSet((CPU_INT08U )BSP_INT_SRC_NBR_UART3,
(CPU_FNCT_VOID)BSP_IntHandlerUART3 );
BSP_IntEn(BSP_INT_SRC_NBR_UART3);
}
}
2、串口3的中断服务程序
static void BSP_IntHandlerUART3 (void)
{
CPU_INT08U lsr;
CPU_INT08U iir;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntEnter();
OS_EXIT_CRITICAL();
iir = BSP_SER_REG_U3_IIR & 0x0F;
while (iir != 1)
{
switch (iir)
{
case 2: /* Transmitted character? */
break;
case 4: /* Received a character? */
lsr = BSP_SER_REG_U3_LSR;
BSP_Ser3RxData = BSP_SER_REG_U3_RBR;
bsp_ser_net_rx_data (BSP_Ser3RxData);
(void)lsr;
break;
default:
break;
}
iir = BSP_SER_REG_U3_IIR & 0x0F;
}
OSIntExit();
}
3、串口2的中断服务程序
static void BSP_IntHandlerUART2 (void)
{
CPU_INT08U lsr;
CPU_INT08U iir;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntEnter();
OS_EXIT_CRITICAL();
iir = BSP_SER_REG_U2_IIR & 0x0F;
while (iir != 1)
{
switch (iir)
{
case 2: /* Transmitted character? */
break;
case 4: /* Received a character? */
lsr = BSP_SER_REG_U2_LSR;
BSP_Ser2RxData = BSP_SER_REG_U2_RBR;
bsp_ser_plc_rx_data (BSP_Ser2RxData);
(void)lsr;
break;
default:
break;
}
iir = BSP_SER_REG_U2_IIR & 0x0F;
}
OSIntExit();
}
4、串口2和串口3初始化后,UART2和UART3的寄存器配置如附件照片。
问题:
1)上述程序中是已经使用了ucos:UART2和UART3具有相同的配置形式,UART2可以正常接收和发送,但UART3不可以(将UART3的TX和RX对接后,TX发出的数据后,不能进入到接收中断。另外,有时能进入到中断服务器程序,但识别不到任何中断源:RBR Interrupt,THRE Interrupt, 还是RX LINE Status Interrupt)。
2)直接使用未嵌入ucos的工程,在相同的测试板上UART3可以正常发送数据和接收中断接收数据。
这个问题已经困扰我很久了,一直未得到解决。
请求帮助!
|
-
-
|