can & uart 串口驱动初步完善

Signed-off-by: a1012112796 <1012112796@qq.com>
This commit is contained in:
2022-12-16 16:59:20 +08:00
parent 1e55f52bd0
commit e9b743dbb8
11 changed files with 888 additions and 298 deletions

View File

@@ -113,6 +113,14 @@ static struct stm32_can drv_can2 =
};
#endif
#ifdef BSP_USING_CAN3
static struct stm32_can drv_can3 =
{
"can3",
.CanHandle.Instance = CAN3,
};
#endif
static rt_uint32_t get_can_baud_index(rt_uint32_t baud)
{
rt_uint32_t len, index;
@@ -206,6 +214,13 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
HAL_NVIC_DisableIRQ(CAN2_RX0_IRQn);
HAL_NVIC_DisableIRQ(CAN2_RX1_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
HAL_NVIC_DisableIRQ(CAN3_RX0_IRQn);
HAL_NVIC_DisableIRQ(CAN3_RX1_IRQn);
}
#endif
__HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
__HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_FULL);
@@ -225,6 +240,12 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
{
HAL_NVIC_DisableIRQ(CAN2_TX_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
HAL_NVIC_DisableIRQ(CAN3_TX_IRQn);
}
#endif
__HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_TX_MAILBOX_EMPTY);
}
@@ -239,6 +260,12 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
{
NVIC_DisableIRQ(CAN2_SCE_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
NVIC_DisableIRQ(CAN3_SCE_IRQn);
}
#endif
__HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_WARNING);
__HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_PASSIVE);
@@ -273,6 +300,15 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
HAL_NVIC_SetPriority(CAN3_RX0_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN3_RX0_IRQn);
HAL_NVIC_SetPriority(CAN3_RX1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN3_RX1_IRQn);
}
#endif
}
else if (argval == RT_DEVICE_FLAG_INT_TX)
@@ -290,6 +326,13 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
HAL_NVIC_SetPriority(CAN2_TX_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN2_TX_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
HAL_NVIC_SetPriority(CAN3_TX_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN3_TX_IRQn);
}
#endif
}
else if (argval == RT_DEVICE_CAN_INT_ERR)
@@ -311,6 +354,13 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
HAL_NVIC_SetPriority(CAN2_SCE_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN2_SCE_IRQn);
}
#endif
#ifdef CAN3
if (CAN3 == drv_can->CanHandle.Instance)
{
HAL_NVIC_SetPriority(CAN3_SCE_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CAN3_SCE_IRQn);
}
#endif
}
break;
@@ -623,6 +673,12 @@ static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
pmsg->hdr = (rxheader.FilterMatchIndex >> 1) + 14;
}
#endif
#ifdef CAN3
else if (hcan->Instance == CAN3)
{
pmsg->hdr = (rxheader.FilterMatchIndex + 1) >> 1;
}
#endif
return RT_EOK;
}
@@ -937,6 +993,126 @@ void CAN2_SCE_IRQHandler(void)
}
#endif /* BSP_USING_CAN2 */
#ifdef BSP_USING_CAN3
/**
* @brief This function handles CAN3 TX interrupts. transmit fifo0/1/2 is empty can trigger this interrupt
*/
void CAN3_TX_IRQHandler(void)
{
rt_interrupt_enter();
CAN_HandleTypeDef *hcan;
hcan = &drv_can3.CanHandle;
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
{
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
}
else
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
}
/* Write 0 to Clear transmission status flag RQCPx */
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
{
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_DONE | 1 << 8);
}
else
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
}
/* Write 0 to Clear transmission status flag RQCPx */
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
{
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_DONE | 2 << 8);
}
else
{
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
}
/* Write 0 to Clear transmission status flag RQCPx */
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
}
rt_interrupt_leave();
}
/**
* @brief This function handles CAN3 RX0 interrupts.
*/
void CAN3_RX0_IRQHandler(void)
{
rt_interrupt_enter();
_can_rx_isr(&drv_can3.device, CAN_RX_FIFO0);
rt_interrupt_leave();
}
/**
* @brief This function handles CAN3 RX1 interrupts.
*/
void CAN3_RX1_IRQHandler(void)
{
rt_interrupt_enter();
_can_rx_isr(&drv_can3.device, CAN_RX_FIFO1);
rt_interrupt_leave();
}
/**
* @brief This function handles CAN3 SCE interrupts.
*/
void CAN3_SCE_IRQHandler(void)
{
rt_uint32_t errtype;
CAN_HandleTypeDef *hcan;
hcan = &drv_can3.CanHandle;
errtype = hcan->Instance->ESR;
rt_interrupt_enter();
HAL_CAN_IRQHandler(hcan);
switch ((errtype & 0x70) >> 4)
{
case RT_CAN_BUS_BIT_PAD_ERR:
drv_can3.device.status.bitpaderrcnt++;
break;
case RT_CAN_BUS_FORMAT_ERR:
drv_can3.device.status.formaterrcnt++;
break;
case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
drv_can3.device.status.ackerrcnt++;
if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0))
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0))
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0))
rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
break;
case RT_CAN_BUS_IMPLICIT_BIT_ERR:
case RT_CAN_BUS_EXPLICIT_BIT_ERR:
drv_can3.device.status.biterrcnt++;
break;
case RT_CAN_BUS_CRC_ERR:
drv_can3.device.status.crcerrcnt++;
break;
}
drv_can3.device.status.lasterrtype = errtype & 0x70;
drv_can3.device.status.rcverrcnt = errtype >> 24;
drv_can3.device.status.snderrcnt = (errtype >> 16 & 0xFF);
drv_can3.device.status.errcode = errtype & 0x07;
hcan->Instance->MSR |= CAN_MSR_ERRI;
rt_interrupt_leave();
}
#endif /* BSP_USING_CAN3 */
/**
* @brief Error CAN callback.
* @param hcan pointer to a CAN_HandleTypeDef structure that contains
@@ -1007,6 +1183,18 @@ int rt_hw_can_init(void)
&drv_can2);
#endif /* BSP_USING_CAN2 */
#ifdef BSP_USING_CAN3
filterConf.FilterBank = 0;
drv_can3.FilterConfig = filterConf;
drv_can3.device.config = config;
/* register CAN3 device */
rt_hw_can_register(&drv_can3.device,
drv_can3.name,
&_can_ops,
&drv_can3);
#endif /* BSP_USING_CAN3 */
return 0;
}