打印
[STM32F1]

使用STM32 485中断接收时不能进入中断

[复制链接]
3059|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GEA|  楼主 | 2018-8-28 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//初始化配置
void RS485_Init(void)  
{   

              USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
              NVIC_InitTypeDef NVIC_InitStructure;   

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//ʹÄÜGPIOA/USARTʱÖÓ
                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//¹¦Äܸ´ÓÃIOʱÖÓʹÄÜ
        USART_Cmd(USART1, ENABLE);//ʹÄÜUSART

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;           //RX½ÓÊÕÒý½Å
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //¸¡¿ÕÊäÈë
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //ÅäÖÃ IO

                    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;           //TX·¢ËÍÒý½Å
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸´ÓÃÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        //Êä³öËÙ¶È
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //ÅäÖÃ IO



                    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;             //485¿ØÖÆÒý½Å
              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //ÍÆÍìÊä³ö
               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
              GPIO_Init(GPIOA, &GPIO_InitStructure);
                                GPIO_ResetBits(GPIOA, GPIO_Pin_8);//ĬÈϽÓÊÕģʽ
                               


        USART_ClearFlag(USART1,USART_FLAG_TC);//Çå³ý´®¿Ú´¦Àí±ê־λ
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE);//Çå³ý´®¿ÚÖжϱê־λ
        USART_StructInit(&USART_InitStructure);
                    USART_Init(USART1,&USART_InitStructure);
               USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //ÖжÏʹÄÜ


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


          
}  
//中断接收
void USART1_IRQHandler(void)     
{
        u8 RX_dat;
  
  if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)//USART_IT_RXNE:????
  {
    RX_dat=USART_ReceiveData(USART1);   
    GPIO_SetBits(GPIOA,GPIO_Pin_8);
    delay_ms(1);
    USART_SendData(USART1,RX_dat);   
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){} //???????????
    delay_ms(2);
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  }   

如题 我之前用串口助手测试232通信 这个测试程序通过了  但换成485通信时(相同串口,只是多了一个控制引脚),程序就实现不了了,感觉是没进入中断,求大神帮忙
沙发
jekey| | 2018-8-28 11:00 | 只看该作者
多看看例程吧,不要在中断里面等待和延时。
在接收数据超时或按协议接收完成后,再发送数据。

使用特权

评论回复
板凳
磨砂| | 2018-8-28 11:16 | 只看该作者
亲 程序流程有问题

使用特权

评论回复
地板
晓伍| | 2018-8-28 11:22 | 只看该作者
哪有在中断里使用while的啊

使用特权

评论回复
5
GEA|  楼主 | 2018-8-28 13:34 | 只看该作者
jekey 发表于 2018-8-28 11:00
多看看例程吧,不要在中断里面等待和延时。
在接收数据超时或按协议接收完成后,再发送数据。 ...

这是我在网上找的 因为我之前的那个不行
我原来的中断是void USART1_IRQHandler(void)     
{

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
  
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART1_Buffer[uart_p]=USART_ReceiveData(USART1);
        uart_p++;
  }       

}
接收完后再发送的数据

使用特权

评论回复
6
GEA|  楼主 | 2018-8-28 13:35 | 只看该作者
晓伍 发表于 2018-8-28 11:22
哪有在中断里使用while的啊

这是我在网上找的 因为我之前的那个不行
我原来的中断是void USART1_IRQHandler(void)     
{

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
  
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART1_Buffer[uart_p]=USART_ReceiveData(USART1);
        uart_p++;
  }        

}
接收完后再发送的数据

使用特权

评论回复
7
Ketose| | 2018-8-28 20:41 | 只看该作者
你是直接把232当485来使用,不用加485的芯片吗?

使用特权

评论回复
8
zhjgmn| | 2018-10-20 12:00 | 只看该作者
是不是有多个中断,看中断组的配置是否合理.之前遇到的问题好像是中断配置的有问题,还有就是串口中断函数里放了串口打印函数

使用特权

评论回复
9
caijie001| | 2018-10-20 12:18 | 只看该作者
中断不要延时啊,,,,,

使用特权

评论回复
10
煌ggg| | 2022-6-23 15:53 | 只看该作者
您好求问,遇到了一样的问题,加了一个引脚,用485,无法进入中断了

使用特权

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

本版积分规则

GEA

1

主题

19

帖子

0

粉丝