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=RS485_2_RX_BUF;
}
*len=RS485_2_RX_CNT; //记录本次数据长度
RS485_2_RX_CNT=0; //清零
}
} |