OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5164|回复: 6

串口2无法进入中断

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-12-2
在线时间
0 小时
发表于 2015-12-2 09:08:38 | 显示全部楼层 |阅读模式
5金钱
请教各位个问题,我用的VC的片子,分别初始化了USART1 USART2 UART4 UART5
其中唯独USART2进不了接收中断,百思不得其解,请各位高人解惑. 现贴USART2 USART1(用于比较)代码如下:

[mw_shl_code=c,true]void usart2_init( unsigned int pclk1, unsigned int baud ) { float temp; unsigned short mantissa, fraction; temp = ( float )( pclk1 * 1000000 ) / ( baud << 4 ); mantissa = temp; fraction = ( temp - mantissa ) * 16 + 0.5; mantissa <<= 4; mantissa |= fraction & 0x000F; /* 使能USART2 */ RCC->APB1ENR |= 1 << 17; /* AFIO时钟 */ //RCC->APB2ENR |= 1; /* 开启USART2重映射 */ //AFIO->MAPR |= 1 << 3; /* 使能PD */ RCC->APB2ENR |= 1<<2;//1 << 5; /* PD5(TX)推挽输出50M PD6(RX)上拉输入 */ //GPIOD->CRL &= 0xF00FFFFF; //GPIOD->CRL |= 0x08B00000; GPIOA->CRL &= 0xFFFF00FF; GPIOA->CRL |= 0x00008b00; /* 重启USART2 */ RCC->APB1RSTR |= 1 << 17; RCC->APB1RSTR &= ~( 1 << 17 ); /* 置BAUD率 */ USART2->BRR = mantissa; /* 使能USART2 使能接收和发送 8个数据位 无奇偶校验 */ USART2->CR1 = 0x200C; /* 一个停止位 */ USART2->CR2 &= ~0x3000; /* 处理接收 */ /* 开奇偶校验(PE)中断 */ USART2->CR1 |= 1 << 8; /* 开接收区不空中断(RXNEIE) 也就是有数据就中断(包括过载 过载就是数据有了还来 多了) */ USART2->CR1 |= 1 << 5; /* 两个优先级各2位 3 2 比USART1高 通道为USART2_IRQn 对应处理函数为USART2_IRQHandler 在startup的汇编文件中 */ set_ir( 3, 2, USART2_IRQn ); } void usart2_send( unsigned char* dat, unsigned int size ) { unsigned int i; while ( !( USART2->SR & ( 1 << 6 ) ) ); if ( !size ) { for ( i = 0; dat; i ++ ) { USART2->DR = dat; while ( !( USART2->SR & ( 1 << 6 ) ) ); } } else { for ( i = 0; i < size; i ++ ) { USART2->DR = dat; while ( !( USART2->SR & ( 1 << 6 ) ) ); } } } void USART2_IRQHandler( void ) { unsigned char dr; if ( USART2->SR & ( 1 << 5 ) ) { dr = USART2->DR; usart2_send( (unsigned char*)&dr, 1 ); } }[/mw_shl_code]

下面是USART1的,一切正常.上面USART2试过映射  映射也还是进不了中断.
[mw_shl_code=c,true]void usart1_init( unsigned int pclk2, unsigned int baud ) { float temp; unsigned short mantissa, fraction; temp = ( float )( pclk2 * 1000000 ) / ( baud << 4 ); mantissa = temp; fraction = ( temp - mantissa ) * 16 + 0.5; mantissa <<= 4; mantissa |= fraction & 0x000F; /* 使能USART1 */ RCC->APB2ENR |= 1 << 14; /* 使能PA */ RCC->APB2ENR |= 1 << 2; /* PA9(TX)推挽输出50M PA10(RX)上拉输入 */ GPIOA->CRH &= 0xFFFFF00F; GPIOA->CRH |= 0x000008B0; /* 重启USART1 */ RCC->APB2RSTR |= 1 << 14; RCC->APB2RSTR &= ~( 1 << 14 ); /* 置BAUD率 */ USART1->BRR = mantissa; /* 使能USART1 使能接收和发送 8个数据位 无奇偶校验 */ USART1->CR1 = 0x200C; /* 一个停止位 */ USART1->CR2 &= ~0x3000; /* 处理接收 */ /* 开奇偶校验(PE)中断 */ USART1->CR1 |= 1 << 8; /* 开接收区不空中断(RXNEIE) 也就是有数据就中断(包括过载 过载就是数据有了还来 多了) */ USART1->CR1 |= 1 << 5; /* 两个优先级各2位 3 3 全是最低 通道为USART1_IRQn 对应处理函数为USART1_IRQHandler 在startup的汇编文件中 */ set_ir( 3, 3, USART1_IRQn ); } void usart1_send( unsigned char* dat, unsigned int size ) { unsigned int i; while ( !( USART1->SR & ( 1 << 6 ) ) ); if ( !size ) { for ( i = 0; dat; i ++ ) { USART1->DR = dat; while ( !( USART1->SR & ( 1 << 6 ) ) ); } } else { for ( i = 0; i < size; i ++ ) { USART1->DR = dat; while ( !( USART1->SR & ( 1 << 6 ) ) ); } } } void USART1_IRQHandler( void ) { unsigned char dr; if ( USART1->SR & ( 1 << 5 ) ) { dr = USART1->DR; usart1_send((unsigned char*)&dr, 1); } }[/mw_shl_code]

请各位不吝赐教,谢谢了.

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 09:39:24 | 显示全部楼层
同样的程序,我放在了三块板子(正点原子的 我自己画的 还有一个网上的核心板)上跑,结果一样,均是USART1 UART4 UART5一切正常 USART2发送正常 接收进不了中断.从现象上看可以排除是硬件问题,但是软件问题也很奇怪,我四个串口程序几乎是一样的,就是涉及寄存器不一样,为何单单USART2出问题.
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-12-2 11:09:47 | 显示全部楼层
是哪顆IC阿 型號?好歹也講一下
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 11:25:00 | 显示全部楼层
STM32F103VCT6 
刚才又拿原子的MINI板子试了下
设计如下:
当串口2进接收中断时,用串口1发送数据回PC..发现串口2还是能进中断的,而且进了非常多次..
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 11:25:29 | 显示全部楼层
很多是乱码...
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 18:18:15 | 显示全部楼层
我今天调了一天也没调出来,大致问题定位在软件问题或STM32有BUG上。

1. 我三块不同的板子试同样的代码,结果一样,从这个角度来讲,硬件连接没有错。或者说不可能都错了。
2. USART1 USART2 UART4 UART5 几乎是完全相同的代码,寄存器不同,中断字等的设置我尤其注意,几乎不可能错。而且实际情况也证明了USART1 UART4 UART5都完全可行,甚至USART2的发送也是一切OK的。问题恰恰出在USART2会多接收很多东西,出来是乱码。而这个情况在其它三个串口的实现中并不存在
3.上面代码几乎没变,请大家有时间帮忙看下,是不是哪里不细心错了,或者这一块STM32有问题!我现在已经有点怀疑了。谢谢

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-2 22:50:35 | 显示全部楼层
参考下我们的例程:http://www.openedv.com/posts/list/631.htm
见六楼
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-16 01:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表