一直在用STM32F103做项目,记录一下,如果觉得有用的,也可以参考一下。
步骤
- IO口的初始化;
- 串口初始化;
- 中断向量初始化。
- 中断函数的处理事件
rs485.c
`
void RS485_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(USART_RCC | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = USART2_OUTIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(USART2_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART2_INIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init(USART2_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART2_REIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(USART2_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART3_OUTIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(USART3_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART3_INIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init(USART3_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART3_REIO ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(USART3_PORT,&GPIO_InitStructure);
RS485_2RE(1);
RS485_3RE(0);
}
void USART_485_Init(void)
{
USART_InitTypeDef USART_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB1Periph_USART2,ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
USART_Init(USART2,&USART_InitStruct);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
USART_Init(USART3,&USART_InitStruct);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2,ENABLE);
USART_Cmd(USART3,ENABLE);
}
rs485.h
#define RS485_2RE(x) x?(GPIOA->ODR |= (1<<4),USART2->CR1 &=~ (3<<2),USART2->CR1 |= (2<<2)):(GPIOA->ODR &=~ (1<<4),USART2->CR1 &=~ (3<<2),USART2->CR1 |= (1<<2))
#define RS485_3RE(x) x?(GPIOB->ODR |= (1<<12),USART3->CR1 &=~ (3<<2),USART3->CR1 |= (2<<2)):(GPIOB->ODR &=~ (1<<12),USART3->CR1 &=~ (3<<2),USART3->CR1 |= (1<<2))
#define USART_RCC RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA
#define USART2_OUTIO GPIO_Pin_2
#define USART2_INIO GPIO_Pin_3
#define USART2_REIO GPIO_Pin_4
#define USART2_PORT GPIOA
#define USART3_OUTIO GPIO_Pin_10
#define USART3_INIO GPIO_Pin_11
#define USART3_REIO GPIO_Pin_12
#define USART3_PORT GPIOB
#ifndef YES
#define YES 1
#endif
#ifndef NO
#define NO 0
#endif
中断处理函数:
void USART2_IRQHandler(void)
{
Usart2_Send = NO;
if(USART_GetITStatus(USART2,USART_IT_RXNE))
{
DRData.usart2_DRdata = USART2->DR;
}
Usart2_Send = YES;
}
void USART3_IRQHandler(void)
{
Usart3_Send = NO;
if(USART_GetITStatus(USART3,USART_IT_RXNE))
{
DRData.usart3_DRdata = USART3->DR;
}
Usart3_Send = YES;
}
发送的时候使用这个函数就好
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
第一次写,哪里写错了或者不对的地方,请多多指教!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)