OpenEdv-开源电子网

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

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

[复制链接]

2

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-8-7
在线时间
74 小时
发表于 2018-9-13 10:23:47 | 显示全部楼层 |阅读模式
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;                //清零
  }
}

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

使用道具 举报

2

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-8-7
在线时间
74 小时
 楼主| 发表于 2018-9-13 13:49:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-8-7
在线时间
74 小时
 楼主| 发表于 2018-9-13 15:10:07 | 显示全部楼层
顶上去
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2016-6-1
在线时间
32 小时
发表于 2018-10-7 11:07:21 | 显示全部楼层
哪个开发板?探索者PC10,PC11还连接着SD卡座,有47K上拉电阻,有可能是它影响
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-1-26
在线时间
58 小时
发表于 2019-12-6 11:52:58 | 显示全部楼层
我的板子也遇到了同样的问题求各位大神指点
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2024-5-23
在线时间
1 小时
发表于 2024-5-23 16:40:08 | 显示全部楼层
能给下用pb10 11的代码吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 09:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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