修改事项: 1、新增TFTP IAP升级功能,只是代码移植完毕,没有测试使用 2、代码空间编译优化,零等待区域空间已满,而应用层代码已全部挪移到非零等待区域中,但还是会增加零等待区的空间占用。 待优化
879 lines
26 KiB
C
879 lines
26 KiB
C
/*
|
||
* uart.c
|
||
*
|
||
* Created on: May 14, 2025
|
||
* Author: cc
|
||
*/
|
||
|
||
#include "uart.h"
|
||
#include "debug.h"
|
||
#include "watchdog.h"
|
||
#include "blv_rs485_protocol.h"
|
||
#include "sram_mem_addr.h"
|
||
#include "spi_sram.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初始化函数,注意串口2通讯引脚是PB22,PB23 - Boot,RST引脚
|
||
* @param uart_id - 串口ID
|
||
* @param buad - 波特率
|
||
* @param prt_cf - 串口接收回调函数
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) void UARTx_Init(UART_IDX uart_id, uint32_t buad) {
|
||
|
||
switch (uart_id) {
|
||
case UART_0:
|
||
/* 配置串口1:配置IO口模式 */
|
||
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;
|
||
|
||
GPIO_PinRemapConfig(GPIO_NoRemap_UART0,ENABLE);
|
||
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP);
|
||
GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_Floating);
|
||
|
||
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);
|
||
|
||
break;
|
||
case UART_1:
|
||
/* 配置串口1:配置IO口模式 */
|
||
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;
|
||
|
||
GPIO_PinRemapConfig(GPIO_NoRemap_UART1,ENABLE);
|
||
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP);
|
||
GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_Floating);
|
||
|
||
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);
|
||
|
||
break;
|
||
case UART_2:
|
||
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;
|
||
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART2,ENABLE);
|
||
GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP);
|
||
GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
|
||
|
||
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);
|
||
|
||
break;
|
||
case UART_3:
|
||
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;
|
||
GPIO_PinRemapConfig(GPIO_PartialRemap1_UART3,ENABLE);
|
||
GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP);
|
||
GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_Floating);
|
||
|
||
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);
|
||
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
__attribute__((section(".non_0_wait"))) 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
|
||
{
|
||
set_uart->RecvTimeout = 20;
|
||
}
|
||
}
|
||
|
||
/*********************************************************************
|
||
* @fn USART1_IRQHandler
|
||
*
|
||
* @brief USART1中断函数
|
||
*
|
||
* @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;
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
/*********************************************************************
|
||
* @fn USART1_IRQHandler
|
||
*
|
||
* @brief USART1中断函数
|
||
*
|
||
* @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中断函数
|
||
*
|
||
* @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中断函数
|
||
*
|
||
* @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
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) 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_Println(DBG_BIT_SYS_STATUS_bit,"UART_0 Len %d ",g_uart[UART_0].RecvLen);
|
||
Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_0 Buff:", g_uart[UART_0].RecvBuffer,g_uart[UART_0].RecvLen);
|
||
|
||
|
||
|
||
g_uart[UART_0].RecvLen = 0;
|
||
g_uart[UART_0].Receiving = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*********************************************************************
|
||
* @fn USART1_RECEIVE
|
||
*
|
||
* @brief USART1
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) 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_Println(DBG_BIT_SYS_STATUS_bit,"UART_1 Len %d ",g_uart[UART_1].RecvLen);
|
||
Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_1 Buff:", g_uart[UART_1].RecvBuffer,g_uart[UART_1].RecvLen);
|
||
|
||
|
||
|
||
g_uart[UART_1].RecvLen = 0;
|
||
g_uart[UART_1].Receiving = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*********************************************************************
|
||
* @fn UART2_RECEIVE
|
||
*
|
||
* @brief USART2
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) 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_Println(DBG_BIT_SYS_STATUS_bit,"UART_2 Len %d ",g_uart[UART_2].RecvLen);
|
||
Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_2 Buff:", g_uart[UART_2].RecvBuffer,g_uart[UART_2].RecvLen);
|
||
|
||
|
||
|
||
g_uart[UART_2].RecvLen = 0;
|
||
g_uart[UART_2].Receiving = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*********************************************************************
|
||
* @fn USART3_RECEIVE
|
||
*
|
||
* @brief UART3
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) 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_Println(DBG_BIT_SYS_STATUS_bit,"UART_3 Len %d ",g_uart[UART_3].RecvLen);
|
||
Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_3 Buff:", g_uart[UART_3].RecvBuffer,g_uart[UART_3].RecvLen);
|
||
|
||
|
||
|
||
g_uart[UART_3].RecvLen = 0;
|
||
g_uart[UART_3].Receiving = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*********************************************************************
|
||
* @fn UART0_ChangeBaud
|
||
*
|
||
* @brief UART0切换波特率
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UART0_ChangeBaud(uint32_t baudrate)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
while(1)
|
||
{
|
||
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
|
||
{
|
||
/*发送为空*/
|
||
__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切换波特率
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UART1_ChangeBaud(uint32_t baudrate)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
while(1)
|
||
{
|
||
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
|
||
{
|
||
/*发送为空*/
|
||
__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切换波特率
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UART2_ChangeBaud(uint32_t baudrate)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
while(1)
|
||
{
|
||
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
|
||
{
|
||
/*发送为空*/
|
||
__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切换波特率
|
||
*
|
||
* @return none
|
||
*/
|
||
__attribute__((section(".non_0_wait"))) uint8_t UART3_ChangeBaud(uint32_t baudrate)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
while(1)
|
||
{
|
||
if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP )
|
||
{
|
||
/*发送为空*/
|
||
__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;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Uart0_Flush
|
||
* Description : 串口0等待发送完成
|
||
* Input : over_time -- 等待超时时间
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Uart0_Flush(uint16_t over_time)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed(); //防止看门狗复位
|
||
if( (R8_UART0_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > over_time) break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Uart1_Flush
|
||
* Description : 串口1等待发送完成
|
||
* Input : over_time -- 等待超时时间
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Uart1_Flush(uint16_t over_time)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed(); //防止看门狗复位
|
||
if( (R8_UART1_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > over_time) break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Uart2_Flush
|
||
* Description : 串口2等待发送完成
|
||
* Input : over_time -- 等待超时时间
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Uart2_Flush(uint16_t over_time)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed(); //防止看门狗复位
|
||
if( (R8_UART2_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > over_time) break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Uart3_Flush
|
||
* Description : 串口3等待发送完成
|
||
* Input : over_time -- 等待超时时间
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Uart3_Flush(uint16_t over_time)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed(); //防止看门狗复位
|
||
if( (R8_UART3_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > over_time) break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Uart_SendString
|
||
* Description : 串口发送函数函数
|
||
* Input :
|
||
* uart_id - 发送的串口号
|
||
* buff - 发送数据
|
||
* len - 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Uart_SendString(uint8_t uart_id,uint8_t* buff,uint16_t len)
|
||
{
|
||
switch(uart_id)
|
||
{
|
||
case UART_0:
|
||
UART0_SendString(buff,len);
|
||
break;
|
||
case UART_1:
|
||
UART1_SendString(buff,len);
|
||
break;
|
||
case UART_2:
|
||
UART2_SendString(buff,len);
|
||
break;
|
||
case UART_3:
|
||
UART3_SendString(buff,len);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : MCU485_SendString_1
|
||
* Description : 485_1 发送函数
|
||
* Input :
|
||
buf - 发送数据
|
||
l - 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void MCU485_SendString_1(uint8_t *buf, uint16_t len)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
MCU485_EN1_H;
|
||
|
||
UART1_SendString(buf,len);
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed();
|
||
if( (R8_UART1_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > 500) break;
|
||
}
|
||
|
||
MCU485_EN1_L;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : MCU485_SendString_2
|
||
* Description : 485_2 发送函数
|
||
* Input :
|
||
buf - 发送数据
|
||
len - 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void MCU485_SendString_2(uint8_t *buf, uint16_t len)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
MCU485_EN2_H;
|
||
|
||
UART2_SendString(buf,len);
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed();
|
||
if( (R8_UART2_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > 500) break;
|
||
}
|
||
|
||
MCU485_EN2_L;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : MCU485_SendString_3
|
||
* Description : 485_3 发送函数
|
||
* Input :
|
||
buf - 发送数据
|
||
len - 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void MCU485_SendString_3(uint8_t *buf, uint16_t len)
|
||
{
|
||
uint16_t delay_num = 0;
|
||
|
||
MCU485_EN3_H;
|
||
|
||
UART3_SendString(buf,len);
|
||
|
||
//等待发送完成 - 50ms
|
||
while(1)
|
||
{
|
||
WDT_Feed();
|
||
if( (R8_UART3_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空
|
||
Delay_Us(100);
|
||
delay_num++;
|
||
if(delay_num > 500) break;
|
||
}
|
||
|
||
MCU485_EN3_L;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : MCU485_SendString
|
||
* Description : 485发送函数函数
|
||
* Input : uart_id - 发送的串口号
|
||
buff - 发送数据
|
||
len -- 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void MCU485_SendString(uint8_t uart_id,uint8_t* buff,uint16_t len)
|
||
{
|
||
switch(uart_id)
|
||
{
|
||
case UART_1:
|
||
if(Poll485_Info.port_mode == Port_Monitoring_mode ) //轮询端口
|
||
{
|
||
//Udp_Internal_SeriaNet_Uploading2(Polling_Port,Poll485_Info.baud,buff,len);
|
||
}
|
||
MCU485_SendString_1(buff,len);
|
||
break;
|
||
case UART_2:
|
||
if(Act485_Info.port_mode == Port_Monitoring_mode ) //轮询端口
|
||
{
|
||
//Udp_Internal_SeriaNet_Uploading2(Active_Port,Act485_Info.baud,buff,len);
|
||
}
|
||
MCU485_SendString_2(buff,len);
|
||
break;
|
||
case UART_3:
|
||
if(BUS485_Info.port_mode == Port_Monitoring_mode ) //轮询端口
|
||
{
|
||
//Udp_Internal_SeriaNet_Uploading2(Bus_port,BUS485_Info.baud,buff,len);
|
||
}
|
||
MCU485_SendString_3(buff,len);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : MCU485_SendString
|
||
* Description : 485发送函数函数
|
||
* Input : uart_id - 发送的串口号
|
||
data_addr - SRAM中发送数据地址
|
||
len -- 发送数据长度
|
||
* Return : None
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void MCU485_SendSRAMData(uint8_t uart_id,uint32_t data_addr,uint16_t len)
|
||
{
|
||
uint16_t buff_len = len;
|
||
uint8_t send_buff[buff_len];
|
||
|
||
memset(send_buff,0,sizeof(send_buff));
|
||
|
||
SRAM_DMA_Read_Buff(send_buff,buff_len,data_addr); //读取数据内容
|
||
|
||
MCU485_SendString(uart_id,send_buff,buff_len);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : Write_Uart_SendBuff
|
||
* Description : 写uart发送缓冲区
|
||
* Input : uart_id - 发送的串口号
|
||
uart_baud - 发送数据
|
||
buff - 发送数据
|
||
len -- 发送数据长度
|
||
*******************************************************************************/
|
||
__attribute__((section(".non_0_wait"))) void Write_Uart_SendBuff(uint8_t uart_id,uint8_t uart_outime,uint8_t* buff,uint16_t len)
|
||
{
|
||
switch(uart_id)
|
||
{
|
||
case Polling_Port: //轮询
|
||
uart_id = UART_0;
|
||
break;
|
||
case Active_Port: //主动
|
||
uart_id = UART_2;
|
||
break;
|
||
case Bus_port: //bus总线
|
||
uart_id = UART_3;
|
||
break;
|
||
}
|
||
switch(uart_id)
|
||
{
|
||
case UART_0:
|
||
/*数据长度*/
|
||
SRAM_Write_Word(len,g_uart[UART_0].TX_Buffer_WriteAddr);
|
||
|
||
/*数据发送 - 等待回复时间 , 单位:S*/
|
||
SRAM_Write_Byte(uart_outime,g_uart[UART_0].TX_Buffer_WriteAddr+2);
|
||
/*数据内容*/
|
||
SRAM_DMA_Write_Buff(buff,len,g_uart[UART_0].TX_Buffer_WriteAddr+3);
|
||
|
||
g_uart[UART_0].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
|
||
if(g_uart[UART_0].TX_Buffer_WriteAddr > SRAM_UART0_SendBuffer_End_Addr) g_uart[UART_0].TX_Buffer_WriteAddr = SRAM_UART0_SendBuffer_Start_Addr;
|
||
break;
|
||
case UART_1:
|
||
/*数据长度*/
|
||
SRAM_Write_Word(len,g_uart[UART_1].TX_Buffer_WriteAddr);
|
||
/*数据发送 - 等待回复时间 , 单位:S*/
|
||
SRAM_Write_Byte(uart_outime,g_uart[UART_1].TX_Buffer_WriteAddr+2);
|
||
/*数据内容*/
|
||
SRAM_DMA_Write_Buff(buff,len,g_uart[UART_1].TX_Buffer_WriteAddr+3);
|
||
|
||
g_uart[UART_1].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
|
||
if(g_uart[UART_1].TX_Buffer_WriteAddr > SRAM_UART1_SendBuffer_End_Addr) g_uart[UART_1].TX_Buffer_WriteAddr = SRAM_UART1_SendBuffer_Start_Addr;
|
||
break;
|
||
case UART_2:
|
||
/*数据长度*/
|
||
SRAM_Write_Word(len,g_uart[UART_2].TX_Buffer_WriteAddr);
|
||
/*数据发送 - 等待回复时间 , 单位:S*/
|
||
SRAM_Write_Byte(uart_outime,g_uart[UART_2].TX_Buffer_WriteAddr+2);
|
||
/*数据内容*/
|
||
SRAM_DMA_Write_Buff(buff,len,g_uart[UART_2].TX_Buffer_WriteAddr+3);
|
||
|
||
g_uart[UART_2].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
|
||
if(g_uart[UART_2].TX_Buffer_WriteAddr > SRAM_UART2_SendBuffer_End_Addr) g_uart[UART_2].TX_Buffer_WriteAddr = SRAM_UART2_SendBuffer_Start_Addr;
|
||
break;
|
||
case UART_3:
|
||
/*数据长度*/
|
||
SRAM_Write_Word(len,g_uart[UART_3].TX_Buffer_WriteAddr);
|
||
/*数据发送 - 等待回复时间 , 单位:S*/
|
||
SRAM_Write_Byte(uart_outime,g_uart[UART_3].TX_Buffer_WriteAddr+2);
|
||
/*数据内容*/
|
||
SRAM_DMA_Write_Buff(buff,len,g_uart[UART_3].TX_Buffer_WriteAddr+3);
|
||
|
||
g_uart[UART_3].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
|
||
if(g_uart[UART_3].TX_Buffer_WriteAddr > SRAM_UART3_SendBuffer_End_Addr) g_uart[UART_3].TX_Buffer_WriteAddr = SRAM_UART3_SendBuffer_Start_Addr;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|