打印
[STM32F1]

吐血求教stm32+rs485问题

[复制链接]
2157|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 taijing33 于 2016-5-28 09:11 编辑

小弟是这样的。stm32串口1通过485给电脑发数据正常。
但是我用串口调试助手给单片机发数据。发现一直进入串口1中断。刚上电的时候不进入。只要是我一给单片机发送就一直在串口中断里、。
下面是代码:、

void NVIC_Configuration(void)
{

   NVIC_InitTypeDef          NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
        
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;               //ͨµÀÉèÖÃΪ´®¿Ú1ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;       //ÖжÏÕ¼Ïȵȼ¶0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //ÖжÏÏìÓ¦ÓÅÏȼ¶0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //´ò¿ªÖжÏ
        NVIC_Init(&NVIC_InitStructure);

}

void  USART1_init(void)
{

        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1
                               |RCC_APB2Periph_GPIOA ,ENABLE);
//        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        

    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_InitStructure.USART_BaudRate = 9600;
    USART_Init(USART1,&USART_InitStructure);  
          USART_ITConfig(USART1,USART_IT_TXE,DISABLE);   //DISABLE
          USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART1, ENABLE);
                //USART_ClearFlag(USART1,USART_FLAG_TC);

void USART1_IRQHandler(void)
{
        
        static u8 startdata =0;

        if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
        {   
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                   rdata =  USART_ReceiveData(USART1); //USART_ReceiveData(USART1)
//if((rdata!= 0x03)||(RxCounter1!=0))         //
                if(RxCounter1 != 0)        //
         {
                if(startdata!= 1) //??????????
                {
                        RxCounter1 = 0;
                        return;
                }                       
                if(RxCounter1 > 8)//??????
                {
                        RxCounter1 = 0;
                        startdata = 0;
                        return;
                }
                if(RxCounter1==1 && rdata!= 0X03)
                {
                    RxCounter1 = 0;
                        startdata = 0;
                        return;         
                }        
                if((RxCounter1 == 2) &&(rdata!= 0))        //??????,???
          {
                        RxCounter1 = 0;
                        startdata = 0;
                        return;
                }            
         if((RxCounter1 == 3) &&(rdata!= 0))        //??????,???
          {
                        RxCounter1 = 0;
                        startdata = 0;
                        return;
                }            
         if((RxCounter1 == 4) &&(rdata!= 0))        //??????,???
          {
                        RxCounter1 = 0;
                        startdata = 0;
                        return;
                }   
                 if((RxCounter1 == 5) &&(rdata!= 1))        //??????,???
          {
                        RxCounter1 = 0;
                        startdata = 0;
                        return;
                }   
                RX_BUFF1[RxCounter1++] =rdata;
               
        }
        else
        {
                //????               
                RX_BUFF1[0] = rdata;
                RxCounter1 = 1;
                startdata = 1;
        }
               
                 

        }
        

}



沙发
taijing33|  楼主 | 2016-5-27 17:57 | 只看该作者
这是电路图

使用特权

评论回复
板凳
icefox225| | 2016-5-27 19:34 | 只看该作者
不清标志肯定一直进

使用特权

评论回复
地板
zhaoyu2005| | 2016-5-27 20:33 | 只看该作者
哎,挂上jlink,看看标志位的值就知道了,另外还要注意一个错误中断,好好看datasheet。

使用特权

评论回复
5
mmuuss586| | 2016-5-27 21:09 | 只看该作者
是不是中断溢出了

使用特权

评论回复
6
taijing33|  楼主 | 2016-5-27 21:35 | 只看该作者
icefox225 发表于 2016-5-27 19:34
不清标志肯定一直进

这程序是我在别的产品程序爬下来的,原封不动。  倍的产品出货n++++了。他一点问题没有。
现咋ieh原来的区别是 串口用在485上了,原来是ttl。我不明白为什么不行了。

使用特权

评论回复
7
taijing33|  楼主 | 2016-5-27 21:40 | 只看该作者
mmuuss586 发表于 2016-5-27 21:09
是不是中断溢出了

愿闻其详

使用特权

评论回复
8
戈卫东| | 2016-5-27 21:54 | 只看该作者
TXE中断不可以一开始就使能的。
因为它在没有数据的时候就是活动状态。

使用特权

评论回复
9
taijing33|  楼主 | 2016-5-28 08:58 | 只看该作者
戈卫东 发表于 2016-5-27 21:54
TXE中断不可以一开始就使能的。
因为它在没有数据的时候就是活动状态。

我也没有一开始就是能tx中断啊

使用特权

评论回复
10
戈卫东| | 2016-5-28 09:11 | 只看该作者
taijing33 发表于 2016-5-28 08:58
我也没有一开始就是能tx中断啊

邵瑞。。。。没有仔细看。
你用RXNE中断,但ISR里面检查的是IDLE信号,这样是不是可靠。。。。。???

使用特权

评论回复
11
pener| | 2016-5-28 09:15 | 只看该作者
  if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

改成
  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

使用特权

评论回复
12
LguoFu| | 2016-5-28 09:36 | 只看该作者
查下你SET1管脚的电平有不有变化吧,是不是一直处于发送使能了?

使用特权

评论回复
13
taijing33|  楼主 | 2016-5-28 09:36 | 只看该作者
pener 发表于 2016-5-28 09:15
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

改成

改了 还是一样。只要一给单片机发数据。单片机就一直进入串口中断。也不进入if里面。我用的是485通讯。

使用特权

评论回复
14
taijing33|  楼主 | 2016-5-28 09:52 | 只看该作者
LguoFu 发表于 2016-5-28 09:36
查下你SET1管脚的电平有不有变化吧,是不是一直处于发送使能了?

我一上电就设置成低电平。接收模式、。这时候不给单片机发数据。单片机还不进串口中断。
只要是一给单片机发数据。就一直进中断。也不进if里面。一直进中断。。。。。

使用特权

评论回复
15
taijing33|  楼主 | 2016-5-28 09:53 | 只看该作者
戈卫东 发表于 2016-5-28 09:11
邵瑞。。。。没有仔细看。
你用RXNE中断,但ISR里面检查的是IDLE信号,这样是不是可靠。。。。。??? ...

改成
  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)了
还是一样,。

使用特权

评论回复
16
taijing33|  楼主 | 2016-5-28 10:34 | 只看该作者
本帖最后由 taijing33 于 2016-5-28 10:36 编辑

中断里的接收改成

         if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
        //        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                   rdata =  USART_ReceiveData(USART1); //USART_ReceiveData(USART1)

。。。。
竟然突然好用了。
stm32就是让人捉摸不透。用起来很担心。就好像突然打通了 六脉。奶奶的。再这样不敢用stm了。

使用特权

评论回复
17
戈卫东| | 2016-5-28 10:37 | 只看该作者
有个ORE信号,似乎和RXNE有关联,有时候它不能忽略

使用特权

评论回复
18
戈卫东| | 2016-5-28 10:38 | 只看该作者
如果不能正确处理一些必要的信号,用哪家的MCU都会有问题。

使用特权

评论回复
19
taijing33|  楼主 | 2016-5-28 11:10 | 只看该作者
戈卫东 发表于 2016-5-28 10:38
如果不能正确处理一些必要的信号,用哪家的MCU都会有问题。

应该是stm32功能太复杂。对有些模块的操作不熟悉。

不如其他8位单片机就几个寄存器。挨个看看就是了。

使用特权

评论回复
20
mohanwei| | 2016-5-28 12:52 | 只看该作者
taijing33 发表于 2016-5-28 09:36
改了 还是一样。只要一给单片机发数据。单片机就一直进入串口中断。也不进入if里面。我用的是485通讯。 ...

你确定改对了?
代码里也没看到溢出中断的处理……
建议直接看一下库、IAR或Keil里面自带的串口中断例程

使用特权

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

本版积分规则

163

主题

365

帖子

3

粉丝