MW22-02A/BSP/Driver/usart/Usart.c

377 lines
10 KiB
C
Raw Permalink Normal View History

2025-05-21 01:55:40 +00:00
/****
*****<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>
*****<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*****<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*****<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*****<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϽ<EFBFBD><EFBFBD>պ<EFBFBD><EFBFBD><EFBFBD>
*****<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
****/
#include "Usart.h"
#include "ptz_struct.h"
#include "gd32f4xx_it.h"
device_handle uart_485_handle = 0;
device_handle uart_422_handle = 0;
BSP_OS_SEM ser_mutex;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>
uart_device_info uart_devices[6]={
// init index
{ 0, 0,},
{ 0, 1,},
{ 0, 2,},
{ 0, 3,},
{ 0, 4,},
{ 0, 5,}
};
RingQueue ring_que;
u_int8_t ptz_uart_buff[10];
//<2F><><EFBFBD><EFBFBD>
//RS422
u_int8_t ptz_uart_422_buff[PTZ_UART_422_BUFF_SIZE];
char uart_422_state = 0;
//RS485
u_int8_t ptz_uart_485_buff[PTZ_UART_485_BUFF_SIZE];
char uart_485_state = 0;
int bata;
char uart_data;
/// @brief <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// @param[in] usart_periph:USARTx(x=0,1,2)
/// @param[in] baud:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// @return none
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
static void usart_config(uint32_t usart_periph, int baud)
{
switch(usart_periph)
{
case TEST://<2F><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>Զ˿<D4B6>
//ʹ<>ܶ˿<DCB6>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOA);
//ʹ<>ܴ<EFBFBD><DCB4><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_USART0);
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);//TX
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);//RX
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10);
break;
case UART_485://<2F><><EFBFBD><EFBFBD>1<EFBFBD><31>485
//ʹ<>ܶ˿<DCB6>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOD);
//ʹ<>ܴ<EFBFBD><DCB4><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_USART1);
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_5);//TX
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_6);//RX
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_5);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5);
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_6);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
///<2F>շ<EFBFBD>ģʽѡ<CABD><D1A1>
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_7);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
break;
case UART_422://<2F><><EFBFBD><EFBFBD>2<EFBFBD><32>422
//ʹ<>ܶ˿<DCB6>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOD);
//ʹ<>ܴ<EFBFBD><DCB4><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_USART2);
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_8);//TX
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_9);//RX
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_8);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_9);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);
break;
default:
break;
}
///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
usart_deinit(usart_periph);//ʱ<>Ӹ<EFBFBD>λ
usart_baudrate_set(usart_periph,baud);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ʣ<EFBFBD>Ĭ<EFBFBD><C4AC>9600
usart_receive_config(usart_periph, USART_RECEIVE_ENABLE);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
usart_transmit_config(usart_periph, USART_TRANSMIT_ENABLE);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
usart_enable(usart_periph);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
//ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD>
usart_interrupt_enable(usart_periph, USART_INT_RBNE);
}
/// @brief <20>ж<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// @param[in] usart_periph:USARTx(x=0,1,2)
/// @return none
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
static void Usart_Nvic_config(uint32_t usart_periph)
{
switch(usart_periph)
{
case TEST://<2F><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>Զ˿<D4B6>
//ʹ<>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
nvic_irq_enable(USART0_IRQn, 4, 0);//<2F><>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>Ϊ3<CEAA><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̫<EFBFBD><CCAB><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>̫<EFBFBD><CCAB>Ϊ2
break;
case UART_485://<2F><><EFBFBD><EFBFBD>1<EFBFBD><31>485
nvic_irq_enable(USART1_IRQn, 3, 0);//<2F><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>Ϊ3<CEAA><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Ϊ1
break;
case UART_422://<2F><><EFBFBD><EFBFBD>2<EFBFBD><32>422
nvic_irq_enable(USART2_IRQn, 3, 1);//<2F><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>Ϊ3<CEAA><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Ϊ2
break;
default:
break;
}
}
/// @brief <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>С<EFBFBD><D0A1><EFBFBD>Դ<EFBFBD><D4B4>
/// @param[in] usart_periph:USARTx(x=0,1,2)
/// @param[in] index:<3A><EFBFBD>˿<EFBFBD>
/// @param[in] *buff:<3A><><EFBFBD>е<EFBFBD>ַ
/// @param[in] buff_size:<3A><><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
/// @return device_handle<6C><65><EFBFBD><EFBFBD><E8B1B8>ַ
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
device_handle uart_init(uint32_t usart_periph, uint32_t index, u_int8_t *buff, int buff_size)
{
if(!uart_devices[index].init)
{//û<>г<EFBFBD>ʼ<EFBFBD><CABC>
InitRingQueue(&uart_devices[index].uart_ring_queue, buff, buff_size); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>л<EFBFBD><D0BB><EFBFBD>
BSP_OS_SemCreate(&uart_devices[index].port_mutex,1u,"port mutex");
BSP_OS_SemCreate(&uart_devices[index].ser_mutex,1u,"serial mutex");
BSP_OS_SemCreate(&uart_devices[index].sem_recv_data,0u,"sem recv data");
uart_devices[index].init = 1;
}
return (device_handle)(&uart_devices[index]);
}
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ʼ<EFBFBD><CABC>
/// @param[in] none
/// @return none
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
static void Uart_Init(void)
{
///485<38><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ʼ<EFBFBD><CABC>UART_485
usart_config(UART_485, g_ptz.uart_485_baud);//<2F><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>
Usart_Nvic_config(UART_485);//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
uart_485_handle = uart_init(UART_485, PTZ_UART_485_INDEX, ptz_uart_485_buff, sizeof(ptz_uart_485_buff));
BSP_IntVectSet(54,USART1_IRQHandler);
BSP_IntEn(54);
///422<32><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ʼ<EFBFBD><CABC>
usart_config(UART_422, g_ptz.uart_422_baud);//<2F><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>
Usart_Nvic_config(UART_422);//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
uart_422_handle = uart_init(UART_422, PTZ_UART_422_INDEX, ptz_uart_422_buff, sizeof(ptz_uart_422_buff));
BSP_IntVectSet(55,USART2_IRQHandler);
BSP_IntEn(55);
}
/// @brief 485<38><35><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// @param[in] data:
/// @return none
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
void IRQHandler_485_process(u_int8_t data)
{
uart_device_info *dev = (uart_device_info *)uart_485_handle;//<2F>ն˽<D5B6><CBBD><EFBFBD>
if(!RingQueueFull(&dev->uart_ring_queue))
{
InRingQueue(&dev->uart_ring_queue, data);
}
}
/// @brief 422<32><32><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// @param[in] data<74><61>
/// @return none
/// @note <20>޸<EFBFBD><DEB8><EFBFBD>־
/// LH<4C><48>2022-05-20
void IRQHandler_422_process(u_int8_t data)
{
uart_device_info *dev = (uart_device_info *)uart_422_handle;//<2F>ն˽<D5B6><CBBD><EFBFBD>
if(!RingQueueFull(&dev->uart_ring_queue))
{
InRingQueue(&dev->uart_ring_queue, data);
}
}
///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ptz_uart_dev_send(device_handle device, void *data, int len)
{
unsigned char buff;
uart_device_info *device_info = (uart_device_info *)device;
if((!device) || (!device_info->init))
{
return;
}
BSP_OS_SemWait(&device_info->ser_mutex, 0u);
if(device == uart_485_handle)
{
PTZ_UART_485_TX;
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
for (int i = 0; i<len; i++)
{
buff = ((u_int8_t *)data)[i];
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
while(RESET == usart_flag_get(USART1, USART_FLAG_TBE)){}
//д<>Ĵ<EFBFBD><C4B4><EFBFBD>
usart_data_transmit(USART1, buff);
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(RESET == usart_flag_get(USART1, USART_FLAG_TC)){}
if((i % 100) == 0 && i > 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
}
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
PTZ_UART_485_RX;
}
if(device == uart_422_handle)
{
for (int i = 0; i<len; i++)
{
buff = ((u_int8_t *)data)[i];
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
while(RESET == usart_flag_get(USART2, USART_FLAG_TBE)){}
//д<>Ĵ<EFBFBD><C4B4><EFBFBD>
usart_data_transmit(USART2, buff);
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(RESET == usart_flag_get(USART2, USART_FLAG_TC)){}
if((i % 100) == 0 && i > 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
}
}
BSP_OS_SemPost(&device_info->ser_mutex);
}
/*******************************************************************************
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
** <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
** <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
** <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
********************************************************************************/
int uart_dev_char_present(device_handle device)
{
uart_device_info *device_info = (uart_device_info *)device;
if((!device) || (!device_info->init))
return 0;
return !RingQueueEmpty(&device_info->uart_ring_queue);
}
/*******************************************************************************
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
** <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
** <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
** <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
********************************************************************************/
char uart_dev_in_char(device_handle device)
{
uart_device_info *device_info = (uart_device_info *)device;
char c = 0;
if (uart_dev_char_present(device)) //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OutRingQueue(&device_info->uart_ring_queue, (u_int8_t*)&c);
return c;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char ptz_uart_dev_in_char(device_handle device)
{
uart_device_info *device_info = (uart_device_info *)device;
char c = 0;
if (uart_dev_char_present(device)) //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OutRingQueue(&device_info->uart_ring_queue, (u_int8_t*)&c);
return c;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ptz_uart_dev_char_present(device_handle device)
{
uart_device_info *device_info = (uart_device_info *)device;
if((!device) || (!device_info->init))
return 0;
return !RingQueueEmpty(&device_info->uart_ring_queue);
}
void Usart_init_module()
{
Uart_Init();
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ն˴<D5B6><CBB4><EFBFBD>
void init_term_uart()
{
//ʹ<>ܶ˿<DCB6>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOA);
//ʹ<>ܴ<EFBFBD><DCB4><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_USART0);
/* connect port to USARTx_Tx */
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10);
/* USART configure */
usart_deinit(USART0);//ʱ<>Ӹ<EFBFBD>λ
usart_baudrate_set(USART0,9600U);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>
usart_receive_config(USART0, USART_RECEIVE_ENABLE);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
usart_enable(USART0);//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
// BSP_OS_SemCreate(&ser_mutex,0u,"udp_send_data_mutex");
}