RS485 使用 USART1 始终无法成功

2019-07-21 02:48发布

手上的板子将485接在了USART1上。我尝试修改代码但是始终无法正确通信。debug都进不了USART1_IRQHandler方法。在站里也搜索了好久始终没能解决问题。求大佬解救。

具体情况:
STM32F103VBT6
485芯片SP3082EE,管脚RX接PA10,TX接PA9,中间两个接PA8。

下面是485init 方法[mw_shl_code=c,true]void RS485_Init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                 //PD8端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //PA9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位

       
#ifdef EN_USART1_RX                          //如果使能了接收
        USART_InitStructure.USART_BaudRate = bound;//波特率设置
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
        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); ; //初始化串口
  
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
   
  USART_Cmd(USART1, ENABLE);                    //使能串口

#endif

  RS485_TX_EN=0;                        //默认为接收模式
}
[/mw_shl_code]


USART1_IRQHandler 方法写在同一文件中
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
        u8 res;            

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
        {         
                                  
                res =USART_ReceiveData(USART1);         //读取接收到的数据
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
                        RS485_RX_CNT++;                                                //接收数据增加1
                }
        }                                                                                           
} [/mw_shl_code]

NVIC_PriorityGroupConfig 写在main方法中
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


目前情况:
代码从485的例子来的,在开发板上可以跑通,换了芯片信息后重新编译的。修改了485中的代码。
由于例子代码中usart.x中使用了USART1,所以我先把usart.x给删了,然后发现程序都没办法debug,具体表现是debug后无法进入main方法,查询后发现好像和其中的printf,半主机模式相关。
然后就把usart.x部分的代码保留,将原来使用到USART1的部分都替换成了USART2。可以正常debug了,但是USART1_IRQHandler都不会走。

使用usart1做485通信的时候需要注意哪些东西?usart1用于485通信了,那原来usart.x中的相关代码怎么修改?

自学STM32一段时间了,好不容易将实例搞完,可以用开发板做出自己想要的效果了,想着换个板子试试。没想到问题好多,自学这玩意真的难。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。