OpenEdv-开源电子网

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

求助在keil中单步调试,在usart中断函数中调试时没有进入接收判断的程序

[复制链接]

12

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2012-4-25
在线时间
0 小时
发表于 2012-5-21 09:26:15 | 显示全部楼层 |阅读模式

原子哥,在中断函数中,我用串口助手发送数据,但我试了直接操作寄存器和用库都不能执行if(RX_status == SET)
后面的语句也就是说接收标志没有置位,不知道什么原因,难道初始化有问题,我去先收一下你的usart程序试试看能行不 ,你有创建qq群吗,想加个
谢谢!
 /* USART1初始化 */
  //USART_InitTypeDef USART_InitStructure;
 USART_DeInit(USART1);
USART_InitStructure.USART_BaudRate = 9600;
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(USART1,&USART_InitStructure);
USART_ClearFlag(USART1, USART_FLAG_RXNE);    //清中断,以免一启用中断后立即产生中断
//USART_ClearFlag(USART1, USART_FLAG_TC);
//USART1->CR1 &= 0xFFBF;  //关闭TC中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //使能发送DMA

USART_Cmd(USART1,ENABLE);


void USART1_IRQHandler(void)  //中断法接受中断发送用dma
{
  //OS_CPU_SR  cpu_sr;
 
  //OS_ENTER_CRITICAL();
  //OSIntNesting++;
  //OS_EXIT_CRITICAL();
  FlagStatus  RX_status;
  RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);  //接收到数据
  GPIO_SetBits(GPIOB,GPIO_Pin_2);

  if(RX_status == SET)
  //if((USART1->SR&0x0020)!=0)  //RXNE中断    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

 
   { 
     USART_ClearFlag(USART1,USART_FLAG_RXNE); 
    
    // TIM_Cmd(TIM7, ENABLE);
    //CTL485_H;  //1:MCU接收数据
 
 GPIO_SetBits(GPIOA, GPIO_Pin_11); //485准备接受
    //COM_FLAG_H;
 GPIO_SetBits(GPIOB, GPIO_Pin_2);
    RxBuffer[RxCounter] = (uint8_t)(USART1->DR & 0x01FF);  //接收数据
    if(RxStart==RESET)  //刚开始接收
    {
      if(RxBuffer[RxCounter]==MODBUS_ADDRESS)  //板地址正确
      {
     TIM_Cmd(TIM7, ENABLE); //定时开始
        RxCounter++;
        RxStart=SET;    //表示接收已经开始
        //Rxtimeout=0;     //清零超时计数器
      }
      else  //板地址不正确
      {
        RxCounter = 0;
        RxStart=RESET;
      }
    }
    else 
    {
      RxCounter++;
      RxStart=SET;    //表示接收已经开始
      //Rxtimeout=0;     //清零超时计数器
    }
 //清中断标志
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
      {
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);

      }

   }


 
  if((USART1->SR&0x0040)!=0)   //TC中断 (USART1->SR&0x0040)!=0 USART_GetITStatus(USART1, USART_IT_TXE) != RESET
  {
    USART1->CR1 &= 0xFFBF;  //关闭TC中断
    USART1->SR &= 0xFFBF;   //清TC中断标志  
 GPIO_SetBits(GPIOA, GPIO_Pin_11); //485准备接受
    //CTL485_H;               //1:MCU接收数据
   // COM_FLAG_H;
   GPIO_SetBits(GPIOB, GPIO_Pin_2);
  }
  USART_GetFlagStatus(USART1, USART_FLAG_ORE);  //清ORE标志
  USART_ReceiveData(USART1);                    //清ORE标志
  //OSIntExit();
}

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 23:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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