求助:STM32F205 串口无法接收数据

further_away 2013-06-24 05:35:44
现象如题.
发送中断是可以进去的。
想了很久没想到原因在哪,求帮助。
代码如下:
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

void Uart2_Init(u32 nBaud)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//
USART_DeInit(USART2);
//
RCC_AHB1PeriphClockCmd(UART2_TX_GPIO_CLK|UART2_RX_GPIO_CLK,ENABLE);
RCC_APB1PeriphClockCmd(UART2_CLK,ENABLE);

//
GPIO_PinAFConfig(UART2_TX_GPIO_PORT,UART2_TX_PIN,GPIO_AF_USART2);
GPIO_PinAFConfig(UART2_RX_GPIO_PORT,UART2_RX_PIN,GPIO_AF_USART2);

//TX
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = UART2_TX_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(UART2_TX_GPIO_PORT,&GPIO_InitStructure);
//RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = UART2_RX_PIN;
GPIO_Init(UART2_RX_GPIO_PORT,&GPIO_InitStructure);

//
USART_InitStructure.USART_BaudRate = nBaud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);


USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);

USART_Cmd(USART2, ENABLE);
//·ÀÖ¹µÚÒ»¸öÊý¾ÝÎÞ·¨·¢ËÍÎÊÌâ¡£
//USART_GetITStatus(USART2, USART_FLAG_TC);
}


void USART2_IRQHandler(void)
{
//
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART2);
}

//
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
//USART_ClearITPendingBit(UART4,USART_IT_TXE);
}

//
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
{
ElemType eDat;

g_TestInfo.nUart2RcvCnt++;
eDat = USART_ReceiveData(USART2) & 0xFF;
QueueIn(Get_Uart2_Rx_Fifo(),eDat);

USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}

}

...全文
955 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xijiaoguozi 2016-02-24
  • 打赏
  • 举报
回复
楼主你好,我目前也遇到了这个问题,在TX和RX短接的瞬间会进入到接收中断中去,但断开接入外部设备就无法进入接收中断了,想请教一下楼主怎么解决的
willnner 2015-11-11
  • 打赏
  • 举报
回复
你的是STM32F205? 我也是刚刚用完这个芯片 做串口。好像你的串口配置跟我的不太一样。 嘿嘿 我是新手
duran0322 2014-07-31
  • 打赏
  • 举报
回复
复用有的,代码是这个: GPIO_PinAFConfig(UART2_TX_GPIO_PORT,UART2_TX_PIN,GPIO_AF_USART2); GPIO_PinAFConfig(UART2_RX_GPIO_PORT,UART2_RX_PIN,GPIO_AF_USART2); 问题应该就是这里UART2_TX_PIN,UART2_RX_PIN,复用设置时应该用GPIO_PinSource2,GPIO_PinSource3。 刚才也遇到这个问题,发现是这里错了,给以后的朋友们提个醒。
zhxianbin 2013-06-25
  • 打赏
  • 举报
回复
先把发送中断关了,在中断函数的入口断点看看能不能进入,如果不能那确定就是配置的问题了,找 st 的 demo看看
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 11 楼 u011004181 的回复:
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET) { USART_ReceiveData(USART2); } 这接受到的数据放在哪儿了,不存起来? if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) { ElemType eDat; g_TestInfo.nUart2RcvCnt++; eDat = USART_ReceiveData(USART2) & 0xFF; QueueIn(Get_Uart2_Rx_Fifo(),eDat); USART_ClearITPendingBit(USART2, USART_IT_RXNE); } 紧接着同一个中断里面串口接受两次数据是怎么回事,你把上面接收数据的那行屏掉试试
第一个是处理ORG异常的呢。不是接受函数的。
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 10 楼 zhxianbin 的回复:
可以试试先把发送中断关了,从最简单的开始调试
最早是没有发送中断的,就是为了调试才加入的。 关了发送中断,现象还是这样。。 我是STM32F205的板子,HSE是 12M 这个应该没印象吧。
lr2131 2013-06-25
  • 打赏
  • 举报
回复
引用 10 楼 zhxianbin 的回复:
可以试试先把发送中断关了,从最简单的开始调试
就是这个意思,发送不用中断写,会比用中断简单的。 不要一下子把两个中断都加上来,一个一个的慢慢来嘛。 不知道会不会是发送中断影响到了接收中断呢,也不知道。 我自己也没用过发送中断的方式,说不上什么。 STM32F10x玩得少,代码方面帮不上忙哦。
单片机111 2013-06-25
  • 打赏
  • 举报
回复
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET) { USART_ReceiveData(USART2); } 这接受到的数据放在哪儿了,不存起来? if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) { ElemType eDat; g_TestInfo.nUart2RcvCnt++; eDat = USART_ReceiveData(USART2) & 0xFF; QueueIn(Get_Uart2_Rx_Fifo(),eDat); USART_ClearITPendingBit(USART2, USART_IT_RXNE); } 紧接着同一个中断里面串口接受两次数据是怎么回事,你把上面接收数据的那行屏掉试试
zhxianbin 2013-06-25
  • 打赏
  • 举报
回复
可以试试先把发送中断关了,从最简单的开始调试
further_away 2013-06-25
  • 打赏
  • 举报
回复
RCC_AHB1PeriphClockCmd(UART2_TX_GPIO_CLK|UART2_RX_GPIO_CLK,ENABLE); 时钟没问题,对过了,是PA0、PA1脚。如果GPIOA没开启时钟,发送也应该不行。 复用有的,代码是这个: GPIO_PinAFConfig(UART2_TX_GPIO_PORT,UART2_TX_PIN,GPIO_AF_USART2); GPIO_PinAFConfig(UART2_RX_GPIO_PORT,UART2_RX_PIN,GPIO_AF_USART2);
zhxianbin 2013-06-25
  • 打赏
  • 举报
回复
RCC_AHB1PeriphClockCmd(UART2_TX_GPIO_CLK|UART2_RX_GPIO_CLK,ENABLE); 这句有没有错,是不是: RCC_AHB2PeriphClockCmd(UART2_TX_GPIO_CLK|UART2_RX_GPIO_CLK,ENABLE); 有没有复用?
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 6 楼 zhxianbin 的回复:
stm32f20x 和 stm32f10x 代码看起来稍有不同啊。
GPIO_InitTypeDef GPIO_InitStructure;

    //在开启GPIO时钟时同时开启串口时钟,或者先开启串口时钟,再配置串口GPIO为复用功能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE);

    /* Configure USART3 Rx (PB11) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure USART3 Tx (PB10) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
这是 stm32f103 的 USART3
恩,STM32F2xx系列的配置模式 不一样。 不知道是不是配置模式问题,但是不知道怎么搞。
zhxianbin 2013-06-25
  • 打赏
  • 举报
回复
stm32f20x 和 stm32f10x 代码看起来稍有不同啊。
GPIO_InitTypeDef GPIO_InitStructure;

    //在开启GPIO时钟时同时开启串口时钟,或者先开启串口时钟,再配置串口GPIO为复用功能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE);

    /* Configure USART3 Rx (PB11) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure USART3 Tx (PB10) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
这是 stm32f103 的 USART3
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 3 楼 lr2131 的回复:
[quote=引用 1 楼 further_away 的回复:] 补充下我把RS232的TX和RX链接到一起,发送能进中断,接收却无法进入中断。
用回环的方法来测试是个好方法。 发送可以不用中断吧? 楼上哥们说得对。 一般发送是不用中断的,接收一般都是用中断的。就算你以后想发送也用中断,目前还是先不用发送中断,先把接收中断调好了再说,然后再看要不要把发送也改成中断。 [/quote] 是为了调接收中断才加入发送终端的。 现在就是找不到我为什么 进步了接收中断。 接收引脚RX怎么配置?
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 2 楼 zhxianbin 的回复:
中断函数写得这么复杂,发送可以不用中断吧?
void USART2_IRQHandler( void )
{
    if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)!= RESET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        USART_ReceiveData(USART2);
    }
}
中断不复杂呀, 3个分别是ORE是防止溢出造成的司机的。 发送终端是为了测试的。 接收的和你的这个一样呢。 还是没办法接收。
lr2131 2013-06-25
  • 打赏
  • 举报
回复
引用 1 楼 further_away 的回复:
补充下我把RS232的TX和RX链接到一起,发送能进中断,接收却无法进入中断。
用回环的方法来测试是个好方法。 发送可以不用中断吧? 楼上哥们说得对。 一般发送是不用中断的,接收一般都是用中断的。就算你以后想发送也用中断,目前还是先不用发送中断,先把接收中断调好了再说,然后再看要不要把发送也改成中断。
zhxianbin 2013-06-25
  • 打赏
  • 举报
回复
中断函数写得这么复杂,发送可以不用中断吧?
void USART2_IRQHandler( void )
{
    if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)!= RESET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        USART_ReceiveData(USART2);
    }
}
further_away 2013-06-25
  • 打赏
  • 举报
回复
补充下我把RS232的TX和RX链接到一起,发送能进中断,接收却无法进入中断。
further_away 2013-06-25
  • 打赏
  • 举报
回复
进一步确认是这样的。 在TX和RX短接的瞬间会进入到接收中断中去,但是接收的数据与发送的不一致也不固定。(终端1S发送一个0XF0数据)。这么看来发送中断和接收中断是正常的。。 我以为硬件问题,我拿了另外一个板子还是这样。 百思不得其解,求帮助。 跟HSE为12M有关系么?
further_away 2013-06-25
  • 打赏
  • 举报
回复
引用 17 楼 zhxianbin 的回复:
http://blog.csdn.net/whw8007/article/details/8973127
谢谢,初始化是对着这个搞得。。
加载更多回复(2)

27,375

社区成员

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

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