Files
motor/BSP/bsp.c
T

632 lines
11 KiB
C
Raw Normal View History

2024-09-26 22:32:20 +08:00
#include "bsp.h"
#include "string.h"
#define ID_TYPE ID_TYPE_MOT;
unsigned char SYS_getID(void)
{
unsigned char id = 0;
//unsigned pin_dir = 0; //引脚顺序为正向
//unsigned level_dir = 0; //电平方向
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_6_GPIO_Port,ID_6_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_5_GPIO_Port,ID_5_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_4_GPIO_Port,ID_4_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_3_GPIO_Port,ID_3_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_2_GPIO_Port,ID_2_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id <<= 0x01;
id |= (HAL_GPIO_ReadPin(ID_1_GPIO_Port,ID_1_Pin) == GPIO_PIN_SET)?(0x00):(0x01);
id |= ID_TYPE;
return id;
}
unsigned char SYS_getKey(void)
{
volatile unsigned char state = 0;
state <<= 0x01;
state |= (HAL_GPIO_ReadPin(DI_MAX_GPIO_Port,DI_MAX_Pin) == GPIO_PIN_SET)?(0x01):(0x00);
state <<= 0x01;
state |= (HAL_GPIO_ReadPin(DI_MIN_GPIO_Port,DI_MIN_Pin) == GPIO_PIN_SET)?(0x01):(0x00);
return state;
}
void COMM_setSel(COMM_TYPE_ENUM type)
{
switch(type)
{
default:
case COMM_TYPE_485:
{
HAL_GPIO_WritePin(COM_SEL_GPIO_Port,COM_SEL_Pin,GPIO_PIN_RESET);
}break;
case COMM_TYPE_CAN:
{
HAL_GPIO_WritePin(COM_SEL_GPIO_Port,COM_SEL_Pin,GPIO_PIN_SET);
}break;
}
}
2024-09-28 16:42:37 +08:00
void COMM_setDir(COMM_DIR_ENUM dir)
2024-09-26 22:32:20 +08:00
{
switch(dir)
{
default:
2024-09-28 16:42:37 +08:00
case COMM_DIR_RX:
2024-09-26 22:32:20 +08:00
{
2025-01-09 14:48:56 +08:00
//HAL_Delay(2);
2024-09-26 22:32:20 +08:00
HAL_GPIO_WritePin(CTRL_485_GPIO_Port,CTRL_485_Pin,GPIO_PIN_RESET);
2025-01-09 14:48:56 +08:00
//HAL_Delay(2);
2024-09-26 22:32:20 +08:00
}break;
2024-09-28 16:42:37 +08:00
case COMM_DIR_TX:
2024-09-26 22:32:20 +08:00
{
2025-01-09 14:48:56 +08:00
//HAL_Delay(2);
2024-09-26 22:32:20 +08:00
HAL_GPIO_WritePin(CTRL_485_GPIO_Port,CTRL_485_Pin,GPIO_PIN_SET);
2025-01-09 14:48:56 +08:00
//HAL_Delay(2);
2024-09-26 22:32:20 +08:00
}break;
}
}
void LED_setState(LED_CHANNEL_ENUM channel,LED_STATE_ENUM state)
{
switch(channel)
{
default:
case LED_GREEN:
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,(state)?(GPIO_PIN_RESET):(GPIO_PIN_SET));
}break;
case LED_RED:
{
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,(state)?(GPIO_PIN_RESET):(GPIO_PIN_SET));
}break;
}
}
void LED_setToggle(LED_CHANNEL_ENUM channel)
{
switch(channel)
{
default:
case LED_GREEN:
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}break;
case LED_RED:
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}break;
}
}
void MOTOR_setMS(MOTOR_MS_ENUM ms)
{
switch(ms)
{
default:
case MOTOR_MS_8:
{
HAL_GPIO_WritePin(M_MS1_GPIO_Port,M_MS1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(M_MS2_GPIO_Port,M_MS2_Pin,GPIO_PIN_RESET);
}break;
case MOTOR_MS_16:
{
HAL_GPIO_WritePin(M_MS1_GPIO_Port,M_MS1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(M_MS2_GPIO_Port,M_MS2_Pin,GPIO_PIN_SET);
}break;
case MOTOR_MS_32:
{
HAL_GPIO_WritePin(M_MS1_GPIO_Port,M_MS1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(M_MS2_GPIO_Port,M_MS2_Pin,GPIO_PIN_RESET);
}break;
case MOTOR_MS_64:
{
HAL_GPIO_WritePin(M_MS1_GPIO_Port,M_MS1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(M_MS2_GPIO_Port,M_MS2_Pin,GPIO_PIN_SET);
}break;
}
}
void MOTOR_setEn(MOTOR_STATE_ENUM state)
{
switch(state)
{
default:
case MOTOR_DISNABLE:
{
2024-09-28 16:42:37 +08:00
HAL_GPIO_WritePin(M_EN_GPIO_Port,M_EN_Pin,GPIO_PIN_RESET);
2024-09-26 22:32:20 +08:00
}break;
case MOTOR_ENABLE:
{
2024-09-28 16:42:37 +08:00
HAL_GPIO_WritePin(M_EN_GPIO_Port,M_EN_Pin,GPIO_PIN_SET);
2024-09-26 22:32:20 +08:00
}break;
}
}
void MOTOR_setDir(MOTOR_DIR_ENUM dir)
{
switch(dir)
{
default:
case MOTOR_DIR_CW:
{
HAL_GPIO_WritePin(M_DIR_GPIO_Port,M_DIR_Pin,GPIO_PIN_SET);
}break;
case MOTOR_DIR_CCW:
{
HAL_GPIO_WritePin(M_DIR_GPIO_Port,M_DIR_Pin,GPIO_PIN_RESET);
}break;
}
}
void MOTOR_setStep(unsigned char step)
{
if(step)
{
HAL_GPIO_WritePin(M_STEP_GPIO_Port,M_STEP_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(M_STEP_GPIO_Port,M_STEP_Pin,GPIO_PIN_RESET);
}
}
static SERIAL_t *serials = NULL;
SERIAL_t serial1;
SERIAL_t serial3;
int SERIAL_Init(SERIAL_t *serial,char *name,UART_HandleTypeDef *huart,size_t send_len, size_t recv_len)
{
serial->huart = huart;
serial->name = name;
serial->recv_buff_len = recv_len;
serial->recv_buff = (uint8_t *)malloc(recv_len);
if (!serial->recv_buff)//检查是否分配成功
{
return -1;
}
serial->recv_head = 0u;
serial->recv_tail = 0u;
serial->send_buff_len = send_len;
serial->send_head = 0u;
serial->send_buff[0] = (uint8_t *)malloc(send_len*2);
if (!serial->send_buff[0])
{
return -1;
}
serial->send_buff[1] = serial->send_buff[0]+send_len;
2024-09-28 20:56:58 +08:00
serial->isbusy = 0;
2024-09-26 22:32:20 +08:00
serial->next_ptr = NULL;
if (serials)
{
SERIAL_t *head = serials;
while (head->next_ptr)
{
head = head->next_ptr;
}
head->next_ptr = serial;
}
else
{
serials = serial;
}
2024-12-02 17:33:05 +08:00
return 0;
}
void SERIAL_StartRecv(SERIAL_t *serial)
{
if(serial->setDir)
{
serial->setDir(COMM_DIR_RX);
}
/* 总线繁忙 */
2024-10-01 11:42:04 +08:00
serial->isbusy = 1;
2025-01-09 14:48:56 +08:00
2024-12-02 17:33:05 +08:00
__HAL_UART_CLEAR_OREFLAG(serial->huart);//clear Overrun Error Clear Flag
2024-09-26 22:32:20 +08:00
2024-12-02 17:33:05 +08:00
__HAL_UART_ENABLE_IT(serial->huart, UART_IT_IDLE);//enable idle int
2024-09-26 22:32:20 +08:00
//打开接收中断
2025-01-09 14:48:56 +08:00
//HAL_UART_Receive_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
HAL_UARTEx_ReceiveToIdle_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
2024-12-02 17:33:05 +08:00
}
void SERIAL_StopRecv(SERIAL_t *serial)
{
/* 总线繁忙 */
serial->isbusy = 0;
__HAL_UART_DISABLE_IT(serial->huart, UART_IT_IDLE);//enable idle int
__HAL_UART_DISABLE_IT(serial->huart,UART_IT_RXNE);
__HAL_UART_CLEAR_OREFLAG(serial->huart);//clear Overrun Error Clear Flag
2024-09-26 22:32:20 +08:00
2024-12-02 17:33:05 +08:00
HAL_UART_AbortReceive_IT(serial->huart);
2024-09-26 22:32:20 +08:00
2024-12-02 17:33:05 +08:00
//打开接收中断
2024-09-26 22:32:20 +08:00
}
2024-12-02 17:33:05 +08:00
2024-09-26 22:32:20 +08:00
static void SERIAL_sendstr(SERIAL_t *serial)
{
if (serial->send_head)
{
if (serial->send_max_used_len < serial->send_head)
{
serial->send_max_used_len = serial->send_head;
}
HAL_StatusTypeDef ret;
2024-09-28 16:42:37 +08:00
if(serial->setDir)
{
2025-01-09 14:48:56 +08:00
//先停止接收
//SERIAL_StopRecv(serial);
//HAL_Delay(20);
//如果总线不忙,那么发送,否则等待
serial->setDir(COMM_DIR_TX);
2024-09-28 16:42:37 +08:00
}
2025-01-09 14:48:56 +08:00
2024-09-26 22:32:20 +08:00
ret = HAL_UART_Transmit_IT(serial->huart,serial->send_buff[serial->sel],serial->send_head);
2025-01-09 14:48:56 +08:00
2024-09-26 22:32:20 +08:00
if (ret == HAL_OK)
{
serial->sending = true;
serial->send_head = 0u;
serial->sel = serial->sel?0:1;
}
else
{
}
2024-09-28 20:56:58 +08:00
}
2024-09-26 22:32:20 +08:00
else
{
2024-09-28 20:56:58 +08:00
if(serial->setDir)
{
2025-01-09 14:48:56 +08:00
//HAL_Delay(20);
2024-12-02 17:33:05 +08:00
serial->setDir(COMM_DIR_RX);
2025-01-09 14:48:56 +08:00
//SERIAL_StartRecv(serial);
2024-09-28 20:56:58 +08:00
}
2024-09-26 22:32:20 +08:00
serial->sending = false;
}
}
bool SERIAL_Write(SERIAL_t *serial, uint8_t *data, size_t len)
{
bool rslt = false;
if (serial->send_head + len <= serial->send_buff_len)
{
memcpy(serial->send_buff[serial->sel] + serial->send_head,data,len);
//给head加上尺寸
serial->send_head += len;
if(!serial->sending)
{
SERIAL_sendstr(serial);
}
rslt = true;
}
else
{
if (serial->send_max_used_len < serial->send_head + len)
{
serial->send_max_used_len = serial->send_head + len;
}
2024-09-28 16:42:37 +08:00
}
2024-09-26 22:32:20 +08:00
return rslt;
}
size_t SERIAL_getlen(SERIAL_t *serial)
{
size_t head;
size_t used_len;
head = serial->recv_head;
if (head >= serial->recv_tail)
{
if(head == serial->recv_tail)
{
if(serial->isOverLoop)
{
serial->isOverLoop = 0;
used_len = serial->recv_buff_len;
}
else
{
used_len = 0;
}
}
else
{
used_len = head - serial->recv_tail;
}
}
else
{
used_len = head + serial->recv_buff_len - serial->recv_tail;
}
if (used_len > serial->recv_max_used_len)
{
serial->recv_max_used_len = used_len;
}
return used_len;
}
size_t SERIAL_Read(SERIAL_t *serial, uint8_t *buff, size_t maxlen)
{
size_t rslt = 0u;
rslt = SERIAL_getlen(serial);
if (rslt > maxlen)
{
rslt = maxlen;
}
for (size_t i=0u;i<rslt;++i)
{
buff[i] = serial->recv_buff[serial->recv_tail++];
if (serial->recv_tail >= serial->recv_buff_len)
{
serial->recv_tail = 0u;
}
}
return rslt;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
SERIAL_t *serial = serials;
while (serial)
{
if (serial->huart == huart)
{
serial->recv_head = 0u;
2025-01-09 14:48:56 +08:00
//HAL_UART_Receive_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
HAL_UARTEx_ReceiveToIdle_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
2024-09-26 22:32:20 +08:00
break;
}
else
{
serial = serial->next_ptr;
}
}
}
//空闲中断回调函数,参数Size为串口实际接收到数据字节数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
SERIAL_t *serial = serials;
while (serial)
{
if (serial->huart == huart)
{
if(Size)
{
if((serial->recv_head + Size) >= serial->recv_buff_len)
{
serial->recv_head = Size + serial->recv_head - serial->recv_buff_len;
}
else
{
serial->recv_head += Size;
}
if(serial->recv_head == serial->recv_tail)
{
serial->isOverLoop = 1;//超过了一圈,只能超一圈,超两圈会覆盖
}
}
2025-01-09 14:48:56 +08:00
//HAL_UART_Receive_IT(serial->huart,(serial->recv_buff + serial->recv_head),serial->recv_buff_len - serial->recv_head);
HAL_UARTEx_ReceiveToIdle_IT(serial->huart,(serial->recv_buff + serial->recv_head),serial->recv_buff_len - serial->recv_head);
2024-09-26 22:32:20 +08:00
break;
}
else
{
serial = serial->next_ptr;
}
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
SERIAL_t *serial = serials;
while (serial)
{
if (serial->huart == huart)
{
SERIAL_sendstr(serial);
break;
}
else
{
2024-09-28 20:56:58 +08:00
2024-09-26 22:32:20 +08:00
serial = serial->next_ptr;
}
}
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if (huart->ErrorCode != HAL_UART_ERROR_NONE)
{
SERIAL_t *serial = serials;
while (serial)
{
if (serial->huart == huart)
{
//printf("%s UART ERR%lu!\n",serial->name, huart->ErrorCode);
serial->sending = false;
serial->send_head = 0;
2024-09-28 20:56:58 +08:00
__HAL_UART_CLEAR_OREFLAG(huart);//clear Overrun Error Clear Flag
2024-10-01 11:42:04 +08:00
__HAL_UART_CLEAR_IDLEFLAG(serial->huart);
2025-01-09 14:48:56 +08:00
__HAL_UART_DISABLE_IT(serial->huart,UART_IT_RXNE);
HAL_UART_AbortReceive_IT(serial->huart);
2024-10-01 11:42:04 +08:00
2024-09-28 20:56:58 +08:00
//打开接收
2025-01-09 14:48:56 +08:00
//HAL_UART_Receive_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
HAL_UARTEx_ReceiveToIdle_IT(serial->huart,serial->recv_buff,serial->recv_buff_len);
2024-09-28 20:56:58 +08:00
2024-09-26 22:32:20 +08:00
break;
}
else
{
serial = serial->next_ptr;
}
}
}
}
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
}
2025-01-09 14:48:56 +08:00
//===============time====================
2024-09-28 16:42:37 +08:00
2025-01-09 14:48:56 +08:00
#define MAIN_PERIOD_MS (5)
2024-09-28 16:42:37 +08:00
uint32_t tick_ms = 0;
uint32_t tick_us = 0;
volatile uint32_t tick_count_200Hz = 0;
void tick_init(void)
{
HAL_TIM_Base_Start_IT(&htim2);
}
void tick_count(void)
{
tick_ms += 1;
tick_us += 1000;
if(!(tick_ms % MAIN_PERIOD_MS))
{
tick_count_200Hz += 1;
}
}
uint32_t get_ticks_msec(void)
{
return tick_ms;
}
uint32_t get_ticks_usec(void)
{
return tick_us + TIM2->CNT;
}
void HAL_Delay_usec(uint32_t ticks_usec)
{
uint32_t tick0;
uint32_t tick1;
uint32_t dtick;
tick0 = get_ticks_usec();
do
{
tick1 = get_ticks_usec();
if (tick1 >= tick0)
{
dtick = tick1 - tick0;
}
else
{
dtick = (0xFFFFFFFF - tick0) + tick1;
}
} while (dtick < ticks_usec);
}