Files
RCU_C1P_Module/MCU_Driver/uart.c
caocong 650073d366 测试:场景中延时执行、反馈灯控制,初步测试OK
场景执行基本功能都已测试通过,开关设备、插卡取电设备、温控器设备初步测试OK
2026-01-08 21:32:11 +08:00

937 lines
30 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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:
/* 配置串口0配置IO口模式 */
UART0_BaudRateCfg(buad);
R8_UART0_FCR = RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 1 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);
GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP); //RS485引脚初始化 - 轮询端口 RS485 使能引脚
UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_SetPriority(UART0_IRQn, 0x80);
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].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr;
g_uart[UART_0].RX_Buffer_WriteAddr = SRAM_UART0_RecvBuffer_Start_Addr;
g_uart[UART_0].TX_Buffer_ReadAddr = SRAM_UART0_SendBuffer_Start_Addr;
g_uart[UART_0].TX_Buffer_WriteAddr = SRAM_UART0_SendBuffer_Start_Addr;
break;
case UART_1:
/* 配置串口1配置IO口模式 */
UART1_BaudRateCfg(buad);
R8_UART1_FCR = RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 1 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_SetPriority(UART1_IRQn, 0x80);
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].RX_Buffer_ReadAddr = SRAM_UART1_RecvBuffer_Start_Addr;
g_uart[UART_1].RX_Buffer_WriteAddr = SRAM_UART1_RecvBuffer_Start_Addr;
g_uart[UART_1].TX_Buffer_ReadAddr = SRAM_UART1_SendBuffer_Start_Addr;
g_uart[UART_1].TX_Buffer_WriteAddr = SRAM_UART1_SendBuffer_Start_Addr;
break;
case UART_2:
UART2_BaudRateCfg(buad);
R8_UART2_FCR = RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 1 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);
GPIOD_ModeCfg(GPIO_Pin_21, GPIO_ModeOut_PP); //RS485引脚初始化 - 主动端口 RS485 使能引脚
UART2_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
NVIC_SetPriority(UART2_IRQn, 0x80);
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].RX_Buffer_ReadAddr = SRAM_UART2_RecvBuffer_Start_Addr;
g_uart[UART_2].RX_Buffer_WriteAddr = SRAM_UART2_RecvBuffer_Start_Addr;
g_uart[UART_2].TX_Buffer_ReadAddr = SRAM_UART2_SendBuffer_Start_Addr;
g_uart[UART_2].TX_Buffer_WriteAddr = SRAM_UART2_SendBuffer_Start_Addr;
break;
case UART_3:
UART3_BaudRateCfg(buad);
R8_UART3_FCR = RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
// FIFO open, trigger point 1 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_SetPriority(UART3_IRQn, 0x80);
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].RX_Buffer_ReadAddr = SRAM_UART3_RecvBuffer_Start_Addr;
g_uart[UART_3].RX_Buffer_WriteAddr = SRAM_UART3_RecvBuffer_Start_Addr;
g_uart[UART_3].TX_Buffer_ReadAddr = SRAM_UART3_SendBuffer_Start_Addr;
g_uart[UART_3].TX_Buffer_WriteAddr = SRAM_UART3_SendBuffer_Start_Addr;
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].Receiving = 0;
//将数据存入SRAM数据处理缓冲区 - 数据接收完毕在数据头写入数据长度
if( g_uart[UART_0].RX_Buffer_WriteAddr < SRAM_UART0_RecvBuffer_Start_Addr) g_uart[UART_0].RX_Buffer_WriteAddr = SRAM_UART0_RecvBuffer_Start_Addr;
SRAM_Write_Byte((uint8_t)(g_uart[UART_0].RecvLen & 0xFF),g_uart[UART_0].RX_Buffer_WriteAddr);
SRAM_Write_Byte((uint8_t)((g_uart[UART_0].RecvLen >> 8) & 0xFF),g_uart[UART_0].RX_Buffer_WriteAddr+1);
SRAM_DMA_Write_Buff(g_uart[UART_0].RecvBuffer,g_uart[UART_0].RecvLen,g_uart[UART_0].RX_Buffer_WriteAddr+2);
g_uart[UART_0].RX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
if( g_uart[UART_0].RX_Buffer_WriteAddr > SRAM_UART0_RecvBuffer_End_Addr ) g_uart[UART_0].RX_Buffer_WriteAddr = SRAM_UART0_RecvBuffer_Start_Addr;
g_uart[UART_0].RecvLen = 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].Receiving = 0;
//将数据存入SRAM数据处理缓冲区 - 数据接收完毕在数据头写入数据长度
if( g_uart[UART_1].RX_Buffer_WriteAddr < SRAM_UART1_RecvBuffer_Start_Addr) g_uart[UART_1].RX_Buffer_WriteAddr = SRAM_UART1_RecvBuffer_Start_Addr;
SRAM_Write_Byte((uint8_t)(g_uart[UART_1].RecvLen & 0xFF),g_uart[UART_1].RX_Buffer_WriteAddr);
SRAM_Write_Byte((uint8_t)((g_uart[UART_1].RecvLen >> 8) & 0xFF),g_uart[UART_1].RX_Buffer_WriteAddr+1);
SRAM_DMA_Write_Buff(g_uart[UART_1].RecvBuffer,g_uart[UART_1].RecvLen,g_uart[UART_1].RX_Buffer_WriteAddr+2);
g_uart[UART_1].RX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_1].RX_Buffer_WriteAddr > SRAM_UART1_RecvBuffer_End_Addr) g_uart[UART_1].RX_Buffer_WriteAddr = SRAM_UART1_RecvBuffer_Start_Addr;
g_uart[UART_1].RecvLen = 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].Receiving = 0;
//将数据存入SRAM数据处理缓冲区 - 数据接收完毕在数据头写入数据长度
if( g_uart[UART_2].RX_Buffer_WriteAddr < SRAM_UART2_RecvBuffer_Start_Addr) g_uart[UART_2].RX_Buffer_WriteAddr = SRAM_UART2_RecvBuffer_Start_Addr;
SRAM_Write_Byte((uint8_t)(g_uart[UART_2].RecvLen & 0xFF),g_uart[UART_2].RX_Buffer_WriteAddr);
SRAM_Write_Byte((uint8_t)((g_uart[UART_2].RecvLen >> 8) & 0xFF),g_uart[UART_2].RX_Buffer_WriteAddr+1);
SRAM_DMA_Write_Buff(g_uart[UART_2].RecvBuffer,g_uart[UART_2].RecvLen,g_uart[UART_2].RX_Buffer_WriteAddr+2);
g_uart[UART_2].RX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].RX_Buffer_WriteAddr > SRAM_UART2_RecvBuffer_End_Addr) g_uart[UART_2].RX_Buffer_WriteAddr = SRAM_UART2_RecvBuffer_Start_Addr;
g_uart[UART_2].RecvLen = 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].Receiving = 0;
//将数据存入SRAM数据处理缓冲区 - 数据接收完毕在数据头写入数据长度
if( g_uart[UART_3].RX_Buffer_WriteAddr < SRAM_UART3_RecvBuffer_Start_Addr) g_uart[UART_3].RX_Buffer_WriteAddr = SRAM_UART3_RecvBuffer_Start_Addr;
SRAM_Write_Byte((uint8_t)(g_uart[UART_3].RecvLen & 0xFF),g_uart[UART_3].RX_Buffer_WriteAddr);
SRAM_Write_Byte((uint8_t)((g_uart[UART_3].RecvLen >> 8) & 0xFF),g_uart[UART_3].RX_Buffer_WriteAddr+1);
SRAM_DMA_Write_Buff(g_uart[UART_3].RecvBuffer,g_uart[UART_3].RecvLen,g_uart[UART_3].RX_Buffer_WriteAddr+2);
g_uart[UART_3].RX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].RX_Buffer_WriteAddr > SRAM_UART3_RecvBuffer_End_Addr) g_uart[UART_3].RX_Buffer_WriteAddr = SRAM_UART3_RecvBuffer_Start_Addr;
g_uart[UART_3].RecvLen = 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_0
* Description : 485_0 发送函数
* Input :
buf - 发送数据
l - 发送数据长度
* Return : None
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void MCU485_SendString_0(uint8_t *buf, uint16_t len)
{
uint16_t delay_num = 0;
MCU485_EN1_H;
UART0_SendString(buf,len);
//等待发送完成 - 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 > 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)
{
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%s:%d - %d",__func__,uart_id,len);
switch(uart_id)
{
case Polling_Port:
if(Poll485_Info.port_mode == Port_Monitoring_mode ) //轮询端口
{
//Udp_Internal_SeriaNet_Uploading2(Polling_Port,Poll485_Info.baud,buff,len);
}
MCU485_SendString_0(buff,len);
break;
case Active_Port:
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 Bus_port:
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;
}
}