|
只要将下面的代码【CANx_FilterConfig】、【HAL_CAN_RxFifo0MsgPendingCallback】放在main.c文件中,CAN中断就能进,当将下面的代码【CANx_FilterConfig】、【HAL_CAN_RxFifo0MsgPendingCallback】放在另外的文件里,中断就不能进。相应的头文件引用都是正确的。工程
Linkage_controller.rar
(18.01 MB, 下载次数: 1)
这个是什么问题呀?
(当将上面的两个函数放在main.c里,drv_can.c内容有做调整的,任务里有一个定时发送数据的用来指示程序运行的。两次实验发送数据的任务正常运行,外接分析仪有正常看到数据。)
[C] 纯文本查看 复制代码 CAN_FilterTypeDef can1FilterConfig;
void CANx_FilterConfig(CAN_HandleTypeDef *hcan,uint8_t index)
{
// 配置CAN1过滤器
can1FilterConfig.FilterBank = index;
can1FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
can1FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
can1FilterConfig.FilterIdHigh = 0x0000;
can1FilterConfig.FilterIdLow = 0x0000;
can1FilterConfig.FilterMaskIdHigh = 0x0000;
can1FilterConfig.FilterMaskIdLow = 0x0000;
can1FilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
can1FilterConfig.FilterActivation = ENABLE;
can1FilterConfig.SlaveStartFilterBank=14;
if (HAL_CAN_ConfigFilter(hcan, &can1FilterConfig) != HAL_OK)//https://blog.csdn.net/plc0318/article/details/124255216
{
Error_Handler();
}
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance ==CAN1)
{
CAN_RxHeaderTypeDef RxHeader; //接受句柄
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, date_CAN1); //接收,CAN邮箱为0
//_hmi_debug_cm_sta|=0x4;
return ;
}
else if(hcan->Instance == CAN2)
{
CAN_RxHeaderTypeDef RxHeader; //接受句柄
HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxHeader, date_CAN2); //接收,CAN邮箱为0
//_hmi_debug_cm_sta|=0x8;
}
}
void CANx_send(CAN_HandleTypeDef* hcan,uint8_t mode,uint32_t ID,uint8_t *pData,uint16_t Len)
{
if(mode==_CAN_EX)
{
CANx_SendExtData( hcan, ID, pData, Len);
}
if(mode==_CAN_STD)
{
CANx_SendStdData(hcan, ID, pData, Len);
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_CAN1_Init();
MX_CAN2_Init();
can_init();
MX_USART2_UART_Init();
MX_USART6_UART_Init();
MX_CRC_Init();
MX_TIM7_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
/* Start scheduler */
osKernelStart();
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
附drv_can.c完整内容(
[C] 纯文本查看 复制代码 #include "stm32f2xx.h"
#include "stm32f2xx_hal.h"
#include "drv_can.h"
//rx&tx
#define ENABLE 0
//can1_stb can1
//can2_stb can2
static void _CAN1_stb_ctr(uint8_t sta)
{
sta==1?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
}
static void _CAN2_stb_ctr(uint8_t sta)
{
sta==1?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}
CAN_FilterTypeDef can1FilterConfig;
void CANx_FilterConfig(CAN_HandleTypeDef *hcan,uint8_t index)
{
// 配置CAN1过滤器
can1FilterConfig.FilterBank = index;
can1FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
can1FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
can1FilterConfig.FilterIdHigh = 0x0000;
can1FilterConfig.FilterIdLow = 0x0000;
can1FilterConfig.FilterMaskIdHigh = 0x0000;
can1FilterConfig.FilterMaskIdLow = 0x0000;
can1FilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
can1FilterConfig.FilterActivation = ENABLE;
can1FilterConfig.SlaveStartFilterBank=14;
if (HAL_CAN_ConfigFilter(hcan, &can1FilterConfig) != HAL_OK)//https://blog.csdn.net/plc0318/article/details/124255216
{
Error_Handler();
}
}
uint8_t CANx_SendStdData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len)
{
static CAN_TxHeaderTypeDef Tx_Header;
Tx_Header.StdId=ID;
Tx_Header.ExtId=0;
Tx_Header.IDE=0;
Tx_Header.RTR=0;
Tx_Header.DLC=Len;
/*找到空的发送邮箱,把数据发送出去*/
if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) //
{
if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX1) != HAL_OK)
{
HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX2);
}
}
}
uint8_t CANx_SendExtData(CAN_HandleTypeDef* hcan,uint32_t ID,uint8_t *pData,uint16_t Len)
{
static CAN_TxHeaderTypeDef Tx_Header;
Tx_Header.RTR=0;
Tx_Header.DLC=Len;
Tx_Header.StdId=0;
Tx_Header.ExtId=ID;
Tx_Header.IDE=CAN_ID_EXT;
/*找到空的发送邮箱,把数据发送出去*/
if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) //
{
if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX1) != HAL_OK)
{
HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX2);
}
}
}
uint8_t date_CAN1[8];//设为全局变量,用于接收CAN1数据
uint8_t date_CAN2[8];//设为全局变量,用于接收CAN2数据
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance ==CAN1)
{
CAN_RxHeaderTypeDef RxHeader; //接受句柄
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, date_CAN1); //接收,CAN邮箱为0
//_hmi_debug_cm_sta|=0x4;
return ;
}
else if(hcan->Instance == CAN2)
{
CAN_RxHeaderTypeDef RxHeader; //接受句柄
HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxHeader, date_CAN2); //接收,CAN邮箱为0
//_hmi_debug_cm_sta|=0x8;
}
}
void CANx_send(CAN_HandleTypeDef* hcan,uint8_t mode,uint32_t ID,uint8_t *pData,uint16_t Len)
{
if(mode==_CAN_EX)
{
CANx_SendExtData( hcan, ID, pData, Len);
}
if(mode==_CAN_STD)
{
CANx_SendStdData(hcan, ID, pData, Len);
}
}
void CAN_Start(CAN_HandleTypeDef *hcan,uint8_t index)
{
CANx_FilterConfig(hcan,index);
HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_CAN_Start(hcan);
}
void can_init(void)
{
_CAN1_stb_ctr(0);
_CAN2_stb_ctr(0);
CAN_Start(&hcan1,0);
//CAN_Start(&hcan2,14);
}
void can_send_test(void)
{
uint8_t data[]={0x68,0x65,0x6C,0x6C,0x6F,0x20,0x77,0x6F,0x72,0x6C,0x64};
CANx_send(&hcan1,1,0x18ffff00,data,8);
CANx_send(&hcan2,1,0x18ffff01,data,8);
}
void Can_parse(uint8_t can)
{
}
|
|