当前位置: 首页 > news >正文

STM32疑难杂症

1.keil的奇怪问题

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

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

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

static void CanBSP_STM32_Can1_CfgFilter()   
{CAN_FilterTypeDef  sFilterConfig;CAN_FilterTypeDef  sFilterConfig1;sFilterConfig.FilterBank = 0;                       //过滤器0sFilterConfig.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();}}
http://www.lryc.cn/news/274137.html

相关文章:

  • GIT使用简介
  • easycode 插件配置文件
  • elasticsearch系列四:集群常规运维
  • 6.6 会话与输入事件(三)
  • 【自动化测试总结】优点、场景、流程、项目人员构成
  • 杨中科 ASP.NETCore Rest
  • RTU数据采集终端
  • 双指针--- 数组元素的目标和
  • 你的网站或许不需要前端构建(二)
  • flutter 使用adb 同时连接 多个模拟器
  • 网络四元组
  • [实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击
  • ffmpeg 5.0版本调试 ffmpeg 5.01 static版本
  • 应用在游戏机触摸屏中的触摸感应芯片
  • D-Link DES-108 交换机
  • VIT用于图像分类 学习笔记(附代码)
  • MongoDB Certified Associate Developer 认证考试心得
  • 基于Java车间工时管理系统(源码+部署文档)
  • 2024.1.5
  • 水库大坝安全监测设计与施工经验
  • 媒体捕捉-拍照
  • Typora+PicGo+Gitee构建云存储图片
  • 【话题】ChatGPT等大语言模型为什么没有智能2
  • 通过大量生物、地球、农业、气象、生态、环境科学领域中案例,一起探索如何优雅地使用大模型吧!
  • slf4j+logback源码加载流程解析
  • KVM虚拟机部署K8S重启后/etc/hosts内容丢失
  • Redis使用场景(五)
  • 【UnityShader入门精要学习笔记】(2)GPU流水线
  • CSS免费在线字体格式转换器 CSS @font-face 生成器
  • Codeium在IDEA里的3个坑