NEW_bubing4_gimbal/bsp/usart/bsp_usart.h

76 lines
2.7 KiB
C
Raw Permalink Normal View History

2024-12-25 15:26:39 +08:00
#ifndef BSP_RC_H
#define BSP_RC_H
#include <stdint.h>
#include "main.h"
#define DEVICE_USART_CNT 3 // C板至多分配3个串口
#define USART_RXBUFF_LIMIT 256 // 如果协议需要更大的buff,请修改这里
// 模块回调函数,用于解析协议
typedef void (*usart_module_callback)();
/* 发送模式枚举 */
typedef enum
{
USART_TRANSFER_NONE=0,
USART_TRANSFER_BLOCKING,
USART_TRANSFER_IT,
USART_TRANSFER_DMA,
} USART_TRANSFER_MODE;
// 串口实例结构体,每个module都要包含一个实例.
// 由于串口是独占的点对点通信,所以不需要考虑多个module同时使用一个串口的情况,因此不用加入id;当然也可以选择加入,这样在bsp层可以访问到module的其他信息
typedef struct
{
uint8_t recv_buff[USART_RXBUFF_LIMIT]; // 预先定义的最大buff大小,如果太小请修改USART_RXBUFF_LIMIT
uint8_t recv_buff_size; // 模块接收一包数据的大小
UART_HandleTypeDef *usart_handle; // 实例对应的usart_handle
usart_module_callback module_callback; // 解析收到的数据的回调函数
} USARTInstance;
/* usart 初始化配置结构体 */
typedef struct
{
uint8_t recv_buff_size; // 模块接收一包数据的大小
UART_HandleTypeDef *usart_handle; // 实例对应的usart_handle
usart_module_callback module_callback; // 解析收到的数据的回调函数
} USART_Init_Config_s;
/**
* @brief ,
*
* @param init_config
*/
USARTInstance *USARTRegister(USART_Init_Config_s *init_config);
/**
* @brief ,usart实例.lost callback的情况(使daemon)
*
* @param _instance
*/
void USARTServiceInit(USARTInstance *_instance);
/**
* @brief ,usart实例,buff以及这一帧的长度
* @note ,IT/DMA会导致上一次的发送未完成而新的发送取消.
* @note 使DMA/IT进行发送,USARTIsReady()使,module实现一个发送队列和任务.
* @todo USARTInstance增加发送队列以进行连续发送?
*
* @param _instance
* @param send_buf buffer
* @param send_size how many bytes to send
*/
void USARTSend(USARTInstance *_instance, uint8_t *send_buf, uint16_t send_size,USART_TRANSFER_MODE mode);
/**
* @brief ,IT/DMA发送
*
* @param _instance
* @return uint8_t ready 1, busy 0
*/
uint8_t USARTIsReady(USARTInstance *_instance);
#endif