STM32F407 HAL库串口3通信问题(串口3映射到PC10,PC11)

2019-07-20 05:49发布

STM32F407 HAL库串口3通信问题(串口3映射到PC10,PC11),一直无法通信。使用PB10,PB11串口3可以正常通信。各位老哥看看是哪里有问题,以下是代码。
#ifndef __UART_H
#define __UART_H
#include "sys.h"

extern u8 RS485_2_RX_BUF[64];                         //接收缓冲,最大64个字节
extern u8 RS485_2_RX_CNT;                           //接收到的数据长度
extern UART_HandleTypeDef USART3_RS485Handler;
//模式控制
#define RS485_2_TX_EN                PCout(12)        //485模式控制.0,接收;1,发送.
//如果想串口中断接收,设置EN_USART2_RX为1,否则设置为0
#define EN_USART3_RX         1                        //0,不接收;1,接收.

void RS485_2_Init(u32 bound);
void RS485_2_Send_Data(u8 *buf,u8 len);
void RS485_2_Receive_Data(u8 *buf,u8 *len);       
#endif



#include "uart.h"
#include "delay.h"

UART_HandleTypeDef USART3_RS485Handler; //USART3句柄(用于RS485)


#if EN_USART3_RX                   //如果使能了接收             
//接收缓存区        
u8 RS485_2_RX_BUF[64];          //接收缓冲,最大64个字节.

u8 RS485_2_RX_CNT=0;   //接收到的数据长度

void USART3_IRQHandler(void)
{
  u8 res;          
  if((__HAL_UART_GET_FLAG(&USART3_RS485Handler,UART_FLAG_RXNE)!=RESET))  //接收中断
  {                
    HAL_UART_Receive(&USART3_RS485Handler,&res,1,1000);
    if(RS485_2_RX_CNT<64)
    {
      RS485_2_RX_BUF[RS485_2_RX_CNT]=res;                //记录接收到的值
      RS485_2_RX_CNT++;                              //接收数据增加1
    }
  }
}   
#endif

void RS485_2_Init(u32 bound)
{
    //GPIO端口设置
  GPIO_InitTypeDef GPIO_Initure;

  __HAL_RCC_GPIOC_CLK_ENABLE();                //使能GPIOC时钟
  __HAL_RCC_USART3_CLK_ENABLE();        //使能USART3时钟
  __HAL_RCC_GPIOH_CLK_ENABLE();


  GPIO_Initure.Pin = GPIO_PIN_12;   //初始化PC12
  GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;      //推挽输出
  GPIO_Initure.Pull = GPIO_PULLUP;
  GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOC, &GPIO_Initure);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);

  GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_11;                        //PC10,pc11
  GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
  GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
  GPIO_Initure.Speed=GPIO_SPEED_HIGH;                //高速
  GPIO_Initure.Alternate=GPIO_AF7_USART3;        //复用为USART3
  HAL_GPIO_Init(GPIOC,&GPIO_Initure);                   //初始化PC10


  //USART 初始化设置
  USART3_RS485Handler.Instance=USART3;        //USART3
  USART3_RS485Handler.Init.BaudRate=bound;         //波特率
  USART3_RS485Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
  USART3_RS485Handler.Init.StopBits=UART_STOPBITS_1;            //一个停止位
  USART3_RS485Handler.Init.Parity=UART_PARITY_NONE;                //无奇偶校验位
  USART3_RS485Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
  USART3_RS485Handler.Init.Mode=UART_MODE_TX_RX;        //收发模式
  USART3_RS485Handler.Init.OverSampling = UART_OVERSAMPLING_16;

  HAL_UART_Init(&USART3_RS485Handler);         //HAL_UART_Init()会使能UART3

  __HAL_UART_DISABLE_IT(&USART3_RS485Handler,UART_IT_TC);
// HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
#if EN_USART3_RX
  __HAL_UART_ENABLE_IT(&USART3_RS485Handler,UART_IT_RXNE);//开启接收中断
  HAL_NVIC_EnableIRQ(USART3_IRQn);                //使能USART3中断通道
  HAL_NVIC_SetPriority(USART3_IRQn,3,3);        //抢占优先级3,子优先级3
#endif       
   RS485_2_TX_EN=0;                                //设置为接收模式
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_2_Send_Data(u8 *buf,u8 len)
{
  RS485_2_TX_EN=1;                        //设置为发送模式
  HAL_UART_Transmit(&USART3_RS485Handler,buf,len,1000);//串口3发送数据
  //while(__HAL_UART_GET_FLAG(&USART3_RS485Handler,UART_FLAG_TC)!=SET);//等待发送结束
  RS485_2_RX_CNT=0;          
  RS485_2_TX_EN=0;                                //设置为接收模式       
}


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

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