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