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();
  }

 }
相关推荐
Mirelladis32 分钟前
实验:串口通信
单片机·51单片机
RaLi和夕44 分钟前
单片机学习笔记9.数码管
汇编·笔记·单片机·嵌入式硬件·学习
普普通通的一名码农2 小时前
ESP32-S3 入门学习笔记(四):LED实验
笔记·单片机·学习
教练、我想打篮球2 小时前
03 基于 STM32 的温度控制系统
stm32·单片机·嵌入式硬件
电鱼智能的电小鱼2 小时前
EFISH-SBC-RK3588 —— 厘米级定位 × 旗舰算力 × 工业级可靠‌
linux·人工智能·嵌入式硬件·边缘计算
ltqshs2 小时前
STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
stm32·单片机·嵌入式硬件
程序员JerrySUN3 小时前
驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架
linux·驱动开发·嵌入式硬件
xyd陈宇阳4 小时前
STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)
stm32·单片机·嵌入式硬件
即安莉4 小时前
STM32 CAN通信 HAL库实战教程:从零到测试成功
stm32·单片机·嵌入式硬件
优信电子4 小时前
STM32 驱动 INA226 测量电流电压功率
stm32·单片机·嵌入式硬件