我的串口进了中断就出不来了

xiajunqing 2009-12-08 08:03:33
代码如下:
unsigned char UART0_Init(unsigned long baud)
{

unsigned long bak;
PINSEL0 = (PINSEL0 & 0xfff0ffff)|0x00050005; //选择管脚为UART1
/**设置串口波特率**/
U0LCR = 0x83;
bak = (Fpclk /16)/baud;
U0DLM = bak >>8;
U0DLL = bak & 0xff;
U0LCR = 0x03;
U0FCR = 0x81;
U0IER = IER_RBR | IER_THRE | IER_RLS ; /* Enable UART0 interrupt */ //
VICIntSelect = 0x00000000; //设置所有通道为IRQ中断
VICVectCntl0 = 0x20|0x06; //UART0分配到IRQ slot0,即具有最高优先级
VICVectAddr0 = (unsigned long)IRQ_UART0; //设置UART的向量地址
VICIntEnable = 1<<0x06; //使能UART中断 return(1);
}


/*串口0中断处理函数*/

void IRQ_UART0 (void) __irq
{
unsigned char i;

IOCLR0=0x40000000;
if((U0IIR & 0x0E) == 0x0C||(U0IIR & 0x0E) == 0x04||(U0LSR & 0x080)!=0) //如果我这里不加(U0LSR & 0x080)!=0的话,它进不了if语句执行,U0LSR & 0x080)!=0表明串口传输有帧错误。怎样能使它无帧传输的错误,而且它进了中断就死在里面了,跳不出去了,真是郁闷啊。 {
IOCLR0=0x20000000;
rcv_new0 = 1; //设置接收到新的数据标志
}
for(i = 0; i < 8; i ++) //FIFO使能时设为8字节长度
{//IOCLR0=0x20000000;
rcv_buf0[i] = U0RBR; //读取FIFO的数据,并清除中断
if(rcv_buf0[i]=='\n')break;
}
VICVectAddr = 0x00; //中断处理结束,更新硬件优先级
return;
}


int main()
{ GPIOInit();
while(1)
{
IOSET0=0x20000000;
if(rcv_new0 == 1) //若串口0接收到数据,则rcv_new0 =1
{

rcv_new0 = 0;
UART0_SendBuf(); // 将串口0的数据发出去

}

}
}
大家看红字,问题主要在那边,看我的串口初始化有没有漏掉什么地方。不然它怎么不响应if((U0IIR & 0x0E) == 0x0C||(U0IIR & 0x0E) == 0x04)这个条件呢?而且也跳不出中断。我用的lpc2148的ARM
...全文
1254 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
PP11LL 2010-10-25
  • 打赏
  • 举报
回复
你有没有清中断啊?不清中断是出不来的。
breaker007 2010-01-04
  • 打赏
  • 举报
回复
给你一个提示:U0IIR是只能读一次的
xiajunqing 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 great_bug 的回复:]
...............
可能是速率不对吧?
很多ARM核的MCU都有PLL,也许你的时钟并不是你想要的.....
[/Quote]你说的对
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 heyme 的回复:]
帧错误的原因就是将波特率设置对,然后就是停止位奇偶校验等设置是否需要,进一次中断第二次不能进,如果一直有数据进来而不产生中断,可能是你的中断标志位没清除造成的,看看有没有帧错误的中断标志位。
[/Quote]现在新的问题出来了,进了中断之后所有的条件都不响应,如字符超时,帧错误,有新的数据等条件一概都不响应,就直接出来了,这些条件我也一一查了,没有写错,到底怎么了?
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
现在新的问题出来了,进了中断之后所有的条件都不响应,如字符超时,帧错误,有新的数据等条件一概都不响应,就直接出来了,这些条件我也一一查了,没有写错,到底怎么了?
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 heyme 的回复:]
帧错误的原因就是将波特率设置对,然后就是停止位奇偶校验等设置是否需要,进一次中断第二次不能进,如果一直有数据进来而不产生中断,可能是你的中断标志位没清除造成的,看看有没有帧错误的中断标志位。
[/Quote]你分析的很透彻,我的错误是:Rx FIFO 错误。如帧错误、奇偶错误或间隔中断错误中的一个。但是我的波特率也设置好了,奇偶校验不允许,间隔中断也是不允许的,不知这错误到底从哪来的
HeyMe 2009-12-09
  • 打赏
  • 举报
回复
帧错误的原因就是将波特率设置对,然后就是停止位奇偶校验等设置是否需要,进一次中断第二次不能进,如果一直有数据进来而不产生中断,可能是你的中断标志位没清除造成的,看看有没有帧错误的中断标志位。
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
大家别光顶了,帮我想想办法,帧传输错误有哪些原因导致的。我现在能进中断,也能出中断,但是只能进一次,第二次就进不去了
Great_Bug 2009-12-09
  • 打赏
  • 举报
回复
...............
可能是速率不对吧?
很多ARM核的MCU都有PLL,也许你的时钟并不是你想要的.....
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
新的问题:我就简单的试了一下串口0进然后串口0出的程序,发去的东西收回来的总是乱码。怎么回事啊?
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mxm1986 的回复:]
你的系统支持中断嵌套吗?就算支持中断嵌套,也是要考虑优先级的啊?
另外,你的gpio引脚把这些配置成rxd txd了吗???你可以不用中断试试,看看能不能正常收。。
另外看看发送能不能正常发送。。。
[/Quote]jtag对串口有影响吗?我将jtag口拔掉,他接收数据了
xiajunqing 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mxm1986 的回复:]
你的系统支持中断嵌套吗?就算支持中断嵌套,也是要考虑优先级的啊?
另外,你的gpio引脚把这些配置成rxd txd了吗???你可以不用中断试试,看看能不能正常收。。
另外看看发送能不能正常发送。。。
[/Quote]我用你的方法试了,循环接收串口都接收不到数据。这是什么原因呢?帮帮忙,我都快急死了
mxm1986 2009-12-09
  • 打赏
  • 举报
回复
你的系统支持中断嵌套吗?就算支持中断嵌套,也是要考虑优先级的啊?
另外,你的gpio引脚把这些配置成rxd txd了吗???你可以不用中断试试,看看能不能正常收。。
另外看看发送能不能正常发送。。。
hallowwar 2009-12-08
  • 打赏
  • 举报
回复
再顶:这里的人气不低的。
hallowwar 2009-12-08
  • 打赏
  • 举报
回复
老兄,你的是ARM,我的一个C2051的中断都整不明白了,这中断真的是很麻烦啊,帮顶。
xiajunqing 2009-12-08
  • 打赏
  • 举报
回复
现在能跳出中断了,可还就是发生帧错误,帧错误产生的原因有哪些?
xiajunqing 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 heyme 的回复:]
波特率正确应该是调试的前提啊。
进入中断后还是首先先判定一下中断类型,要是帧错误就直接跳出,要是有接收,先计算一下buffer里面的数据个数(不知道有没有这个寄存器),然后在依次读出。
[/Quote] 刚试了一下,8个bit接收注释掉了,可还是跳不出中断。很郁闷了。没有计算buffer里面的数据个数的寄存器
贝隆 2009-12-08
  • 打赏
  • 举报
回复
帮顶
HeyMe 2009-12-08
  • 打赏
  • 举报
回复
波特率正确应该是调试的前提啊。
进入中断后还是首先先判定一下中断类型,要是帧错误就直接跳出,要是有接收,先计算一下buffer里面的数据个数(不知道有没有这个寄存器),然后在依次读出。
xiajunqing 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 heyme 的回复:]
是不是波特率没对呢,要不然怎么会一直帧错误?

还有就是一直出不了中断是死在哪个位置?你的中断处理函数,为什么一定要去读取8Byte的数据,要是由于帧错误而产生的中断,你读8bytes数据是不是就不正确呢,应该先判定一下中断类型后再作出相应的处理吧?

没用过你的这种ARM,但三星的ARM发生中断后要清除一下interrupt pending (接受发送或者错误都有相应的标志位)之类的东西
[/Quote]我的这个中断清除的方法就是读取U0IIR的值就可以了,U0IIR的值就是当前中断标志位
加载更多回复(6)
有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便 1: 插入电脑USB接口 2: 把升级固件拖到设备盘符 3: 升级完成 抛弃繁琐的USB DFU,抛弃落后的串口升级,让我们来谈谈U盘升级STM32 1. 为什么设计这个BOOT LOADER 在电子产品开发过程中,为了满足市场需要,经常是先开发出一个简单可用的版本,然后逐步迭代升级,修复bug,并增强系统功能 一个稳定,简单,安全的升级方式,就变得非常重要 对于嵌入式系统来说,常见的升级方式为 串口升级(私有协议或者X-Modem) USB升级(DFU) U盘升级(OTG) 网络升级 无线升级(OTA) 从技术来说,这几种升级方式大同小异,原理类似:都是一个Loader代理接收数据通道的数据,然后解密,烧录到FLASH中;但用户体验完全不同,拿串口升级来说,首先用户需要一个串口软件,然后对于没有硬件串口的PC来说,就需要一个USB转串口设备,对于不同PC平台,串口软件就不一样,这需要学习成本,过程繁琐;所以在一些需要用户自行升级远程设备的情况下,即便是通过电话指导,80%的用户仍然不知道怎么升级,导致失败 USB的DFU升级,也是类似的问题,它设计的初衷就是面向专业用户的,而不是小白!所以需要安装DFU软件,按照手册来一步步升级 OTA升级和网络升级,体验好些,可用做到无感升级,但不适合所有场景 而U盘升级,用户学习成本最低,U盘大家都知道,然后拷贝一个Bin文件去,插入设备,重启设备,就完成升级了,非常简单。类似的变种,比如手机升级,是最先的,直接将手机模拟成U盘,然后用户拷贝数据到手机,重启就好了,非常简单 在嵌入式系统中,还没这么方便的升级手段,虽然ARM的Mbed有一种类似的固件更新功能,但它是专门为调试器设计的,不能内嵌到用户MCU中 所以,我将手机升级的方案引入到嵌入式系统中,从而为大家提供一个实现稳定,安全,零学习成本的升级方案 经过一段时间的学习研究,有了这个USB MSD Bootloader 2. 功能特点 只占用15K FLASH空间 简单易用,直接拖拽文件行固件升级,无需任何专业知识 采用USB大容量设备类,不用安装任何驱动 支持各种系统(Windows/Linux/Mac/Android) 不用开发任何上位机,提高产品效率 支持各种加密算法(AES256等),轻松安全升级 自动识别Bin,Hex,自定义加密固件(后缀为sec)文件 支持MD5文件校验机制,保证固件升级的完整性 显示设备升级状态信息 支持长文件名升级 多种措施保证系统健壮性,保证Bootloader不会被误擦除,保证APP合法性 支持用户自定义加密算法和完整校验算法,极致安全 3. 系统原理 系统开机上电后,Bootloader接管系统,初始化USB硬件,等待USB连接 Bootloader在启动后1秒内,检测USB是否连接PC:如果连接PC,则入固件升级模式,执行第3步;超时则跳转第8步,尝试执行用户APP Bootloader模拟成MSD设备,构建FAT16虚拟文件系统,U盘名为”Bootloader”,容量为100M,但具体实际可用空间,根据用户MCU来确定,建议不要复制除APP之外的无关文件 当用户复制文件到U盘时,Bootloader会判断文件后缀和判断文件size,如果size大于实际的MCU可用FLASH或者文件后缀不合法,则入错误状态,更新状态文件,重新枚举USB 文件后缀和size通过检测后,Bootloader会截获PC发送文件数据流,并写入MCU 对应的Flash中 如果写入过程中出错,则终止操作,擦除APP内容,入错误状态,更新状态文件,重新枚举USB 成功写入后,Bootloader更新状态文件,重新枚举USB,显示升级完成;但不会运行APP,只有拔掉USB后,再次重启,才会入第8步,尝试运行APP Bootloader检查APP固件的栈和入口函数合法性,只有通过检测后,才开始执行APP。检测判断条件是栈指针必须在RAM地址空间内,入口函数地址必须处于THUMB模式,并LSB为1 停止USB设备,关掉所有的中断,执行APP,APP开始接管系统 4. 支持芯片 STM32F101/3/5/7 重点来了,点击下面链接,下载固件

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧