void RS485_Init(u32 bound) ;
void RS485_Receive_Data(u8 *ReceiveBuf,u8 *len);
void RS485_Send_Data(u8 *SendBuf ,u8 len);
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitType;
USART_InitTypeDef USART_InitType;
NVIC_InitTypeDef NVIC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOA和GPIOD的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能USART2的時鐘
GPIO_InitType.GPIO_Pin=GPIO_Pin_7; //接收或者發送模式控制引腳PD7(初始化之后才能用)
GPIO_InitType.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz; //這個引腳是485芯片中的發送接收控制引腳
GPIO_Init(GPIOD,&GPIO_InitType); //當PDout(7)輸出的是高電平‘1’時是發送,為‘0’時是接收
GPIO_InitType.GPIO_Pin=GPIO_Pin_2; //USART2的TX引腳是PA2
GPIO_InitType.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitType);
GPIO_InitType.GPIO_Pin=GPIO_Pin_3; //USART2的RX引腳是PA3
GPIO_InitType.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitType);
#ifdef EN_RS485_RX
USART_InitType.USART_BaudRate=bound; //串口2的初始化
USART_InitType.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitType.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitType.USART_Parity=USART_Parity_No; //其中重要的是USART_Mode要既能接收又能發送
USART_InitType.USART_StopBits=USART_StopBits_1; //USART2的波特率都設置為9600
USART_InitType.USART_WordLength=USART_WordLength_8b;
USART_Init(USART2,&USART_InitType);
NVIC_InitType.NVIC_IRQChannel=USART2_IRQn; //USART2中斷初始化
NVIC_InitType.NVIC_IRQChannelCmd=ENABLE; //其實這個中斷主要是對發送的數據及時處理,使接收時便捷高效
NVIC_InitType.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitType.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitType);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //要用到USART2中斷除了初始化之外當然要對中斷進行配置以及使能
USART_Cmd(USART2,ENABLE); //明確發生什么時會進入串口中斷
#endif
RX485_TX_EN=0; //默認接收模式
}
這里的串口中斷函數,發送的數據被接收數據寄存器接收到,就會觸發中斷,進行處理
#ifdef EN_RS485_RX
u8 RS485_RX_BUF[64];
u8 RS485_RX_CNT=0;
void USART2_IRQHandler(void) //發送完數據就使能接收中斷,使串口可以接收數據到緩沖區(數組RS485_RX_BUF)中
{
u8 Res;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
{
Res=USART_ReceiveData(USART2);
if(RS485_RX_CNT<64) //一次接收的數據最多為64,超過之后將不會對發送過來的數據進行緩存
{
RS485_RX_BUF[RS485_RX_CNT]=Res;
RS485_RX_CNT++;
}
}
}
#endif
void RS485_Send_Data(u8 *SendBuf ,u8 len) //發送處理函數
{
u8 i;
RX485_TX_EN=1;
for(i=0;i<len;i++) //把長度為len的數組SendBuf發送出去
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待發送移位數據寄存器的數據非空時(即發送結束)跳出來
USART_SendData(USART2,SendBuf[i]); //發送數據
}
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
RX485_TX_EN=0; //默認接收模式
RS485_RX_CNT=0;
}
void RS485_Receive_Data(u8 *ReceiveBuf,u8 *len) //接收處理函數
{
u8 rxlen,i=0;
rxlen=RS485_RX_CNT;
delay_ms(10);
if((rxlen==RS485_RX_CNT)&&rxlen) //把中斷函數處理之后的緩存數據取出來
{
for(i=0;i<rxlen;i++)
{
ReceiveBuf[i]=RS485_RX_BUF[i]; //傳遞接收到的數據以及長度回去
}
*len=RS485_RX_CNT;
RS485_RX_CNT=0; //對接收的個數進行清零,方便下次接收
}
}
|