初级会员

- 积分
- 119
- 金钱
- 119
- 注册时间
- 2021-9-8
- 在线时间
- 57 小时
|

楼主 |
发表于 2021-12-16 17:04:00
|
显示全部楼层
void CRS485::Initialize(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);//U0_TX
gpio_init(GPIOA ,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ, GPIO_PIN_10);//U0_RX
usart_deinit(USART0);
usart_parity_config(USART0, USART_PM_NONE);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_baudrate_set(USART0, 200000);
usart_hardware_flow_rts_config(USART0,USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0,USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
/* USART0 enable */
nvic_irq_enable(USART0_IRQn, 3, 0);
usart_enable(USART0); //使能UART0中断
usart_interrupt_enable(USART0,USART_INT_FLAG_RBNE);
}
//////////////////////////////////////////////////////////////
//RS485接收中断函数
//////////////////////////////////////////////////////////////
void CRS485::Receive_Interrupt(void)
{
BYTE status,data;
status = UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0)
{
if (m_RX_ProtocolReady == FALSE)
{
if (m_lasttick+1<CTimer::GetSysTick())
{
m_RX_Status = RX_STATUS_LEAD1;
}
m_lasttick = CTimer::GetSysTick();
if (m_RX_Status == RX_STATUS_LEAD1)
{
if (data == LEAD1)
m_RX_Status = RX_STATUS_LEAD2;
}
else
if (m_RX_Status == RX_STATUS_LEAD2)
{
if (data == LEAD2)
m_RX_Status = RX_STATUS_LEN;
else
{
if (data != LEAD1)
m_RX_Status = RX_STATUS_LEAD1;
}
}
else
if (m_RX_Status == RX_STATUS_LEN)
{
if ((data==0)||(data>RX_BUFFER_SIZE))
{
m_RX_Status = RX_STATUS_LEAD1;
}
else
{
m_checksum = 0;
m_have_Esc = FALSE;
m_RX_Counter = 0;
m_RX_Length = data;
m_RX_Status = RX_STATUS_DATA;
}
}
else
if (m_RX_Status == RX_STATUS_DATA)
{
if (m_have_Esc)
{
m_have_Esc = FALSE;
}
else
{
if (data == ESC)
{
m_have_Esc = TRUE;
return;
}
}
m_checksum ^= data;
m_RxBuf[m_RX_Counter++] = data;
if (m_RX_Length == m_RX_Counter)
{
m_RX_Status = RX_STATUS_LEAD1;
if (m_checksum == 0)
{
m_RX_ProtocolReady = TRUE;
}
}
}
else
{
m_RX_Status = RX_STATUS_LEAD1;
}
}
}
}
void CRS485::TransmitByte_ESC(uint8 data)
{
if ((data==ESC)||(data==LEAD2))
{
usart_data_transmit(USART0, ESC);
while(RESET != usart_flag_get(USART0, USART_FLAG_TBE));
}
usart_data_transmit(USART0, data);
while(RESET != usart_flag_get(USART0, USART_FLAG_TBE));
}
void CRS485::TransmitByte(uint8 data)
{
usart_data_transmit(USART0, data);
while(RESET != usart_flag_get(USART0, USART_FLAG_TBE));
}
extern "C"{
void USART0_IRQHandler(void)
{
if(usart_interrupt_flag_get( USART0, USART_INT_FLAG_RBNE)!= RESET)//接收
{
CRS485::Receive_Interrupt();
}
}
} |
|