串口驱动头文件 Bsp_Usart_Driver.h
#define GPIOA_RS485_CS_PIN GPIO_Pin_8
#define GPIOA_RS485_TX_PIN GPIO_Pin_9
#define GPIOA_RS485_RX_PIN GPIO_Pin_10
#define GPIOA_RS485_SPEED GPIO_Speed_50MHz
#define GPIOA_RS485_CS_MODE GPIO_Mode_Out_PP
#define GPIOA_RS485_TX_MODE GPIO_Mode_AF_PP
#define GPIOA_RS485_RX_MODE GPIO_Mode_IN_FLOATING
typedef enum
{
RS485_BAUDRATE_9600 = 9600,
RS485_BAUDRATE_19200 = 19200
}Rs485_BaudRate_TypeDef;
串口驱动源文件 Bsp_Usart_Driver.c
Status_TypeDef Bsp_Usart_Init(Rs485_BaudRate_TypeDef baudRate)
{
GPIO_InitTypeDef Gpio_InitStruct;
USART_InitTypeDef Rs485_InitStruct;
NVIC_InitTypeDef Nvic_InitStruct;
/*Gpio及Usart时钟使能*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
/*Gpio CS,Tx,Rx配置*/
Gpio_InitStruct.GPIO_Pin = GPIOA_RS485_CS_PIN;
Gpio_InitStruct.GPIO_Speed = GPIOA_RS485_SPEED;
Gpio_InitStruct.GPIO_Mode = GPIOA_RS485_CS_MODE;
GPIO_Init(GPIOA, &Gpio_InitStruct); // CS
Gpio_InitStruct.GPIO_Pin = GPIOA_RS485_TX_PIN;
Gpio_InitStruct.GPIO_Mode = GPIOA_RS485_TX_MODE;
Gpio_InitStruct.GPIO_Speed = GPIOA_RS485_SPEED;
GPIO_Init(GPIOA, &Gpio_InitStruct); // Tx
Gpio_InitStruct.GPIO_Pin = GPIOA_RS485_RX_PIN;
Gpio_InitStruct.GPIO_Mode = GPIOA_RS485_RX_MODE;
Gpio_InitStruct.GPIO_Speed = GPIOA_RS485_SPEED;
GPIO_Init(GPIOA, &Gpio_InitStruct); // Rx
USART_DeInit(USART3);
USART_StructInit(&Rs485_InitStruct);
Rs485_InitStruct.USART_BaudRate = baudRate;
Rs485_InitStruct.USART_WordLength = USART_WordLength_8b;
Rs485_InitStruct.USART_StopBits = USART_StopBits_1;
Rs485_InitStruct.USART_Parity = USART_Parity_No;
Rs485_InitStruct.USART_Mode = (USART_Mode_Rx | USART_Mode_Tx);
Rs485_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART3,&Rs485_InitStruct);
/*Rs485中断优先级配置 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
Nvic_InitStruct.NVIC_IRQChannel = USART3_IRQn ;
Nvic_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
Nvic_InitStruct.NVIC_IRQChannelSubPriority = 1;
Nvic_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&Nvic_InitStruct);
USART_ITConfig(USART3,USART_IT_RXNE, ENABLE); //RS485接收中断
USART_Cmd(USART3,ENABLE);
GPIO_ResetBits(GPIOA,GPIOA_RS485_CS_PIN); // 管脚拉低,置为接收状态
return Status_OK;
中断头文件 :stm32f10x.h
void USART3_IRQHandler(void);
中断源文件 stm32f10x.c
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Rs485_1_DealWithRxIRQ();
}
USART_ClearFlag(USART3, USART_FLAG_RXNE);
}
时钟配置:
Status_TypeDef Bsp_Rcc_Init(void)
{
SystemInit();
/*配置AHB:72Mhz,APB1:36Mhz,APB2:72Mhz*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
return Status_OK;
}
|