Files
2026-04-23 13:49:53 +08:00

211 lines
5.3 KiB
C

#include "stdio.h"
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdbool.h>
#include "hdl_usart.h"
//定义数据获取回调函数
static hdl_debug_uart_rx_cb_t debug_rx_callback_cbs;
static com_rx_callback com_rx_callback_cbs;
//接收中断
static void COM_Rx_IrqCallback(void);
static void COM_RxErr_IrqCallback(void);
static void INTC_IrqInstalHandler(const stc_irq_signin_config_t* pstcConfig, uint32_t u32Priority)
{
if (NULL != pstcConfig)
{
(void)INTC_IrqSignIn(pstcConfig);
NVIC_ClearPendingIRQ(pstcConfig->enIRQn);
NVIC_SetPriority(pstcConfig->enIRQn, u32Priority);
NVIC_EnableIRQ(pstcConfig->enIRQn);
}
}
//调试串口
static void DEBUG_RxErr_IrqCallback(void)
{
(void)USART_ReadData(DEBUG_UART);
USART_ClearStatus(DEBUG_UART, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}
static void DEBUG_Rx_IrqCallback(void)
{
uint8_t r_data = 0;
r_data = USART_ReadData(DEBUG_UART);
if (debug_rx_callback_cbs)
{
debug_rx_callback_cbs(r_data);
}
}
void hdl_debug_uart_rx_reg(hdl_debug_uart_rx_cb_t pCBS)
{
if (debug_rx_callback_cbs == 0)
{
debug_rx_callback_cbs = pCBS;
}
}
void hdl_debug_uart_init(void)
{
stc_usart_uart_init_t stcUartInit;
debug_rx_callback_cbs = 0;
LL_PERIPH_WE(
LL_PERIPH_GPIO |
LL_PERIPH_FCG |
LL_PERIPH_PWC_CLK_RMU |
LL_PERIPH_EFM |
LL_PERIPH_SRAM
);
GPIO_SetDebugPort(GPIO_PIN_TRST, DISABLE);
GPIO_SetFunc(DEBUG_UART_RX_PORT, DEBUG_UART_RX_PIN, DEBUG_UART_RX_GPIO_FUNC);
GPIO_SetFunc(DEBUG_UART_TX_PORT, DEBUG_UART_TX_PIN, DEBUG_UART_TX_GPIO_FUNC);
FCG_Fcg1PeriphClockCmd(DEBUG_UART_CLK, ENABLE);
(void)USART_UART_StructInit(&stcUartInit);
stcUartInit.u32ClockDiv = USART_CLK_DIV1;
stcUartInit.u32Baudrate = 115200UL;
stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
USART_UART_Init(DEBUG_UART, &stcUartInit, NULL);
//接收中断配置
stc_irq_signin_config_t stcIrqSigninConfig;
stcIrqSigninConfig.enIRQn = DEBUG_UART_INT_EI_IRQ;
stcIrqSigninConfig.enIntSrc = DEBUG_UART_INT_EI;
stcIrqSigninConfig.pfnCallback = &DEBUG_RxErr_IrqCallback;
INTC_IrqInstalHandler(&stcIrqSigninConfig, DDL_IRQ_PRIO_DEFAULT);
stcIrqSigninConfig.enIRQn = DEBUG_UART_INT_RI_IRQ;
stcIrqSigninConfig.enIntSrc = DEBUG_UART_INT_RI;
stcIrqSigninConfig.pfnCallback = &DEBUG_Rx_IrqCallback;
INTC_IrqInstalHandler(&stcIrqSigninConfig, DDL_IRQ_PRIO_DEFAULT);
LL_PERIPH_WP(
LL_PERIPH_GPIO |
LL_PERIPH_FCG |
LL_PERIPH_PWC_CLK_RMU |
LL_PERIPH_EFM |
LL_PERIPH_SRAM
);
USART_FuncCmd(DEBUG_UART, (USART_TX | USART_RX | USART_INT_RX), ENABLE);
//USART_FuncCmd(DEBUG_UART, (USART_TX | USART_RX ), ENABLE);
}
void hdl_debug_uart_putc(uint8_t ch)
{
while (USART_GetStatus(DEBUG_UART, USART_FLAG_TX_EMPTY) == RESET);
USART_WriteData(DEBUG_UART, ch);
}
int hdl_debug_uart_getc(int *ch)
{
if(USART_GetStatus(DEBUG_UART, USART_FLAG_RX_FULL) ==SET){
*ch = USART_ReadData(DEBUG_UART);
return 0;
}else{
return -1;
}
}
//通信模块串口初始化
void hdl_com_uart_init(void)
{
stc_usart_uart_init_t stcUartInit={0};
stc_irq_signin_config_t stcIrqSigninConfig;
com_rx_callback_cbs = 0;
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM);
GPIO_SetFunc(COM_RX_PORT, COM_RX_PIN, COM_RX_GPIO_FUNC);
GPIO_SetFunc(COM_TX_PORT, COM_TX_PIN, COM_TX_GPIO_FUNC);
FCG_Fcg1PeriphClockCmd(COM_UART_CLK, ENABLE);
(void)USART_UART_StructInit(&stcUartInit);
stcUartInit.u32ClockDiv = USART_CLK_DIV1;
stcUartInit.u32Baudrate = 500000UL;
stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
USART_UART_Init(COM_UART, &stcUartInit, NULL);
//接收中断配置
stcIrqSigninConfig.enIRQn = COM_INT_EI_IRQ;
stcIrqSigninConfig.enIntSrc = COM_INT_EI;
stcIrqSigninConfig.pfnCallback = &COM_RxErr_IrqCallback;
INTC_IrqInstalHandler(&stcIrqSigninConfig, DDL_IRQ_PRIO_DEFAULT);
stcIrqSigninConfig.enIRQn = COM_INT_RI_IRQ;
stcIrqSigninConfig.enIntSrc = COM_INT_RI;
stcIrqSigninConfig.pfnCallback = &COM_Rx_IrqCallback;
INTC_IrqInstalHandler(&stcIrqSigninConfig, DDL_IRQ_PRIO_DEFAULT);
USART_FuncCmd(COM_UART, (USART_TX | USART_RX | USART_INT_RX), ENABLE);
LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM);
}
//通信发送数据
void hdl_com_uart_send(uint8_t* w_buf, uint16_t len)
{
uint8_t i;
for (i = 0; i < len; i++)
{
USART_WriteData(COM_UART, w_buf[i]);
while (USART_GetStatus(COM_UART, USART_FLAG_TX_CPLT) == RESET);
}
}
//通信回调函数注册
void hdl_com_uart_rx_register(com_rx_callback pCBS)
{
if (com_rx_callback_cbs == 0)
{
com_rx_callback_cbs = pCBS;
}
}
//通信接收中断
static void COM_Rx_IrqCallback(void)
{
uint8_t r_data = 0;
r_data = USART_ReadData(COM_UART);
if (com_rx_callback_cbs)
{
com_rx_callback_cbs(r_data);
}
}
static void COM_RxErr_IrqCallback(void)
{
(void)USART_ReadData(COM_UART);
USART_ClearStatus(COM_UART, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}