OpenEdv-开源电子网

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

STM32 RS485串口3(USART3)能发送不能接收

[复制链接]

9

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2018-6-20
在线时间
82 小时
发表于 2021-6-15 16:46:53 | 显示全部楼层 |阅读模式
如题问题,两块板子一个发(战舰开发板)一个收(自己做的板子硬件没问题),开发板能收到我发出的数据,但是我自己收不到开发板发过来的命令,连中断都进不去(打断点无反应)
两个程序都是一样的内容,从官方库改的RS485例程,仅仅将官方的USART2改成了USART3,然后现在能发送出去数据,但是接收不到数据,这是为什么??
#include "sys.h"                    
#include "rs485.h"         
#include "delay.h"


#ifdef EN_USART3_RX           //如果使能了接收


//接收缓存区        
extern u8 RS485_RX_BUF[64];          //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;                     

void USART3_IRQHandler(void)
{
        u8 res;            

        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
        {         
                                  
                res =USART_ReceiveData(USART3);         //读取接收到的数据
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
                        RS485_RX_CNT++;                                                //接收数据增加1
                }
        }
       
//USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);       
}  
#endif                                                                                 
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率          
void RS485_Init(u32 bound)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOA,D时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
       

        GPIO_InitStructure.GPIO_Pin          = GPIO_Pin_0;                                 //方向切换
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;                                 // USART3_TX
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_11;// PB11 USART3_RX
  GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IPU; //上拉输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);  

        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口2
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位


#ifdef EN_USART3_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(USART3, &USART_InitStructure); ; //初始化串口

        NVIC_InitStructure.NVIC_IRQChannel                                                                                 = USART3_IRQn; //使能串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority         = 3; //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                                 = 2; //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                                 = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断

  USART_Cmd(USART3, ENABLE);                    //使能串口

#endif

  RS485_TX_EN=0;                        //默认为接收模式

}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //设置为发送模式
          for(t=0;t<len;t++)                //循环发送数据
        {                  
                while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);          
                USART_SendData(USART3,buf[t]);
        }         

        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);               
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                //设置为接收模式       
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf[i]=RS485_RX_BUF[i];       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                RS485_RX_CNT=0;                //清零
        }
}


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

使用道具 举报

9

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2018-6-20
在线时间
82 小时
 楼主| 发表于 2021-6-17 00:54:58 | 显示全部楼层
问题已解决,板子32有问题,接收引脚不正常,换芯片后就正常了
回复 支持 反对

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-6-17 09:28:15 | 显示全部楼层
#ifdef EN_USART3_RX                          //如果使能了接收

有没有定义这个EN_USART3_RX?
回复 支持 反对

使用道具 举报

9

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2018-6-20
在线时间
82 小时
 楼主| 发表于 2021-6-28 20:43:56 | 显示全部楼层
c2007s 发表于 2021-6-17 09:28
#ifdef EN_USART3_RX                          //如果使能了接收

有没有定义这个EN_USART3_RX?


问题已解决,板子32有问题,接收引脚不正常,换芯片后就正常了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 05:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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