Skip to content

Commit

Permalink
update driver for mc02.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiu-xiao committed Apr 24, 2024
1 parent dd212c4 commit a8c9ca0
Show file tree
Hide file tree
Showing 13 changed files with 246 additions and 75 deletions.
14 changes: 8 additions & 6 deletions hw/bsp/mc02/drivers/bsp_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ void bsp_can_init(void) {
can_filter.IdType = FDCAN_STANDARD_ID;
can_filter.FilterIndex = 1;
can_filter.FilterType = FDCAN_FILTER_MASK;
can_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
can_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
can_filter.FilterID1 = 0x0000;
can_filter.FilterID2 = 0x0000;
if (HAL_FDCAN_ConfigFilter(&hfdcan2, &can_filter) != HAL_OK) {
Expand All @@ -99,7 +99,7 @@ void bsp_can_init(void) {
can_filter.IdType = FDCAN_EXTENDED_ID;
can_filter.FilterIndex = 1;
can_filter.FilterType = FDCAN_FILTER_MASK;
can_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
can_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
can_filter.FilterID1 = 0x0000;
can_filter.FilterID2 = 0x0000;
if (HAL_FDCAN_ConfigFilter(&hfdcan2, &can_filter) != HAL_OK) {
Expand All @@ -109,11 +109,11 @@ void bsp_can_init(void) {
XB_ASSERT(false);
}

if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN_ACCEPT_IN_RX_FIFO1,
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN_ACCEPT_IN_RX_FIFO0,
FDCAN_REJECT, ENABLE, ENABLE) != HAL_OK) {
XB_ASSERT(false);
};
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan3, FDCAN_ACCEPT_IN_RX_FIFO1,
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan3, FDCAN_ACCEPT_IN_RX_FIFO0,
FDCAN_REJECT, ENABLE, ENABLE) != HAL_OK) {
XB_ASSERT(false);
};
Expand All @@ -123,9 +123,9 @@ void bsp_can_init(void) {
HAL_FDCAN_Start(&hfdcan3); // 开启FDCAN
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_TX_FIFO_EMPTY, 0);
HAL_FDCAN_ActivateNotification(&hfdcan3, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan3, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan3, FDCAN_IT_TX_FIFO_EMPTY, 0);

bsp_can_initd = true;
Expand Down Expand Up @@ -163,10 +163,12 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hcan, uint32_t RxFifo0ITs) {
can_rx_cb_fn(can_get(hcan), FDCAN_RX_FIFO0);
}

#if 0
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hcan, uint32_t RxFifo1ITs) {
(void)RxFifo1ITs;
can_rx_cb_fn(can_get(hcan), FDCAN_RX_FIFO1);
}
#endif

bsp_status_t bsp_can_register_callback(
bsp_can_t can, bsp_can_callback_t type,
Expand Down
16 changes: 7 additions & 9 deletions hw/bsp/mc02/drivers/bsp_gpio.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "bsp_gpio.h"

#include "bsp_pwm.h"
#include "bsp_spi.h"
#include "main.h"

Expand All @@ -13,7 +14,9 @@ static const bsp_gpio_map_t bsp_gpio_map[BSP_GPIO_NUM] = {
{GYRO_CS_Pin, GYRO_CS_GPIO_Port},
{ACCL_INT_Pin, ACCL_INT_GPIO_Port},
{GYRO_INT_Pin, GYRO_INT_GPIO_Port},
// {CAM_TRIG_Pin, CAM_TRIG_GPIO_Port},
{POWER_5V_Pin, POWER_5V_GPIO_Port},
{POWER_24V_1_Pin, POWER_24V_1_GPIO_Port},
{POWER_24V_2_Pin, POWER_24V_2_GPIO_Port},
};

static bsp_callback_t callback_list[16];
Expand Down Expand Up @@ -95,15 +98,10 @@ bsp_status_t bsp_gpio_disable_irq(bsp_gpio_t gpio) {

inline bsp_status_t bsp_gpio_write_pin(bsp_gpio_t gpio, bool value) {
if (gpio == BSP_GPIO_LED) {
uint8_t txbuff[24];
memset(txbuff, 0xC, 24);
if (value) {
memset(txbuff, 0XF, 8);
bsp_spi_transmit(BSP_SPI_LED, txbuff, 24, true);
}
if (!value) {
memset(txbuff + 16, 0XF, 8);
bsp_spi_transmit(BSP_SPI_LED, txbuff, 24, true);
bsp_pwm_set_comp(BSP_PWM_LED_RED, 1.0f);
} else if (!value) {
bsp_pwm_set_comp(BSP_PWM_LED_RED, 0.0f);
}

return BSP_OK;
Expand Down
4 changes: 3 additions & 1 deletion hw/bsp/mc02/drivers/bsp_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ typedef enum {
BSP_GPIO_IMU_GYRO_CS,
BSP_GPIO_IMU_ACCL_INT,
BSP_GPIO_IMU_GYRO_INT,
// BSP_GPIO_TRIG,
BSP_GPIO_IMU_POWER_5V_EN,
BSP_GPIO_IMU_POWER_24V_1_EN,
BSP_GPIO_IMU_POWER_24V_2_EN,
BSP_GPIO_LED,
BSP_GPIO_NUM,
} bsp_gpio_t;
Expand Down
52 changes: 51 additions & 1 deletion hw/bsp/mc02/drivers/bsp_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,58 @@

#include "main.h"

#define WS2812_LowLevel 0xC0
#define WS2812_HighLevel 0xF0

extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim7;
extern TIM_HandleTypeDef htim12;
extern SPI_HandleTypeDef hspi6;

static uint8_t ws2812_color_grb[3] = {0}, spi_tx_buff[24] = {0};

typedef struct {
TIM_HandleTypeDef *tim;
uint16_t channel;
} bsp_pwm_config_t;

static void ws2812_ctrl() {
for (int i = 0; i < 8; i++) {
spi_tx_buff[7 - i] =
(((ws2812_color_grb[0] >> i) & 0x01) ? WS2812_HighLevel
: WS2812_LowLevel) >>
1;
spi_tx_buff[15 - i] =
(((ws2812_color_grb[1] >> i) & 0x01) ? WS2812_HighLevel
: WS2812_LowLevel) >>
1;
spi_tx_buff[23 - i] =
(((ws2812_color_grb[2] >> i) & 0x01) ? WS2812_HighLevel
: WS2812_LowLevel) >>
1;
}
HAL_SPI_Transmit_DMA(&hspi6, spi_tx_buff, sizeof(spi_tx_buff));
}

static bsp_pwm_config_t bsp_pwm_map[BSP_PWM_NUMBER] = {
[BSP_PWM_IMU_HEAT] = {&htim3, TIM_CHANNEL_1},
[BSP_PWM_IMU_HEAT] = {&htim3, TIM_CHANNEL_4},
[BSP_PWM_BUZZER] = {&htim12, TIM_CHANNEL_2},
[BSP_PWM_LED_GRN] = {&htim1, TIM_CHANNEL_2},
[BSP_PWM_LED_RED] = {&htim1, TIM_CHANNEL_2},
[BSP_PWM_LED_BLU] = {&htim1, TIM_CHANNEL_2},
[BSP_PWM_SERVO_A] = {&htim1, TIM_CHANNEL_1},
[BSP_PWM_SERVO_B] = {&htim1, TIM_CHANNEL_3},
[BSP_PWM_SERVO_C] = {&htim2, TIM_CHANNEL_1},
[BSP_PWM_SERVO_D] = {&htim2, TIM_CHANNEL_3},
};

bsp_status_t bsp_pwm_start(bsp_pwm_channel_t ch) {
if (ch >= BSP_PWM_LED_GRN && ch <= BSP_PWM_LED_BLU) {
ws2812_ctrl();
return BSP_OK;
}
HAL_TIM_PWM_Start(bsp_pwm_map[ch].tim, bsp_pwm_map[ch].channel);

return BSP_OK;
Expand All @@ -28,6 +68,12 @@ bsp_status_t bsp_pwm_set_comp(bsp_pwm_channel_t ch, float duty_cycle) {
duty_cycle = 0.f;
}

if (ch >= BSP_PWM_LED_GRN && ch <= BSP_PWM_LED_BLU) {
ws2812_color_grb[ch - BSP_PWM_LED_GRN] = (uint8_t)(duty_cycle * 255.0f);
ws2812_ctrl();
return BSP_OK;
}

/* 通过PWM通道对应定时器重载值和给定占空比,计算PWM周期值 */
uint16_t pulse = (uint16_t)(duty_cycle * (float)__HAL_TIM_GET_AUTORELOAD(
bsp_pwm_map[ch].tim));
Expand All @@ -40,6 +86,10 @@ bsp_status_t bsp_pwm_set_comp(bsp_pwm_channel_t ch, float duty_cycle) {
bsp_status_t bsp_pwm_set_freq(bsp_pwm_channel_t ch, float freq) {
uint16_t reload = (uint16_t)(1000000U / freq);

if (ch >= BSP_PWM_LED_GRN && ch <= BSP_PWM_LED_BLU) {
return BSP_OK;
}

if (reload > 0) {
__HAL_TIM_PRESCALER(bsp_pwm_map[ch].tim, reload);
} else {
Expand Down
22 changes: 9 additions & 13 deletions hw/bsp/mc02/drivers/bsp_pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,16 @@ extern "C" {
/* PWM通道 */
typedef enum {
BSP_PWM_IMU_HEAT,
// BSP_PWM_LAUNCHER_SERVO,
// BSP_PWM_BUZZER,
// BSP_PWM_LED_RED,
// BSP_PWM_LED_GRN,
// BSP_PWM_LED_BLU,
// BSP_PWM_LASER,
// BSP_PWM_SERVO_A,
// BSP_PWM_SERVO_B,
// BSP_PWM_SERVO_C,
// BSP_PWM_SERVO_D,
// BSP_PWM_SERVO_E,
// BSP_PWM_SERVO_F,
// BSP_PWM_SERVO_G,
BSP_PWM_BUZZER,
BSP_PWM_LED_GRN,
BSP_PWM_LED_RED,
BSP_PWM_LED_BLU,
BSP_PWM_SERVO_A,
BSP_PWM_SERVO_B,
BSP_PWM_SERVO_C,
BSP_PWM_SERVO_D,
BSP_PWM_NUMBER,
BSP_PWM_LAUNCHER_SERVO = BSP_PWM_SERVO_A
} bsp_pwm_channel_t;

bsp_status_t bsp_pwm_start(bsp_pwm_channel_t ch);
Expand Down
71 changes: 66 additions & 5 deletions hw/bsp/mc02/drivers/bsp_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,43 @@
#include "stm32h7xx_it.h"

extern UART_HandleTypeDef huart5;
extern UART_HandleTypeDef huart7;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef huart3;
extern UART_HandleTypeDef huart10;
extern DMA_HandleTypeDef hdma_uart5_rx;
extern DMA_HandleTypeDef hdma_uart7_rx;
extern DMA_HandleTypeDef hdma_uart7_tx;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern DMA_HandleTypeDef hdma_usart3_tx;
extern DMA_HandleTypeDef hdma_usart3_rx;
extern DMA_HandleTypeDef hdma_usart10_rx;
extern DMA_HandleTypeDef hdma_usart10_tx;

static bsp_callback_t callback_list[BSP_UART_NUM][BSP_UART_CB_NUM];

static bsp_uart_t uart_get(UART_HandleTypeDef *huart) {
if (huart->Instance == UART5) {
return BSP_UART_DR16;
} else if (huart->Instance == USART3) {
} else if (huart->Instance == USART1) {
return BSP_UART_REF;
} /*
else if (huart->Instance == USARTX)
return BSP_UART_XXX;
*/
} else if (huart->Instance == UART7) {
return BSP_UART_AI;
} else if (huart->Instance == USART10) {
return BSP_UART_CUSTOM;
} else if (huart->Instance == USART2) {
return BSP_UART_RS485_1;
} else if (huart->Instance == USART3) {
return BSP_UART_RS485_2;
}
/*
else if (huart->Instance == USARTX)
return BSP_UART_XXX;
*/
else {
return BSP_UART_ERR;
}
Expand All @@ -29,6 +50,14 @@ UART_HandleTypeDef *bsp_uart_get_handle(bsp_uart_t uart) {
case BSP_UART_DR16:
return &huart5;
case BSP_UART_REF:
return &huart1;
case BSP_UART_AI:
return &huart7;
case BSP_UART_CUSTOM:
return &huart10;
case BSP_UART_RS485_1:
return &huart2;
case BSP_UART_RS485_2:
return &huart3;
/*
case BSP_UART_XXX:
Expand Down Expand Up @@ -115,6 +144,22 @@ bsp_status_t bsp_uart_abort_receive(bsp_uart_t uart) {
break;
}
case BSP_UART_REF: {
__HAL_DMA_SET_COUNTER(&hdma_usart1_rx, 0);
break;
}
case BSP_UART_AI: {
__HAL_DMA_SET_COUNTER(&hdma_uart7_rx, 0);
break;
}
case BSP_UART_CUSTOM: {
__HAL_DMA_SET_COUNTER(&hdma_usart10_rx, 0);
break;
}
case BSP_UART_RS485_1: {
__HAL_DMA_SET_COUNTER(&hdma_usart2_rx, 0);
break;
}
case BSP_UART_RS485_2: {
__HAL_DMA_SET_COUNTER(&hdma_usart3_rx, 0);
break;
}
Expand All @@ -133,6 +178,22 @@ bsp_status_t bsp_uart_abort_transmit(bsp_uart_t uart) {
break;
}
case BSP_UART_REF: {
__HAL_DMA_SET_COUNTER(&hdma_usart1_tx, 0);
break;
}
case BSP_UART_AI: {
__HAL_DMA_SET_COUNTER(&hdma_uart7_tx, 0);
break;
}
case BSP_UART_CUSTOM: {
__HAL_DMA_SET_COUNTER(&hdma_usart10_tx, 0);
break;
}
case BSP_UART_RS485_1: {
__HAL_DMA_SET_COUNTER(&hdma_usart2_tx, 0);
break;
}
case BSP_UART_RS485_2: {
__HAL_DMA_SET_COUNTER(&hdma_usart3_tx, 0);
break;
}
Expand Down
5 changes: 4 additions & 1 deletion hw/bsp/mc02/drivers/bsp_uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ extern "C" {
typedef enum {
BSP_UART_DR16,
BSP_UART_REF,
// BSP_UART_AI,
BSP_UART_AI,
BSP_UART_CUSTOM,
BSP_UART_RS485_1,
BSP_UART_RS485_2,
/* BSP_UART_XXX, */
BSP_UART_NUM,
BSP_UART_ERR,
Expand Down
3 changes: 3 additions & 0 deletions hw/bsp/mc02/drivers/hal/Core/Inc/stm32h7xx_it.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ void DMA1_Stream5_IRQHandler(void);
void DMA1_Stream6_IRQHandler(void);
void FDCAN1_IT0_IRQHandler(void);
void FDCAN2_IT0_IRQHandler(void);
void FDCAN1_IT1_IRQHandler(void);
void FDCAN2_IT1_IRQHandler(void);
void SPI2_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
Expand All @@ -79,6 +81,7 @@ void SPI6_IRQHandler(void);
void BDMA_Channel0_IRQHandler(void);
void USART10_IRQHandler(void);
void FDCAN3_IT0_IRQHandler(void);
void FDCAN3_IT1_IRQHandler(void);
void TIM23_IRQHandler(void);
/* USER CODE BEGIN EFP */
void HAL_UART_RegisterUserCallback(void (*fn)(UART_HandleTypeDef *huart));
Expand Down
Loading

0 comments on commit a8c9ca0

Please sign in to comment.