野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9981|回复: 4

使用USART2进行485通讯失败问题

[复制链接]
发表于 2018-12-9 20:27:43 | 显示全部楼层 |阅读模式
本帖最后由 PeguinWang 于 2018-12-9 20:32 编辑

最近项目要用到RS485通讯,我用的是挑战者F429配一个USB转485转接头。但是这个程序一直无法正常工作,向PC发送数据转接头的数据指示灯不亮,串口调试助手没收到任何东西;PC向板子发送数据能进接收中断,接受引脚上用示波器也测到了正确波形,但是收到的数据全是0,而且DEBUG的时候发现一接收数据LBD位就会被置位,同时溢出错误ORE位和帧错误FE位也被置位,请问有没有人知道这是怎么回事?

附上关键源代码:
USART配置,PC用485向板子发送数据,USART1向PC回传接受到的数据:
void GPIO_Config(void)
{
GPIO_InitTypeDef LEDG_GPIO;
GPIO_InitTypeDef USART1_GPIOInit;
GPIO_InitTypeDef USART2_GPIOInit;

/*LED测试引脚配置*/
LEDG_GPIO.GPIO_Mode = GPIO_Mode_OUT;
LEDG_GPIO.GPIO_OType = GPIO_OType_PP;
LEDG_GPIO.GPIO_PuPd = GPIO_PuPd_UP;
LEDG_GPIO.GPIO_Speed = GPIO_High_Speed;
LEDG_GPIO.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;

GPIO_Init(GPIOH,&LEDG_GPIO);

/*USART2 RS485配置*/
USART2_GPIOInit.GPIO_Mode = GPIO_Mode_AF;
USART2_GPIOInit.GPIO_OType = GPIO_OType_PP;
USART2_GPIOInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
USART2_GPIOInit.GPIO_Speed = GPIO_High_Speed;

USART2_GPIOInit.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOD,&USART2_GPIOInit);

USART2_GPIOInit.GPIO_Mode = GPIO_Mode_AF;
USART2_GPIOInit.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOD,&USART2_GPIOInit);

GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);

USART2_GPIOInit.GPIO_Mode = GPIO_Mode_OUT;
USART2_GPIOInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
USART2_GPIOInit.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOD,&USART2_GPIOInit);

/*USART1配置*/

USART1_GPIOInit.GPIO_Mode = GPIO_Mode_AF;
USART1_GPIOInit.GPIO_OType = GPIO_OType_PP;
USART1_GPIOInit.GPIO_PuPd = GPIO_PuPd_UP;
USART1_GPIOInit.GPIO_Speed = GPIO_Medium_Speed;

USART1_GPIOInit.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOA,&USART1_GPIOInit);

USART1_GPIOInit.GPIO_Mode = GPIO_Mode_AF;
USART1_GPIOInit.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&USART1_GPIOInit);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
}


void USART_Config(void)
{
USART_InitTypeDef RS485_Init;
USART_InitTypeDef USART1_Init;

RS485_Init.USART_BaudRate = 115200;
RS485_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
RS485_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
RS485_Init.USART_Parity = USART_Parity_No;
RS485_Init.USART_StopBits = USART_StopBits_1;
RS485_Init.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2,&RS485_Init);

USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2, ENABLE);
USART_ClearFlag(USART2,USART_FLAG_TC);

GPIO_ResetBits(GPIOD,GPIO_Pin_11);

USART1_Init.USART_BaudRate = 115200;
USART1_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART1_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART1_Init.USART_Parity = USART_Parity_No;
USART1_Init.USART_StopBits = USART_StopBits_1;
USART1_Init.USART_WordLength = USART_WordLength_8b;

USART_Init(USART1,&USART1_Init);
USART_Cmd(USART1, ENABLE);
}

/*****************发送一个字符**********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
delay_ms(10);
GPIO_SetBits(GPIOD,GPIO_Pin_11);
delay_ms(10);

USART_SendData(pUSARTx,ch);
  
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET){};

GPIO_ResetBits(GPIOD,GPIO_Pin_11);
delay_ms(10);
}


#include "main.h"
void RCC_Config(void);
uint8_t i = 0;

int main(void)
{
RCC_Config();

NVIC_Config();

GPIO_Config();

USART_Config();

delay_init(180);

LEDR_OFF();

LEDG_OFF();
  while(1);
}
void RCC_Config(void)
{
  ErrorStatus HSEStartUpStatus;
RCC_DeInit();                             

RCC_HSEConfig(RCC_HSE_ON);                     
HSEStartUpStatus = RCC_WaitForHSEStartUp();   

if (HSEStartUpStatus == SUCCESS)           
  {
   RCC_PLLCmd(DISABLE);
   RCC_PLLConfig(RCC_PLLSource_HSE,25,360,2,7);           
   RCC_PLLCmd(ENABLE);                                    
   while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);           
   while (RCC_GetSYSCLKSource() != 0x08);                 
   
   RCC_HCLKConfig(RCC_SYSCLK_Div1);           
   RCC_PCLK1Config(RCC_HCLK_Div1);           
   RCC_PCLK2Config(RCC_HCLK_Div2);           
  }
else
{while (1);}                              

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}
uint8_t ucTemp = 1;
void RS485_IRQHandler(void)
{
ucTemp = USART_ReceiveData(USART2);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
LEDR_Toggle();

USART_SendData(USART1,ucTemp);

if (USART_GetFlagStatus(USART2,USART_FLAG_ORE) != RESET)
{
  uint8_t ERR_CLEAR = ERR_CLEAR;
   ERR_CLEAR = USART2->SR;
   ERR_CLEAR = USART2->DR;                             
}
}

回复

使用道具 举报

发表于 2018-12-10 08:56:01 | 显示全部楼层
你的主函数呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-10 14:38:40 | 显示全部楼层

最下面就是主函数main()啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-10 21:19:33 | 显示全部楼层
找到问题了,问题在于USART2挂在APB1时钟总线上,APB1时钟最高只能有45MHZ,我自己写的时钟配置函数把它配置成180MHZ了,结果整个就乱套了,出现各种奇怪的问题。把时钟配置改回来工作就正常了。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-11 08:43:11 | 显示全部楼层
好的
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-27 17:13 , Processed in 0.030640 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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