打印
[STM32F2]

UART中断方式如何使用,请用过的进来指点一下

[复制链接]
2401|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
murphy.he|  楼主 | 2014-8-31 17:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学STM32,最近在编一个使用USART2的小程序,
问题出在接收数据的地方,目前不使用中断,循环检测RXNE标志然后读数据,数据都能收到,正常。
希望数据处理速度更合理一些,所以希望改成中断方式,但是发现代码进不了接收中断函数,在中断函数里改变一个值,在主函数循环里打印,这个值一直没变。也用JTAG看过,一直没进中断服务函数。
相关代码如下,请高手看看漏了什么,打开中断只调用了一行USART_ITConfig,后面设置优先级调与不调结果都一样
初始化部分:
void uart2_init()
{
    USART_InitStructure.USART_BaudRate = 57600;;
    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_ITConfig(EVAL_COM2, USART_IT_RXNE, ENABLE);//enable int
    STM_EVAL_COMInit(COM2, &USART_InitStructure);//init USART2

    NVIC_SetPriority(USART2_IRQn, 0x0);
    Uart2_Rx = 0;//debug value, init 0
}

stm32f2xx_it.c......................................
void USART2_IRQHandler()   
{   //printf("u2int\r\n");     
#if 1
    if(USART_GetITStatus(EVAL_COM2, USART_IT_RXNE) != RESET) //?D??2¨²¨¦¨²      
    {           
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(EVAL_COM2);         
        Uart2_Rx++;           
        Uart2_Rx &= 0x3F; //?D??¨º?¡¤???¨ºy¦Ì?¡Á?¡ä¨®      
        USART_ClearITPendingBit(EVAL_COM2,USART_IT_RXNE); //??3y?D??¡À¨º??.         
    }
#else   
    if (USART_GetFlagStatus(EVAL_COM2, USART_FLAG_ORE) != RESET)//¡Á¡é¨°a¡ê?2??¨¹¨º1¨®?if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)¨¤¡ä?D??
    {
        USART_ReceiveData(EVAL_COM2);
    }
    if(USART_GetITStatus(EVAL_COM2, USART_IT_RXNE) != RESET)
    {
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(EVAL_COM2);         
        Uart2_Rx++;           
        Uart2_Rx &= 0x3F; //?D??¨º?¡¤???¨ºy¦Ì?¡Á?¡ä¨®      
        // Clear the USART2 Receive interrupt
        USART_ClearITPendingBit(EVAL_COM2, USART_IT_RXNE);
    }
#endif
}
系统运行起来后,向stm32发送12个字符。没有反应。

沙发
STARM| | 2014-8-31 18:33 | 只看该作者
//    USART_ITConfig(EVAL_COM2, USART_IT_RXNE, ENABLE);//enable int
//    STM_EVAL_COMInit(COM2, &USART_InitStructure);//init USART2


    STM_EVAL_COMInit(COM2, &USART_InitStructure);//init USART2

    USART_ITConfig(EVAL_COM2, USART_IT_RXNE, ENABLE);//enable int

     USART_Cmd(EVAL_COM2, ENABLE);

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
murphy.he + 4 10
板凳
murphy.he|  楼主 | 2014-8-31 23:06 | 只看该作者
STARM 发表于 2014-8-31 18:33
//    USART_ITConfig(EVAL_COM2, USART_IT_RXNE, ENABLE);//enable int
//    STM_EVAL_COMInit(COM2, &US ...

谢谢。
按照这样修改了,程序还是无法进入串口中断服务程序。
不知道其它哪里还有问题。

使用特权

评论回复
地板
STARM| | 2014-9-1 11:25 | 只看该作者
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  /* Enable the USART Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
murphy.he + 4 5
5
zh113214| | 2014-9-1 23:26 | 只看该作者
好长的程序啊,不知道你的问题现在得到解决没!!

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
murphy.he + 4 赞一个!
6
murphy.he|  楼主 | 2014-9-3 00:37 | 只看该作者
STARM 发表于 2014-9-1 11:25
NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */  

我把这段程序加入到串口初始化里面,仍然进入不了中断。
大侠能否发给我一个能够进USART2中断的完整的代码工程给我参考,十分感谢!
我的邮箱murphy.he@163.com

使用特权

评论回复
7
airwill| | 2014-9-3 06:52 | 只看该作者
不如参考一下外设库里的例程吧,
PROJECT\STM32F2xx_StdPeriph_Examples\USART\HyperTerminal_Interrupt
PROJECT\STM32F2xx_StdPeriph_Examples\USART\USART_TwoBoards\DataExchangeInterrupt
都是带中断的 USART 例程.

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
murphy.he + 4 5
8
小浣熊| | 2014-9-3 16:56 | 只看该作者
进来看看,学习哈子。。中断确实很重要。。

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
murphy.he + 4
9
murphy.he|  楼主 | 2014-9-4 00:05 | 只看该作者
找到问题原因了,因为这个开发板给的代码里的COM2实际对应的是UART3,不是USART2,所以要打开UART3的中断才行,只是打开UART2的中断所以没有反应。
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
中断响应函数也是 void USART3_IRQHandler(void)
谢谢各位的耐心解答。

使用特权

评论回复
10
murphy.he|  楼主 | 2014-9-4 12:15 | 只看该作者
想结贴给分,不知道这是为什么:提示分数分配错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

291

帖子

1

粉丝