//*******************************************************************
//作用:RS485初始化
//参数:BPS-波特率
// StopBit-停止位,1为1位,2为2位
// Parity-校验方式,0为无校验,1为寄校验,2为偶校验
//返回:无
//*******************************************************************
void RS485Init(Uint32 BPS, Uint8 StopBit, Uint8 Parity)
{
GPIO_InitTypeDef GPIOInit;
USART_InitTypeDef USARTInit;
NVIC_InitTypeDef NVICInit;
//初始化485使能脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIOInit.GPIO_Pin = GPIO_Pin_15;
GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIOInit.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIOInit);
//初始化USART1中断优先级
NVICInit.NVIC_IRQChannel = USART1_IRQn;
NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
NVICInit.NVIC_IRQChannelSubPriority = 1;
NVICInit.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVICInit);
//初始化USART1管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIOInit.GPIO_Pin = GPIO_Pin_9;
GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIOInit.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIOInit);
GPIOInit.GPIO_Pin = GPIO_Pin_10;
GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
// GPIOInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIOInit.GPIO_Mode = GPIO_Mode_IPU;//此处设为上拉输入
GPIO_Init(GPIOA, &GPIOInit);
//初始化USART1参数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USARTInit.USART_BaudRate = BPS ;
if(StopBit == 1)
{
USARTInit.USART_StopBits = USART_StopBits_1;
}
else
{
USARTInit.USART_StopBits = USART_StopBits_2;
}
if(Parity == 0)
{
USARTInit.USART_WordLength = USART_WordLength_8b;
USARTInit.USART_Parity = USART_Parity_No;
}
else if(Parity == 1)
{
USARTInit.USART_WordLength = USART_WordLength_9b;
USARTInit.USART_Parity = USART_Parity_Odd;
}
else
{
USARTInit.USART_WordLength = USART_WordLength_9b;
USARTInit.USART_Parity = USART_Parity_Even;
}
USARTInit.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USARTInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USARTInit);
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
RS485RXEn(); //接收使能,根据485芯片设置:高电平则发送使能,低电平则接收使能
}