mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-24 03:27:45 +08:00
finish all bsp utilities
This commit is contained in:
@@ -1,17 +1,30 @@
|
||||
/**
|
||||
* @file bsp_usart.c
|
||||
* @author neozng
|
||||
* @brief 串口bsp层的实现
|
||||
* @version beta
|
||||
* @date 2022-11-01
|
||||
*
|
||||
* @copyright Copyright (c) 2022
|
||||
*
|
||||
*/
|
||||
#include "bsp_usart.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
/* usart service instance,modules' info would be recoreded here using ModuleRegister() */
|
||||
/* usart service instance, modules' info would be recoreded here using USARTRegister() */
|
||||
/* usart服务实例,所有注册了usart的模块信息会被保存在这里 */
|
||||
static usart_instance *instance[DEVICE_USART_CNT];
|
||||
|
||||
/**
|
||||
* @brief usart service will start automatically, after each module registered
|
||||
* 串口服务会在每个实例注册之后自动启用
|
||||
*
|
||||
* @param _instance instance owned by module
|
||||
* @param _instance instance owned by module,模块拥有的串口实例
|
||||
*/
|
||||
static void USARTServiceInit(usart_instance *_instance)
|
||||
{
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(_instance->usart_handle, _instance->recv_buff, _instance->recv_buff_size);
|
||||
// 关闭dma half transfer中断防止两次进入HAL_UARTEx_RxEventCallback()
|
||||
__HAL_DMA_DISABLE_IT(_instance->usart_handle->hdmarx, DMA_IT_HT);
|
||||
}
|
||||
|
||||
@@ -22,21 +35,21 @@ void USARTRegister(usart_instance *_instance)
|
||||
instance[instance_idx++] = _instance;
|
||||
}
|
||||
|
||||
/* @todo 当前仅进行了形式上的封装,后续要进一步考虑是否将module的行为与bsp完全分离 */
|
||||
void USARTSend(usart_instance *_instance, uint8_t *send_buf, uint16_t send_size)
|
||||
{
|
||||
HAL_UART_Transmit_DMA(_instance->usart_handle, send_buf, send_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief everytiem when dma/idle happens,this function will be called
|
||||
* here, for each uart, specific callback is refered for further process
|
||||
* etc:visual protocol resolve/remote control resolve/referee protocol resolve
|
||||
* @brief 每次dma/idle中断发生时,都会调用此函数.对于每个uart实例会调用对应的回调进行进一步的处理
|
||||
* 例如:视觉协议解析/遥控器解析/裁判系统解析
|
||||
*
|
||||
* @note because DMA half transfer iterrupt(DMA_IT_HT) would call this function too, so we just
|
||||
* @note because DMA half transfer iterrupt(DMA_IT_HT) would call this callback function too, so we just
|
||||
* disable it when transfer complete using macro: __HAL_DMA_DISABLE_IT(huart->hdmarx,DMA_IT_HT)
|
||||
*
|
||||
* @param huart uart handle indicate which uart is being handled
|
||||
* @param Size not used temporarily
|
||||
* @param huart uart handle indicate which uart is being handled 发生中断的串口
|
||||
* @param Size not used temporarily,此次接收到的总数居量,暂时没用
|
||||
*/
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
{
|
||||
@@ -58,7 +71,7 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
*
|
||||
* @note most frequent error ex: parity/overrrun/frame error
|
||||
*
|
||||
* @param huart uart handle type,indicate where error comes from
|
||||
* @param huart uart handle type, indicate where error comes from
|
||||
*/
|
||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
|
||||
@@ -4,41 +4,38 @@
|
||||
#include "struct_typedef.h"
|
||||
#include "main.h"
|
||||
|
||||
#define DEVICE_USART_CNT 3
|
||||
#define USART_RX_LIMIT 128 // if your protocol needs bigger buff, modify here
|
||||
#define DEVICE_USART_CNT 3 // C板至多分配3个串口
|
||||
#define USART_RXBUFF_LIMIT 128 // if your protocol needs bigger buff, modify here
|
||||
|
||||
/* application callback,which resolves specific protocol */
|
||||
/* application callback,which resolves specific protocol,解析协议的回调函数 */
|
||||
typedef void (*usart_module_callback)();
|
||||
|
||||
/* usart_instance struct,each app would have one instance */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t recv_buff[USART_RX_LIMIT];
|
||||
uint8_t recv_buff_size;
|
||||
UART_HandleTypeDef *usart_handle;
|
||||
usart_module_callback module_callback;
|
||||
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; // 解析收到的数据的回调函数
|
||||
} usart_instance;
|
||||
|
||||
/**
|
||||
* @brief calling this func would regiter a module to usart_service
|
||||
* this function provides completely wrap and abstract for those module who use usart as commu method
|
||||
*
|
||||
* @param id module id.attention,each id is mapped to a specific usart port(ex:remote control->usart3)
|
||||
* @param prbuff pointer to where the raw recv data stored
|
||||
* @param rbuffsize size of recv data buff
|
||||
* @param psbuff pointer to where the data to be sent stored
|
||||
* @param callback func pointer,this func would be called in USART_service.c/HAL_UARTEx_RxEventCallback()
|
||||
* to resolve raw data using protocol provides by specific app calling Moduleregister()
|
||||
* @brief 注册一个串口实例.
|
||||
*
|
||||
* @param _instance 传入一个由module拥有的串口实例,注意在传入前进行基本信息的配置,详见usart_instance的struct定义
|
||||
*/
|
||||
void USARTRegister(usart_instance* _instance);
|
||||
void USARTRegister(usart_instance *_instance);
|
||||
|
||||
/**
|
||||
* @todo 是否需要进一步封装发送buff和size,并创建一个串口任务以一定频率自动发送?
|
||||
* 若采用此方法,则串口实例的拥有者仅需要在自己的任务中设置发送值,不需要关心发送buffer大小以及何时发送.
|
||||
*
|
||||
* @brief api for sending data through a specific serial port,indicated by the first parameter:id
|
||||
* 通过调用该函数可以发送一帧数据,需要传入一个usart实例,发送buff以及这一帧的长度
|
||||
*
|
||||
* @param id specify which usart would be used
|
||||
* @param send_size how many bytes to send
|
||||
*/
|
||||
void USARTSend(usart_instance* _instance, uint8_t* send_buf,uint16_t send_size);
|
||||
void USARTSend(usart_instance *_instance, uint8_t *send_buf, uint16_t send_size);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user