新增:首次提交

首次提交,上传Launcher工程
This commit is contained in:
caocong
2026-01-05 09:40:42 +08:00
commit 094fd76a72
70 changed files with 20365 additions and 0 deletions

732
MCU_Driver/uart.c Normal file
View File

@@ -0,0 +1,732 @@
/*
* uart.c
*
* Created on: May 14, 2025
* Author: cc
*
* Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485<38><35>
*
* Uart1 -> <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
* Uart0 -> U1 -> RS485 1
* UART2 -> U2 -> RS485 2
* Uart3 -> U3 -> BUS
*
*/
#include "includes.h"
#include <string.h>
UART_t g_uart[UART_MAX];
void UART0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void UART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void UART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void UART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
/*********************************************************************
* @fn UARTx_Init
* @brief UART<52><54>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><E2B4AE>2ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PB22,PB23 - Boot,RST<53><54><EFBFBD><EFBFBD>
* @param uart_id - <20><><EFBFBD><EFBFBD>ID
* @param buad - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param prt_cf - <20><><EFBFBD>ڽ<EFBFBD><DABD>ջص<D5BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @return none
*/
void UARTx_Init(UART_IDX uart_id, uint32_t buad) {
switch (uart_id) {
case UART_0:
//RS485ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
GPIOD_ModeCfg(GPIO_Pin_21, GPIO_ModeOut_PP);
MCU485_EN1_L;
UART0_Reset();
GPIO_PinRemapConfig(GPIO_NoRemap_UART0,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_Floating);
UART0_BaudRateCfg(buad);
R8_UART0_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART0_LCR = RB_LCR_WORD_SZ;
R8_UART0_IER = RB_IER_TXD_EN;
UART0_CLR_RXFIFO();
UART0_CLR_TXFIFO();
UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART0_IRQn);
memset(&g_uart[UART_0],0,sizeof(UART_t));
Set_Uart_recvTimeout(&g_uart[UART_0],buad);
g_uart[UART_0].send_data_cf = UART0_SendString;
g_uart[UART_0].set_baud_cf = UART0_ChangeBaud;
break;
case UART_1:
UART1_Reset();
GPIO_PinRemapConfig(GPIO_NoRemap_UART1,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_Floating);
UART1_BaudRateCfg(buad);
R8_UART1_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART1_LCR = RB_LCR_WORD_SZ;
R8_UART1_IER = RB_IER_TXD_EN;
UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART1_IRQn);
memset(&g_uart[UART_1],0,sizeof(UART_t));
Set_Uart_recvTimeout(&g_uart[UART_1],buad);
g_uart[UART_1].send_data_cf = UART1_SendString;
g_uart[UART_1].set_baud_cf = UART1_ChangeBaud;
break;
case UART_2:
//RS485ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP);
MCU485_EN2_L;
UART2_Reset();
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART2,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
UART2_BaudRateCfg(buad);
R8_UART2_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART2_LCR = RB_LCR_WORD_SZ;
R8_UART2_IER = RB_IER_TXD_EN;
UART2_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART2_IRQn);
memset(&g_uart[UART_2],0,sizeof(UART_t));
Set_Uart_recvTimeout(&g_uart[UART_2],buad);
g_uart[UART_2].send_data_cf = UART2_SendString;
g_uart[UART_2].set_baud_cf = UART2_ChangeBaud;
break;
case UART_3:
UART3_Reset();
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART3,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_Floating);
UART3_BaudRateCfg(buad);
R8_UART3_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART3_LCR = RB_LCR_WORD_SZ;
R8_UART3_IER = RB_IER_TXD_EN;
UART3_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART3_IRQn);
memset(&g_uart[UART_3],0,sizeof(UART_t));
Set_Uart_recvTimeout(&g_uart[UART_3],buad);
g_uart[UART_3].send_data_cf = UART3_SendString;
g_uart[UART_3].set_baud_cf = UART3_ChangeBaud;
break;
}
}
void Set_Uart_recvTimeout(UART_t *set_uart,uint32_t baud)
{
if(baud == 115200)
{
set_uart->RecvTimeout = Recv_115200_TimeOut;
}else if(baud == 9600)
{
set_uart->RecvTimeout = Recv_9600_TimeOut;
}else if(baud == 2400)
{
set_uart->RecvTimeout = Recv_2400_TimeOut;
}else if(baud == 512000)
{
set_uart->RecvTimeout = Recv_512000_TimeOut;
}else
{
set_uart->RecvTimeout = 20;
}
}
/*********************************************************************
* @fn USART1_IRQHandler
*
* @brief USART1<54>жϺ<D0B6><CFBA><EFBFBD>
*
* @return none
*/
void UART0_IRQHandler(void)
{
switch( UART0_GetITFlag() )
{
case UART_II_THR_EMPTY:
break;
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT:
if( (g_uart[UART_0].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_0].RecvLen = 0x00;
g_uart[UART_0].RecvBuffer[g_uart[UART_0].RecvLen] = UART0_RecvByte();
g_uart[UART_0].RecvLen += 1;
g_uart[UART_0].Receiving = 0x01;
g_uart[UART_0].RecvIdleTiming = SysTick_1ms;
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڷ<EFBFBD>æ״̬
g_uart[UART_0].CommBusy |= UART_COMMBUSY_RECV_Flag;
break;
}
}
/*********************************************************************
* @fn USART1_IRQHandler
*
* @brief USART1<54>жϺ<D0B6><CFBA><EFBFBD>
*
* @return none
*/
void UART1_IRQHandler(void)
{
switch( UART1_GetITFlag() )
{
case UART_II_THR_EMPTY:
break;
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT:
if( (g_uart[UART_1].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_1].RecvLen = 0x00;
g_uart[UART_1].RecvBuffer[g_uart[UART_1].RecvLen] = UART1_RecvByte();
g_uart[UART_1].RecvLen += 1;
g_uart[UART_1].Receiving = 0x01;
g_uart[UART_1].RecvIdleTiming = SysTick_1ms;
break;
}
}
/*********************************************************************
* @fn UART2_IRQHandler
*
* @brief USART2<54>жϺ<D0B6><CFBA><EFBFBD>
*
* @return none
*/
void UART2_IRQHandler(void)
{
switch( UART2_GetITFlag() )
{
case UART_II_THR_EMPTY:
break;
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT:
if( (g_uart[UART_2].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_2].RecvLen = 0x00;
g_uart[UART_2].RecvBuffer[g_uart[UART_2].RecvLen] = UART2_RecvByte();
g_uart[UART_2].RecvLen += 1;
g_uart[UART_2].Receiving = 0x01;
g_uart[UART_2].RecvIdleTiming = SysTick_1ms;
break;
}
}
/*********************************************************************
* @fn USART3_IRQHandler
*
* @brief USART3<54>жϺ<D0B6><CFBA><EFBFBD>
*
* @return none
*/
void UART3_IRQHandler(void)
{
switch( UART3_GetITFlag() )
{
case UART_II_THR_EMPTY:
break;
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT:
if( (g_uart[UART_3].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_3].RecvLen = 0x00;
g_uart[UART_3].RecvBuffer[g_uart[UART_3].RecvLen] = UART3_RecvByte();
g_uart[UART_3].RecvLen += 1;
g_uart[UART_3].Receiving = 0x01;
g_uart[UART_3].RecvIdleTiming = SysTick_1ms;
break;
}
}
/*********************************************************************
* @fn USART1_RECEIVE
*
* @brief USART1
*
* @return none
*/
void UART0_RECEIVE(void)
{
if(g_uart[UART_0].Receiving == 0x01)
{
if(SysTick_1ms - g_uart[UART_0].RecvIdleTiming >= g_uart[UART_0].RecvTimeout)
{
g_uart[UART_0].RecvIdleTiming = SysTick_1ms;
DBG_SYS_Printf("--UART0_RECEIVE--\r\n");
Launcher_Uart_Upgrade_Process(&g_uart[UART_0]);
g_uart[UART_0].RecvLen = 0;
g_uart[UART_0].Receiving = 0;
}
}
}
/*********************************************************************
* @fn USART1_RECEIVE
*
* @brief USART1
*
* @return none
*/
void UART1_RECEIVE(void)
{
if(g_uart[UART_1].Receiving == 0x01)
{
if(SysTick_1ms - g_uart[UART_1].RecvIdleTiming >= g_uart[UART_1].RecvTimeout)
{
g_uart[UART_1].RecvIdleTiming = SysTick_1ms;
DBG_SYS_Printf("--UART1_RECEIVE--\r\n");
Launcher_Uart_Upgrade_Process(&g_uart[UART_1]);
g_uart[UART_1].RecvLen = 0;
g_uart[UART_1].Receiving = 0;
}
}
}
/*********************************************************************
* @fn UART2_RECEIVE
*
* @brief USART2
*
* @return none
*/
void UART2_RECEIVE(void)
{
if(g_uart[UART_2].Receiving == 1)
{
if(SysTick_1ms - g_uart[UART_2].RecvIdleTiming > g_uart[UART_2].RecvTimeout)
{
g_uart[UART_2].RecvIdleTiming = SysTick_1ms;
DBG_SYS_Printf("--UART2_RECEIVE--\r\n");
Launcher_Uart_Upgrade_Process(&g_uart[UART_2]);
g_uart[UART_2].RecvLen = 0;
g_uart[UART_2].Receiving = 0;
}
}
}
/*********************************************************************
* @fn USART3_RECEIVE
*
* @brief UART3
*
* @return none
*/
void UART3_RECEIVE(void)
{
if(g_uart[UART_3].Receiving == 1)
{
if(SysTick_1ms - g_uart[UART_3].RecvIdleTiming > g_uart[UART_3].RecvTimeout)
{
g_uart[UART_3].RecvIdleTiming = SysTick_1ms;
DBG_SYS_Printf("--UART3_RECEIVE--\r\n");
Launcher_Uart_Upgrade_Process(&g_uart[UART_3]);
g_uart[UART_3].RecvLen = 0;
g_uart[UART_3].Receiving = 0;
}
}
}
/*********************************************************************
* @fn UART0_ChangeBaud
*
* @brief UART0<54>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
uint8_t UART0_ChangeBaud(uint32_t baudrate)
{
uint16_t delay_num = 0;
while(1)
{
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
{
/*<2A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>*/
__disable_irq();
UART0_Reset();
GPIO_PinRemapConfig(GPIO_NoRemap_UART0,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_Floating);
UART0_BaudRateCfg(baudrate);
R8_UART0_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART0_LCR = RB_LCR_WORD_SZ;
R8_UART0_IER = RB_IER_TXD_EN;
UART0_CLR_RXFIFO();
UART0_CLR_TXFIFO();
UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART0_IRQn);
Set_Uart_recvTimeout(&g_uart[UART_0],baudrate);
__enable_irq();
return 0;
}
Delay_Us(100);
delay_num++;
if(delay_num > 500) break;
}
return 1;
}
/*********************************************************************
* @fn UART1_ChangeBaud
*
* @brief UART1<54>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
uint8_t UART1_ChangeBaud(uint32_t baudrate)
{
uint16_t delay_num = 0;
while(1)
{
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
{
/*<2A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>*/
__disable_irq();
UART1_Reset();
GPIO_PinRemapConfig(GPIO_NoRemap_UART1,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_Floating);
UART1_BaudRateCfg(baudrate);
R8_UART1_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART1_LCR = RB_LCR_WORD_SZ;
R8_UART1_IER = RB_IER_TXD_EN;
UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART1_IRQn);
Set_Uart_recvTimeout(&g_uart[UART_1],baudrate);
__enable_irq();
return 0;
}
Delay_Us(100);
delay_num++;
if(delay_num > 500) break;
}
return 1;
}
/*********************************************************************
* @fn UART2_ChangeBaud
*
* @brief UART2<54>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
uint8_t UART2_ChangeBaud(uint32_t baudrate)
{
uint16_t delay_num = 0;
while(1)
{
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
{
/*<2A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>*/
__disable_irq();
UART2_Reset();
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART2,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
UART2_BaudRateCfg(baudrate);
R8_UART2_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART2_LCR = RB_LCR_WORD_SZ;
R8_UART2_IER = RB_IER_TXD_EN;
UART2_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART2_IRQn);
Set_Uart_recvTimeout(&g_uart[UART_2],baudrate);
__enable_irq();
return 0;
}
Delay_Us(100);
delay_num++;
if(delay_num > 500) break;
}
return 1;
}
/*********************************************************************
* @fn UART3_ChangeBaud
*
* @brief UART3<54>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
uint8_t UART3_ChangeBaud(uint32_t baudrate)
{
uint16_t delay_num = 0;
while(1)
{
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
{
/*<2A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>*/
__disable_irq();
UART3_Reset();
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART3,ENABLE);
GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP);
GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_Floating);
UART3_BaudRateCfg(baudrate);
R8_UART3_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 14 bytes
R8_UART3_LCR = RB_LCR_WORD_SZ;
R8_UART3_IER = RB_IER_TXD_EN;
UART3_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_EnableIRQ(UART3_IRQn);
Set_Uart_recvTimeout(&g_uart[UART_3],baudrate);
__enable_irq();
return 0;
}
Delay_Us(100);
delay_num++;
if(delay_num > 500) break;
}
return 1;
}
/*
* RS485ͨѶ<CDA8><D1B6><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
* 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ󣬵ȴ<F3A3ACB5><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>(<28><><EFBFBD>ݲ<EFBFBD>ͬ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>ȴ<EFBFBD>ʱ<EFBFBD>䲻ͬ),<2C>ȴ<EFBFBD><C8B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
* 2<><32><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݺ󣬵ȴ<F3A3ACB5><C8B4><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬
* 3<><33><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF>пɽ<D0BF><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>߷<EFBFBD>æ<EFBFBD><C3A6><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 4<><34><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ڷ<EFBFBD><DAB7>ͣ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>¼<EFBFBD><C2BC>ǰʱ<C7B0><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ں󣬸<DABA><F3A3ACB8><EFBFBD><EFBFBD>ݱ㲻<DDB1>ڷ<EFBFBD><DAB7><EFBFBD>
* 5<><35><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD>л<EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* - 1<><31><EFBFBD><EFBFBD>æ״̬
* - 2<><32><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
* - 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чʱ<D0A7><CAB1>
*
* */
uint8_t MCU485_SendString_1(uint8_t *buff, uint16_t len)
{
uint32_t delay_num = 0;
MCU485_EN1_H;
UART0_SendString(buff,len);
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 50ms
while(1)
{
if((R8_UART0_LSR & RB_LSR_TX_ALL_EMP)) break;
Delay_Us(1);
delay_num++;
if(delay_num > 50000) break;
}
MCU485_EN1_L;
return 0x00;
}
uint8_t MCU485_SendString_2(uint8_t *buff, uint16_t len)
{
uint32_t delay_num = 0;
MCU485_EN2_H;
UART2_SendString(buff,len);
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 50ms
while(1)
{
if((R8_UART2_LSR & RB_LSR_TX_ALL_EMP)) break;
Delay_Us(1);
delay_num++;
if(delay_num > 50000) break;
}
MCU485_EN2_L;
return 0x00;
}
/*******************************************************************************
* Function Name : Uart0_Add_Data_To_SendBuff
* Description : Uart0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
* Input :
buff<66><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
len<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
sendCount <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
ValidDuration <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чʱ<D0A7><EFBFBD><E4A3AC>λ<EFBFBD><CEBB>ms
sendInterval <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC>λ<EFBFBD><CEBB>ms
*******************************************************************************/
uint8_t Uart0_Add_Data_To_SendBuff(uint8_t *buff,uint16_t len,uint8_t sendCount,uint32_t ValidDuration,uint32_t sendInterval)
{
if( buff == NULL) return 0x01;
if( len > USART_BUFFER_SIZE ) return 0x02;
memset(g_uart[UART_0].SendBuffer,0,USART_BUFFER_SIZE);
memcpy(g_uart[UART_0].SendBuffer,buff,len);
g_uart[UART_0].SendLen = len;
g_uart[UART_0].SendCount = sendCount;
g_uart[UART_0].SendCnt = 0;
g_uart[UART_0].SendValidDuration = ValidDuration;
g_uart[UART_0].SendInterval = sendInterval;
g_uart[UART_0].SendValidTick = SysTick_1ms;
return 0x00;
}
/*******************************************************************************
* Function Name : Uart0_Clear_SendBuff
* Description : Uart0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱȡ<CAB1><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
uint8_t Uart0_Clear_SendBuff(void)
{
memset(g_uart[UART_0].SendBuffer,0,USART_BUFFER_SIZE);
g_uart[UART_0].SendLen = 0x00;
return 0x00;
}
/*******************************************************************************
* Function Name : Uart0_Avoid_Conflict_Send_Task
* Description : Uart0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
uint8_t Uart0_Avoid_Conflict_Send_Task(void)
{
if( (g_uart[UART_0].SendLen == 0x00) || (g_uart[UART_0].SendLen > USART_BUFFER_SIZE) ) return 0x01;
if( g_uart[UART_0].SendCnt >= g_uart[UART_0].SendCount ) {
//<2F><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB5BD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
g_uart[UART_0].SendLen = 0x00;
return 0x02;
}
if( SysTick_1ms - g_uart[UART_0].SendValidTick >= g_uart[UART_0].SendInterval ){
//<2F><><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>Ч<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
g_uart[UART_0].SendLen = 0x00;
return 0x03;
}
if( g_uart[UART_0].CommBusy != UART_COMMBUSY_IDLE_Flag ) return 0x04; //ͨѶ<CDA8><D1B6><EFBFBD>ڷ<EFBFBD>æ״̬
//<2F><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
if( ( g_uart[UART_0].SendCnt == 0x00 ) || ( SysTick_1ms - g_uart[UART_0].SendTick >= g_uart[UART_0].SendInterval ) )
{
__disable_irq(); //<2F>ر<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
g_uart[UART_0].CommBusy |= UART_COMMBUSY_SEND_Flag;
g_uart[UART_0].SendIdleTick = SysTick_1ms;
__enable_irq(); //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
UART0_SendString(g_uart[UART_0].SendBuffer, g_uart[UART_0].SendLen);
g_uart[UART_0].SendTick = SysTick_1ms;
g_uart[UART_0].SendCnt++;
if( g_uart[UART_0].SendCnt >= g_uart[UART_0].SendCount )
{
memset(g_uart[UART_0].SendBuffer,0,USART_BUFFER_SIZE);
g_uart[UART_0].SendLen = 0x00;
return 0x05; //ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
}
}
return 0x00;
}
void Uart0_Task(void)
{
UART0_RECEIVE();
Uart0_Avoid_Conflict_Send_Task();
if( g_uart[UART_0].CommBusy == UART_COMMBUSY_IDLE_Flag )
{
/*<2A><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>״̬ - <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD>*/
if( g_uart[UART_0].ChangeBaudFlag == 0x01 )
{
g_uart[UART_0].set_baud_cf(g_uart[UART_0].CommBaud);
g_uart[UART_0].ChangeBaudFlag = 0x00;
}
}else {
/*<2A><>ǰ<EFBFBD><C7B0><EFBFBD>ڷ<EFBFBD><DAB7>ͷ<EFBFBD>æ״̬<D7B4><CCAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>״̬ - <20>ж<EFBFBD>ʹ<EFBFBD>ó<EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>ʱʱ<CAB1><CAB1>һ<EFBFBD><D2BB>*/
if( ((g_uart[UART_0].CommBusy & UART_COMMBUSY_SEND_Flag) != 0x00 ) && ( SysTick_1ms - g_uart[UART_0].SendIdleTick >= g_uart[UART_0].RecvTimeout ) )
{
g_uart[UART_0].SendIdleTick = SysTick_1ms;
__disable_irq(); //<2F>ر<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
g_uart[UART_0].CommBusy &= ~(UART_COMMBUSY_SEND_Flag);
g_uart[UART_0].SendIdleTick = SysTick_1ms;
__enable_irq(); //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
}
}
}