STM32疑难杂症

1.keil的奇怪问题

创建的数组分配内存到0x10000000地址的时候,数据总是莫名其妙的出现问题,取消勾选就正常了

stm32f407内部有一个CCM内存,这部分内存只能由内核控制,任何外设都不能够进行访问。这样问题就来了,如果使用keil5进行编程时勾选了这个选项(下图),则编译的时候会随机将数据放到CCM中。而Lwip通讯靠的是以太网的专用DMA,如果在编译的时候,lwip的描述符被分配到CCM中,那就会导致ping不同的现象。

2.STM32的CAN ID滤波器的设置

列表模式和掩码模式的两个设置,以及多滤波器的设置方法

c 复制代码
static void CanBSP_STM32_Can1_CfgFilter()   
{
  CAN_FilterTypeDef  sFilterConfig;
	CAN_FilterTypeDef  sFilterConfig1;
	
  sFilterConfig.FilterBank = 0;                       //过滤器0

  sFilterConfig.FilterMode =  CAN_FILTERMODE_IDLIST;  //设为列表模式    
  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;    
		
  sFilterConfig.FilterIdHigh = ((uint32_t)0x181)<<5;   //基本ID放入到STID中  
  sFilterConfig.FilterIdLow  = ((uint32_t)0x182) <<5;    
		
  sFilterConfig.FilterMaskIdHigh =((uint32_t)0x183)<<5;
  sFilterConfig.FilterMaskIdLow  =((uint32_t)0x184)<<5; 

  //接收到的报文放入到FIFO0中 
  sFilterConfig.FilterFIFOAssignment = CAN1FIFO;   
 
  sFilterConfig.FilterActivation = ENABLE;  	//激活过滤器
	
	sFilterConfig1 = sFilterConfig;
	
	sFilterConfig1.FilterBank = 1;
  sFilterConfig1.FilterIdHigh = ((uint32_t)0x185)<<5;   //基本ID放入到STID中  
  sFilterConfig1.FilterIdLow  = ((uint32_t)0x186) <<5;    
		
  sFilterConfig1.FilterMaskIdHigh =((uint32_t)0x187)<<5;
  sFilterConfig1.FilterMaskIdLow  =((uint32_t)0x188)<<5; 	
 
  if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }
  if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig1) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

  /* Start the CAN peripheral */
  if (HAL_CAN_Start(&hcan1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

  /* Activate CAN RX notification */
  if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  {
    /* Notification Error 开启挂起中段å...è®¸å¤±è´¥*/
    Error_Handler();
  }
}

static void CanBSP_STM32_Can2_CfgFilter()   
{
   CAN_FilterTypeDef  sFilterConfig;
   CAN_FilterTypeDef  sFilterConfig1;
	
	 sFilterConfig.FilterBank = 14;

   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;    /* 工作在标识符屏蔽位模式 */
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;   /* 过滤器位宽为单个32位。*/
	
	 sFilterConfig.FilterIdHigh = (((uint32_t)0x600<<21)&0xFFFF0000) >> 16;  
   sFilterConfig.FilterIdLow = (((uint32_t)0x600 << 21)|CAN_ID_STD|CAN_RTR_DATA)&0XFFFF;
   sFilterConfig.FilterMaskIdHigh = (((uint32_t)0x600<<21)&0xFFFF0000) >> 16;
   sFilterConfig.FilterMaskIdLow = 0x0000;

   sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;  /* 过滤器被关联到FIFO 1 */
 
   sFilterConfig.FilterActivation = ENABLE;  	/* 使能过滤器 */ 
	
	 sFilterConfig1 = sFilterConfig;
	 
	 sFilterConfig1.FilterBank = 15;
	
	 sFilterConfig1.FilterIdHigh = (((uint32_t)0x500<<21)&0xFFFF0000) >> 16;  
   sFilterConfig1.FilterIdLow = (((uint32_t)0x500 << 21)|CAN_ID_STD|CAN_RTR_DATA)&0XFFFF;
   sFilterConfig1.FilterMaskIdHigh = (((uint32_t)0x500<<21)&0xFFFF0000) >> 16;
   sFilterConfig1.FilterMaskIdLow = 0x0000;
 
  if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }
  if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig1) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

  /* Start the CAN peripheral */
  if (HAL_CAN_Start(&hcan2) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

  /* Activate CAN RX notification */
  if (HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK)
  {
    /* Notification Error 开启挂起中段å...è®¸å¤±è´¥*/
    Error_Handler();
  }

 }
相关推荐
Zeku7 小时前
20251125 - 韦东山Linux第三篇笔记【上】
linux·笔记·单片机
芯联智造10 小时前
【stm32简单外设篇】- 单路 TTP223 电容式触摸传感器
c语言·stm32·单片机·嵌入式硬件
张工在路上10 小时前
(深入探讨句柄泄漏、内存泄漏检测工具)我将分析可能导致内存泄漏(包括托管内存和非托管内存,如句柄泄漏)
stm32·单片机·嵌入式硬件
工程师平哥12 小时前
APE-01 新建工程
笔记·嵌入式硬件
恒锐丰小吕12 小时前
无锡黑锋 HF6206 系列低压差线性稳压器技术解析
嵌入式硬件·硬件工程
hdktq13 小时前
新建HAL版本MDK工程(正点原子版本)
stm32
周周记笔记16 小时前
[元器件专题] RC充电电路(七)
嵌入式硬件·测试工具·硬件开发
ACP广源盛1392462567316 小时前
GSV2712@ACP#2 进 1 出 HDMI 2.0/Type-C DisplayPort 1.4 混合切换器 + 嵌入式 MCU
单片机·嵌入式硬件·计算机外设·音视频
沉在嵌入式的鱼16 小时前
STM32--GY906体温检测传感器
stm32·单片机·嵌入式硬件·gy906·体温检测
cooldream200916 小时前
基于 RISC-V VisionFive 的桌面数字时钟项目实战
嵌入式硬件·risc-v·嵌入式开发