论坛元老
 
- 积分
- 3772
- 金钱
- 3772
- 注册时间
- 2015-4-26
- 在线时间
- 765 小时
|
[mw_shl_code=applescript,true]void usart2_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn; //中断初始化
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //引脚初始化
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//485控制 TX 复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;// RX 浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;// 485控制引脚
GPIO_Init(GPIOA,&GPIO_InitStructure);
RS485_RX;//485接收
USART_DeInit(USART2); //复位串口2
USART_InitStructure.USART_BaudRate=9600; //串口初始化
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART2,&USART_InitStructure);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2,ENABLE);
}
void USART2_IRQHandler(void)
{
// u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) //接收中断
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
rx_dat[rx_num]=USART_ReceiveData(USART2);
rx_num++;
if(rx_num==1)
if(rx_dat[rx_num-1]!=0x00&&rx_dat[rx_num-1]!=MODBUS_ADD)
rx_num=0;
if(rx_num>=2)
{
if(rx_dat[1]==0x03||rx_dat[1]==0x04||rx_dat[1]==0x05||rx_dat[1]==0x06)
{
switch(rx_num)
{
case 7:
if(rx_dat[6]!=(u8)(GetCheckCode(rx_dat,6)>>8))
{
rx_num=0;
}
break;
case 8:
if(rx_dat[7]!=(u8)GetCheckCode(rx_dat,6))
{
rx_num=0;
}
else
{
flag_usart2=1;
rx_num=0;
}
break;
default:
break;
}
}
else if(rx_dat[1]==0x0f||rx_dat[1]==0x10) //15 16命令接收
{
if(rx_num>7)//已接收到字节个数信息
{
if(rx_num==(rx_dat[6]+9))//接收完毕
{
if(rx_dat[rx_num-2]!=(u8)(GetCheckCode(rx_dat,rx_num-2)>>8))
rx_num=0;
else if(rx_dat[rx_num-1]!=(u8)GetCheckCode(rx_dat,rx_num-2))
rx_num=0;
else
{
flag_usart2=1;
rx_num=0;
}
}
}
}
else
rx_num=0;
}
}
if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET) //发送数据寄存器空中断
{
tx_num++;
if(tx_num<tx_nums)
{
USART_SendData(USART2,tx_dat[tx_num]);
}
else
{
// while(USART2->SR&(1<<6));
tx_num=0; flag_systick_tx=1;
USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
USART_ITConfig(USART2,USART_IT_TC,ENABLE);
}
// USART_ClearITPendingBit(USART2,USART_IT_TXE);
}
if(USART_GetITStatus(USART2,USART_IT_TC)!=RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_TC);
USART_ITConfig(USART2,USART_IT_TC,DISABLE);
RS485_RX;
}
}[/mw_shl_code]
|
|