253 lines
6.1 KiB
C
253 lines
6.1 KiB
C
#include "board.h"
|
||
#include "motor.h"
|
||
|
||
void motor_process(frame_msg_t *rx, frame_msg_t *bk);
|
||
void sensor_procss(frame_msg_t *rx, frame_msg_t *bk);
|
||
|
||
/************************************* 串口通讯 *************************************/
|
||
uart_t *uarts[UART_NUM_MAX];
|
||
__IO static BOOL deal_done_flag = 0; // 数据处理标志
|
||
__IO static frame_msg_t rx_frame;
|
||
__IO static frame_msg_t bk_frame;
|
||
__IO static uint8_t send_buffer[UART_TXSIZE];
|
||
|
||
// 串口发送
|
||
static void host_send_msg(uint8_t *data, uint16_t len)
|
||
{
|
||
uart_send_data(uarts[UART_NUM_1], data, len);
|
||
}
|
||
|
||
// 接收数据解码
|
||
static void host_data_decode(uint8_t *data, uint16_t len, frame_msg_t *msg)
|
||
{
|
||
DBG_ASSERT(data != NULL __DBG_LINE);
|
||
DBG_ASSERT(msg != NULL __DBG_LINE);
|
||
|
||
msg->state = data[1];
|
||
msg->dev_no = data[2];
|
||
msg->cmd_no = data[3];
|
||
msg->len = data[4];
|
||
osel_memcpy(msg->data, (uint8_t *)&data[5], msg->len);
|
||
}
|
||
|
||
// 发送数据编码
|
||
static void send_data_encode(frame_msg_t *msg)
|
||
{
|
||
uint16_t ver_len = 0, ver_crc = 0;
|
||
uint8_t *sp = (uint8_t *)send_buffer;
|
||
DBG_ASSERT(msg != NULL __DBG_LINE);
|
||
|
||
*sp++ = PACKET_STX; // 包头
|
||
ver_len++;
|
||
*sp++ = msg->state; // 状态
|
||
ver_len++;
|
||
*sp++ = msg->dev_no; // 设备号
|
||
ver_len++;
|
||
*sp++ = msg->cmd_no; // 命令号
|
||
ver_len++;
|
||
*sp++ = msg->len; // 长度
|
||
ver_len++;
|
||
osel_memcpy(sp, msg->data, msg->len); // 数据
|
||
sp += msg->len;
|
||
ver_len += msg->len;
|
||
|
||
ver_crc = crc16_compute((uint8_t *)&send_buffer[1], (ver_len - 1)); // 减去包头
|
||
ver_crc = S2B_UINT16(ver_crc);
|
||
osel_memcpy(sp, (uint8_t *)&ver_crc, 2); // 校验
|
||
sp += 2;
|
||
ver_len += 2;
|
||
|
||
*sp++ = PACKET_ETX; // 包尾
|
||
ver_len++;
|
||
|
||
// 发送
|
||
host_send_msg((uint8_t *)send_buffer, ver_len);
|
||
}
|
||
|
||
// 数据处理
|
||
void host_data_deal(void)
|
||
{
|
||
frame_msg_t *rx_msg = (frame_msg_t *)&rx_frame;
|
||
frame_msg_t *bk_msg = (frame_msg_t *)&bk_frame;
|
||
|
||
if (deal_done_flag == TRUE)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 执行
|
||
switch (rx_msg->dev_no)
|
||
{
|
||
case ADC_SENSOR:
|
||
sensor_procss(rx_msg, bk_msg);
|
||
break;
|
||
case MOTOR:
|
||
motor_process(rx_msg, bk_msg);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
// 回复(组包 + 发送)
|
||
send_data_encode(bk_msg);
|
||
// 修改标志位
|
||
deal_done_flag = TRUE;
|
||
osel_memset((uint8_t *)rx_msg, 0, sizeof(rx_frame));
|
||
osel_memset((uint8_t *)bk_msg, 0, sizeof(bk_frame));
|
||
}
|
||
|
||
// 数据完整性检查
|
||
static BOOL host_data_verify(uint8_t *data, uint16_t len)
|
||
{
|
||
BOOL ret = TRUE;
|
||
uint16_t ver_len = 0;
|
||
uint16_t ver_crc = 0, rx_crc = 0;
|
||
|
||
// 包头包尾检查
|
||
if (data[0] != PACKET_STX || data[1] != MASTER_CODE || data[len - 1] != PACKET_ETX)
|
||
{
|
||
ret = FALSE;
|
||
return ret;
|
||
}
|
||
// 帧长度检查
|
||
ver_len = data[4] + PACKET_MIN_LEN;
|
||
if (ver_len != len)
|
||
{
|
||
ret = FALSE;
|
||
return ret;
|
||
}
|
||
// CRC校验
|
||
ver_crc = crc16_compute((uint8_t *)(data + 1), (len - 4)); // 减去包头、包尾、校验
|
||
ver_crc = S2B_UINT16(ver_crc);
|
||
osel_memcpy((uint8_t *)&rx_crc, (uint8_t *)(data + len - 3), 2);
|
||
if (ver_crc != rx_crc)
|
||
{
|
||
ret = FALSE;
|
||
return ret;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
// 串口接收回调
|
||
static void host_rx_cb(uint8_t uart_index, uint8_t *data, uint16_t len)
|
||
{
|
||
BOOL ret = FALSE;
|
||
|
||
// 数据完整性检查
|
||
ret = host_data_verify(data, len);
|
||
// 数据处理
|
||
if (ret == TRUE && deal_done_flag == TRUE)
|
||
{
|
||
host_data_decode(data, len, (frame_msg_t *)&rx_frame);
|
||
deal_done_flag = FALSE;
|
||
}
|
||
}
|
||
|
||
// 串口初始化
|
||
void host_uart_init(void)
|
||
{
|
||
if (uarts[UART_NUM_1] == NULL)
|
||
{
|
||
uarts[UART_NUM_1] = uart_create(USART1, TRUE, UART_RXSIZE, host_rx_cb, TRUE, UART_TXSIZE, NULL);
|
||
uarts[UART_NUM_1]->uart_index = UART_NUM_1;
|
||
uarts[UART_NUM_1]->dma = DMA1;
|
||
uarts[UART_NUM_1]->dma_rx_channel = LL_DMA_CHANNEL_3;
|
||
uarts[UART_NUM_1]->dma_tx_channel = LL_DMA_CHANNEL_2;
|
||
uart_recv_en(uarts[UART_NUM_1]);
|
||
}
|
||
}
|
||
|
||
/************************************* 电机 *************************************/
|
||
// 电机对象
|
||
motor_t *motor;
|
||
|
||
// 电机初始化
|
||
static void motor_init(void)
|
||
{
|
||
motor = motor_create(STEP_MOTOR);
|
||
gpio_t dir = {
|
||
.port = DIR_GPIO_Port,
|
||
.pin = DIR_Pin,
|
||
};
|
||
gpio_t en = {
|
||
.port = ENA_GPIO_Port,
|
||
.pin = ENA_Pin,
|
||
};
|
||
motor->handle.step_motor.interface.init(motor, dir, en, MIN_STEP_ANGLE, TIM21, LL_TIM_CHANNEL_CH2);
|
||
}
|
||
|
||
// 电机任务
|
||
void motor_process(frame_msg_t *rx, frame_msg_t *bk)
|
||
{
|
||
// BOOL ret = TRUE;
|
||
|
||
switch (rx->cmd_no)
|
||
{
|
||
case SET_MOTOR_SPEED: // 设置电机转速
|
||
break;
|
||
case SET_DRIVER_PULSE: // 设置驱动器脉冲
|
||
break;
|
||
case GET_MIN_STEP: // 获取最小步距
|
||
break;
|
||
case GET_MOTOR_STATE: // 获取电机运行状态
|
||
break;
|
||
case MOTOR_MOVE: // 运行电机
|
||
break;
|
||
case MOTOR_STOP: // 停止电机
|
||
break;
|
||
}
|
||
|
||
bk->dev_no = MOTOR;
|
||
bk->cmd_no = rx->cmd_no;
|
||
}
|
||
|
||
/************************************* ADc传感器 *************************************/
|
||
// AD传感器
|
||
adc_t adc1 = {
|
||
.adc = ADC1,
|
||
.dma = DMA1,
|
||
.dma_channel = LL_DMA_CHANNEL_1,
|
||
};
|
||
|
||
// 获取扭力值
|
||
static BOOL get_tors_value(frame_msg_t *bk)
|
||
{
|
||
uint16_t value = 0;
|
||
|
||
bk->len = sizeof(uint16_t);
|
||
value = adc_get_result_average(IN13);
|
||
value = S2B_UINT16(value);
|
||
osel_memcpy(bk->data, (uint8_t *)&value, bk->len);
|
||
return TRUE;
|
||
}
|
||
|
||
// 传感器任务
|
||
void sensor_procss(frame_msg_t *rx, frame_msg_t *bk)
|
||
{
|
||
BOOL ret = TRUE;
|
||
|
||
switch (rx->cmd_no)
|
||
{
|
||
case GET_TORS_VALUE: // 获取扭力值
|
||
ret = get_tors_value(bk);
|
||
break;
|
||
}
|
||
|
||
bk->state = ret;
|
||
bk->dev_no = ADC_SENSOR;
|
||
bk->cmd_no = rx->cmd_no;
|
||
}
|
||
|
||
/************************************* 板卡 *************************************/
|
||
// 板卡初始化
|
||
void board_init(void)
|
||
{
|
||
motor = NULL;
|
||
my_mem_init(SRAMIN);
|
||
|
||
motor_init(); // 电机初始化
|
||
adc_init(adc1); // 初始化ADC1通道,默认采集AD
|
||
host_uart_init(); // 串口初始化
|
||
ENABLE_TIM(TIM6); // 任务流程定时器使能
|
||
}
|