共2条
1/1 1 跳转至页
问
各位大侠好,用LPC2114设计的板子,两个串口运行串口实验程序收发都正常,硬件应该没问题,用了自己编写的串口程序就不能进中断正常收数,不知是什么原因,哪位高手能帮帮我,谢谢了
用的是2114的ARM Executable Image for lpc2100的工程模板,串口部分程序如下:
#include "config.h"
volatile uint8 rcv0_new;
volatile uint8 rcv1_new;
uint8 RcvFromARM[7]; //UART0数据接收数组
uint8 rcv0_buf[8]; // UART0数据接收缓冲区
uint8 rcv1_buf[8]; // UART1数据接收缓冲区
/********************************************************************
*名称:UART0_SendByte()
*功能:向串口UART0发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR=data; //发送数据
}
/********************************************************************
*名称:UART1_SendByte()
*功能:向串口UART1发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/
void UART1_SendByte(uint8 data)
{
U1THR=data; //发送数据
}
/********************************************************************
* 名称:UART0_SendBuf()
* 功能:向串口0发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void UART0_SendBuf(void)
{ uint8 i;
for(i=0; i<7; i++)
UART0_SendByte(RcvFromARM[i]);
while( (U0LSR&0x20)==0 ); // 等待数据发送
}
/********************************************************************
* 名称:UART1_SendBuf()
* 功能:向串口1发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void UART1_SendBuf(void)
{ uint8 i;
for(i=0; i<8; i++)
UART1_SendByte(rcv1_buf[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
}
/***************************************************************
*名称:IRQ_UART0()
*功能:串口UART0接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void __irq IRQ_UART0(void)
{ uint8 i;
if( 0x04==(U0IIR&0x0F) )
rcv0_new=1; // 设置接收到新的数据标志 rcv0_new
for(i=0; i<6; i++)
{
RcvFromARM[i] = U0RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/********************************************************************
*名称:IRQ_UART1()
*功能:串口UART1接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void __irq IRQ_UART1(void)
{ uint8 i;
if( 0x04==(U1IIR&0x0F) )
rcv1_new=1; // 设置接收到新的数据标志 rcv1_new
RcvCPLDHead= U1RBR;
for(i=0; i<8; i++)
{
RcvFromCPLD[i] = U1RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/*******************************************************************
*名称:UART0_Ini()
*功能:初始化串口0,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void UART0_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U0LCR=0x83; //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/*******************************************************************
*名称:UART1_Ini()
*功能:初始化串口1,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void UART1_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U1LCR=0x83; //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U1DLM=Fdiv/256;
U1DLL=Fdiv%256;
U1LCR=0x03;
}
int main (void)
{
uint8 i;
PINSEL0=(PINSEL0&0xFFF0FFF0)|0x00050005 ; //UART0初始化,UART1初始化
rcv0_new=0;
UART0_Ini(19200);
U0FCR=0x81;//使能FIFO,并设置出发点为8字节
U0IER=0x01;//允许RBR中断,即接收中断
rcv1_new=0;
UART1_Ini(19200);
U1FCR=0x81;//使能FIFO,并设置出发点为8字节
U1IER=0x01;//允许RBR中断,即接收中断
/*设置中断允许*/
VICIntSelect=0x00000000; //设置所有通道为IRQ中断
VICVectCntl0=0x26; //UART0中断通道分配到IRQ slot 0,VIC通道号为6
VICVectCntl1=0x27; //UART1中断通道分配到IRQ slot 1,VIC通道号为7
VICVectAddr0=(uint32)IRQ_UART0; //设置UART0向量地址
VICVectAddr1=(uint32)IRQ_UART1; //设置UART1向量地址
VICIntEnable=0x000000C0; //使能UART0、UART1,即bit6、bit7为1
while(1)
{
if(1==rcv0_new)
{
rcv0_new=0;
if (0x59==RcvFromARM[0])
{
if(0x43==RcvFromARM[1])
UART1_SendByte(0xFF); //向串口1发送FF命令
}
}
if(1==rcv1_new)
{
rcv1_new=0;
if ( RcvCPLDHead==0xAA)
{
rcv0_buf[0]=0x59;
rcv0_buf[1]=0x43;
for(i=2;i<8;i++)
{
rcv0_buf[i]= RcvFromCPLD[i-1];
}
UART0_SendByte(0x22);//向串口0发送数据0x22
UART0_SendBuf();//向串口0发送数组rcv0_buf[]
}
}
return(0);
}
答 1: RE检查你的启动代码中断开了没 答 2: 没中断UART0_IER那,你好像没设置啊 答 3: 看看启动代码中CPSR中的向量中断可打开了
用的是2114的ARM Executable Image for lpc2100的工程模板,串口部分程序如下:
#include "config.h"
volatile uint8 rcv0_new;
volatile uint8 rcv1_new;
uint8 RcvFromARM[7]; //UART0数据接收数组
uint8 rcv0_buf[8]; // UART0数据接收缓冲区
uint8 rcv1_buf[8]; // UART1数据接收缓冲区
/********************************************************************
*名称:UART0_SendByte()
*功能:向串口UART0发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR=data; //发送数据
}
/********************************************************************
*名称:UART1_SendByte()
*功能:向串口UART1发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/
void UART1_SendByte(uint8 data)
{
U1THR=data; //发送数据
}
/********************************************************************
* 名称:UART0_SendBuf()
* 功能:向串口0发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void UART0_SendBuf(void)
{ uint8 i;
for(i=0; i<7; i++)
UART0_SendByte(RcvFromARM[i]);
while( (U0LSR&0x20)==0 ); // 等待数据发送
}
/********************************************************************
* 名称:UART1_SendBuf()
* 功能:向串口1发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void UART1_SendBuf(void)
{ uint8 i;
for(i=0; i<8; i++)
UART1_SendByte(rcv1_buf[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
}
/***************************************************************
*名称:IRQ_UART0()
*功能:串口UART0接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void __irq IRQ_UART0(void)
{ uint8 i;
if( 0x04==(U0IIR&0x0F) )
rcv0_new=1; // 设置接收到新的数据标志 rcv0_new
for(i=0; i<6; i++)
{
RcvFromARM[i] = U0RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/********************************************************************
*名称:IRQ_UART1()
*功能:串口UART1接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void __irq IRQ_UART1(void)
{ uint8 i;
if( 0x04==(U1IIR&0x0F) )
rcv1_new=1; // 设置接收到新的数据标志 rcv1_new
RcvCPLDHead= U1RBR;
for(i=0; i<8; i++)
{
RcvFromCPLD[i] = U1RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/*******************************************************************
*名称:UART0_Ini()
*功能:初始化串口0,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void UART0_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U0LCR=0x83; //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/*******************************************************************
*名称:UART1_Ini()
*功能:初始化串口1,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void UART1_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U1LCR=0x83; //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U1DLM=Fdiv/256;
U1DLL=Fdiv%256;
U1LCR=0x03;
}
int main (void)
{
uint8 i;
PINSEL0=(PINSEL0&0xFFF0FFF0)|0x00050005 ; //UART0初始化,UART1初始化
rcv0_new=0;
UART0_Ini(19200);
U0FCR=0x81;//使能FIFO,并设置出发点为8字节
U0IER=0x01;//允许RBR中断,即接收中断
rcv1_new=0;
UART1_Ini(19200);
U1FCR=0x81;//使能FIFO,并设置出发点为8字节
U1IER=0x01;//允许RBR中断,即接收中断
/*设置中断允许*/
VICIntSelect=0x00000000; //设置所有通道为IRQ中断
VICVectCntl0=0x26; //UART0中断通道分配到IRQ slot 0,VIC通道号为6
VICVectCntl1=0x27; //UART1中断通道分配到IRQ slot 1,VIC通道号为7
VICVectAddr0=(uint32)IRQ_UART0; //设置UART0向量地址
VICVectAddr1=(uint32)IRQ_UART1; //设置UART1向量地址
VICIntEnable=0x000000C0; //使能UART0、UART1,即bit6、bit7为1
while(1)
{
if(1==rcv0_new)
{
rcv0_new=0;
if (0x59==RcvFromARM[0])
{
if(0x43==RcvFromARM[1])
UART1_SendByte(0xFF); //向串口1发送FF命令
}
}
if(1==rcv1_new)
{
rcv1_new=0;
if ( RcvCPLDHead==0xAA)
{
rcv0_buf[0]=0x59;
rcv0_buf[1]=0x43;
for(i=2;i<8;i++)
{
rcv0_buf[i]= RcvFromCPLD[i-1];
}
UART0_SendByte(0x22);//向串口0发送数据0x22
UART0_SendBuf();//向串口0发送数组rcv0_buf[]
}
}
return(0);
}
答 1: RE检查你的启动代码中断开了没 答 2: 没中断UART0_IER那,你好像没设置啊 答 3: 看看启动代码中CPSR中的向量中断可打开了
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |