硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1645|回复: 6
收起左侧

[FreeRTOS] 用cubemx生成的Freertos有一个很神奇的地方

[复制链接]

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-7-18 18:31:07 | 显示全部楼层 |阅读模式
只要将下面的代码【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)
{

}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-7-19 09:14:16 | 显示全部楼层
一般这种神奇问题,程序里面应该有隐含的bug未找到。
回复

使用道具 举报

22

主题

182

回帖

248

积分

高级会员

积分
248
QQ
发表于 2024-7-19 14:33:39 | 显示全部楼层
放在哪里没关系。
你发出来的工程编不过,没法看。
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-19 18:14:02 | 显示全部楼层
貌似有隐藏极深的BUG
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
 楼主| 发表于 2024-7-22 10:16:16 | 显示全部楼层
yono 发表于 2024-7-19 14:33
放在哪里没关系。
你发出来的工程编不过,没法看。

可以编译啊。
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
 楼主| 发表于 2024-7-22 10:16:41 | 显示全部楼层
h_007 发表于 2024-7-19 18:14
貌似有隐藏极深的BUG

可以具体说说不
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
 楼主| 发表于 2024-7-22 10:17:08 | 显示全部楼层
eric2013 发表于 2024-7-19 09:14
一般这种神奇问题,程序里面应该有隐含的bug未找到。

有排查的方向吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 04:56 , Processed in 0.337469 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表