最近自己在写一个UART口的驱动,工程事先自己已经移植好了ucosii操作系统,芯片LPC1765的启动代码也是自己写的,PLL部分初始化已经完成,除此外,工程没有其他
的内容。
现开始写UART驱动,写完后,UART0工作是正常的,但是UART2怎么弄都不行。UART2是按照UART0模板,改改寄存器和相关变量写的,NVIC部分经过测试是正常的(自己在调试的时候人为修改相应 interrupt set pend寄存器的位后,是能够进入串口2中断服务程序的),此外,串口2引脚功能设置检查没问题,电源PCONP也开了。到底还有哪个地方我忽略了?我好郁闷啊....纠结了差不多一天了,还没调出来......
以下是代码
/************************************************************
*函数名 InitUart2
*
*
*描述 初始化串口2设备
*
* 【使用方法】
* 1.在lpc17xxconfig.h设置宏UART0_BPS
* 选择波特率有:2400、 4800、 9600、 115200
* 2.包含头文件include.h —— "../include.h"
* 3.调用该语句
*
*参数
*
*
*返回
*
*************************************************************
*/
void InitUart2(void (*callback)(void))
{
#if UART2_USE == 0
while(TRUE);
#else
//数据初始
INT16U ulFdiv;
bspUart2Info.tail = 0;
bspUart2Info.head = 0;
bspUart2Info.rcvingData = 0;
bspUart2Info.noDataCnt = 0;
bspUart2Info.maxBuffer = UART2_FIFO_NUM;
if(bspUart2Info.uartData != NULL)
free(bspUart2Info.uartData);
bspUart2Info.uartData = (byte*)malloc(UART2_FIFO_NUM*sizeof(byte));
bspUart2Info.callBack = callback; //回调函数地址赋值
PCONP |= (1ul<<24);
PINSEL0 = PINSEL0 & (~(0x0F000000)); //相关位置清0
PINSEL0 = PINSEL0 | (0x05000000); //设置UART功能
//8个数据位,1个停止位,无校验
U2LCR = 0x83; //允许设置波特率
ulFdiv = (PCLK_MHZ*1000000 / 16) / UART2_BPS; //设置波特率
U2DLM = ulFdiv / 256; //高8位
U2DLL = ulFdiv % 256; //低8位
U2LCR = 0x03; //锁定波特率
U2FCR = 0x07; //使能FIFO,设置1个字节触发点
ISRRemap(uart2Isr, UART2_EXCEPT_NUM, ISR_PRIO_7, ISR_EN); //使能中断
U2IER = 0x01; //使能接收中断
#endif
}
/***************************************************
*函数名 uart2Isr()
*
*描述 串口2中断处理程序
*
*
*
*
*参数
*
*返回
*
*****************************************************
*/
void uart2Isr(void)
{
#if UART2_USE == 1
INT8U temp;
OSIntEnter();
while ((U2IIR & 0x01) == 0) //判断是否有中断挂起
{
switch (U2IIR & 0x0E) //判断中断标志
{
case 0x04:
//有数据
temp = U2RBR; //提取数据
bspUart2Info.rcvingData = 1; //标识正在接收数据
bspUart2Info.noDataCnt = 0; //无数据计时清0
BspUartDataPush(&bspUart2Info, temp);
break;
case 0x0C: //字符超时中断
while ((U2LSR & 0x01) == 0x01) //判断数据是否接收完毕
temp = U2RBR;
break;
default:
break;
}
}
temp = temp; //防止编译器警告
OSIntExit();
#endif
}
|