关节电机measure

This commit is contained in:
TuxMonkey
2026-07-15 21:59:50 +08:00
parent 52813f45d2
commit ae8f1725b1
6 changed files with 227 additions and 19 deletions

View File

@@ -105,6 +105,7 @@ CANInstance *CANRegister(CAN_Init_Config_s *config)
instance->can_handle = config->can_handle;
instance->tx_id = config->tx_id; // 好像没用,可以删掉
instance->rx_id = config->rx_id;
instance->rx_id_match_any = config->rx_id_match_any;
instance->can_module_callback = config->can_module_callback;
instance->id = config->id;
@@ -141,6 +142,17 @@ uint8_t CANTransmit(CANInstance *_instance, float timeout)
return 1; // 发送成功
}
uint8_t CANTryTransmit(CANInstance *_instance)
{
if (HAL_CAN_GetTxMailboxesFreeLevel(_instance->can_handle) == 0u)
return 0u;
return HAL_CAN_AddTxMessage(_instance->can_handle,
&_instance->txconf,
_instance->tx_buff,
&_instance->tx_mailbox) == HAL_OK;
}
void CANSetDLC(CANInstance *_instance, uint8_t length)
{
// 发送长度错误!检查调用参数是否出错,或出现野指针/越界访问
@@ -168,15 +180,16 @@ static void CANFIFOxCallback(CAN_HandleTypeDef *_hcan, uint32_t fifox)
HAL_CAN_GetRxMessage(_hcan, fifox, &rxconf, can_rx_buff); // 从FIFO中获取数据
for (size_t i = 0; i < idx; ++i)
{ // 两者相等说明这是要找的实例
if (_hcan == can_instance[i]->can_handle && rxconf.StdId == can_instance[i]->rx_id)
if (_hcan == can_instance[i]->can_handle &&
(can_instance[i]->rx_id_match_any || rxconf.StdId == can_instance[i]->rx_id))
{
if (can_instance[i]->can_module_callback != NULL) // 回调函数不为空就调用
{
can_instance[i]->rx_std_id = rxconf.StdId;
can_instance[i]->rx_len = rxconf.DLC; // 保存接收到的数据长度
memcpy(can_instance[i]->rx_buff, can_rx_buff, rxconf.DLC); // 消息拷贝到对应实例
can_instance[i]->can_module_callback(can_instance[i]); // 触发回调进行数据解析和处理
}
break;
}
}
}

View File

@@ -21,7 +21,9 @@ typedef struct _
uint8_t tx_buff[8]; // 发送缓存,发送消息长度可以通过CANSetDLC()设定,最大为8
uint8_t rx_buff[8]; // 接收缓存,最大消息长度为8
uint32_t rx_id; // 接收id
uint32_t rx_std_id; // 实际收到的标准帧id
uint8_t rx_len; // 接收长度,可能为0-8
uint8_t rx_id_match_any; // 软件层接收该CAN总线上的任意标准帧
// 接收的回调函数,用于解析接收到的数据
void (*can_module_callback)(struct _ *); // callback needs an instance to tell among registered ones
void *id; // 使用can外设的模块指针(即id指向的模块拥有此can实例,是父子关系)
@@ -34,6 +36,7 @@ typedef struct
CAN_HandleTypeDef *can_handle; // can句柄
uint32_t tx_id; // 发送id
uint32_t rx_id; // 接收id
uint8_t rx_id_match_any; // 忽略rx_id,由模块自行解析报文id
void (*can_module_callback)(CANInstance *); // 处理接收数据的回调函数
void *id; // 拥有can实例的模块地址,用于区分不同的模块(如果有需要的话),如果不需要可以不传入
} CAN_Init_Config_s;
@@ -65,4 +68,6 @@ void CANSetDLC(CANInstance *_instance, uint8_t length);
*/
uint8_t CANTransmit(CANInstance *_instance,float timeout);
uint8_t CANTryTransmit(CANInstance *_instance);
#endif