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

 }
相关推荐
赵谨言2 小时前
基于单片机的防盗报警器设计与实现
经验分享·单片机·毕业设计
aloneboyooo2 小时前
STM32H7时钟树
stm32·单片机·嵌入式硬件
技术流浪者2 小时前
PCB设计(十九)PCB设计中NPN/PNP选型策略
单片机·嵌入式硬件·硬件工程·pcb工艺
长流小哥3 小时前
STM32实战指南:SG90舵机控制原理与代码详解
stm32·单片机·嵌入式硬件·keil5
xduryan7 小时前
16.1 - VDMA视频转发实验之TPG
嵌入式硬件
逼子格10 小时前
硬件工程师笔记——二极管Multisim电路仿真实验汇总
笔记·嵌入式硬件·硬件工程师·multisim·硬件工程师学习·电子器件·电路图
「QT(C++)开发工程师」10 小时前
STM32 | FreeRTOS 递归信号量
python·stm32·嵌入式硬件
芯眼11 小时前
ALIENTEK精英STM32F103开发板 实验0测试程序详解
开发语言·c++·stm32·单片机·嵌入式硬件·社交电子
百里东风11 小时前
STM32IIC协议基础及Cube配置
stm32·单片机·嵌入式硬件
2301_8003997212 小时前
stm32 DMA
stm32·单片机·嵌入式硬件