datasheet

STM32F042 基于CubeMX HAL库CAN的配置

2019-06-17来源: eefocus关键字:STM32F042  CubeMX  HAL库  CAN  配置

首先说说使用时候的两个坑。


(1)要使能Swap PA9/10 –>PA11/12,这个时候PA11和PA12引脚才能出现。



(2)我第一步用的是回环模式。


大致是这样的。


 


While


{


SendCanMessage();


}


 


Can_interrupt


{


HAL_CAN_Receive_IT(hcan,CAN_FIFO0);


}


 


却发现只能中断一次不能返回了。


原因,配置好CAN后状态为HAL_CAN_STATE_READY。


 


设置为接收,状态为HAL_CAN_STATE_BUSY_RX0。


接收到数据一般会在继续设置为接收。这样一直可以接收。


 


发送时状态为:HAL_CAN_STATE_BUSY_TX。发送结束变为HAL_CAN_STATE_READY。


 


那么我们想想,回环模式下的状态。


HAL_CAN_STATE_READY。à设置为接收状态为HAL_CAN_STATE_BUSY_RX0


发送数据 此次被中断,那么完成接收操作时候状态变成了(HAL_CAN_STATE_BUSY_TX)


中断跳回来,发送完成状态变为HAL_CAN_STATE_READY。


 


再次发数据的时候问题来了,这个时候已经不是接收状态了!




也就是说中断里面收到数据再重新设置为接受状态这个操作被忽略了




配置图:


(1)配置IO



(2)配置时钟



(3)配置CAN 500K



程序:


#include "main.h"

#include "stm32f0xx_hal.h"

 

CAN_HandleTypeDef hcan;

 

 

CAN_FilterConfTypeDef  sFilterConfig;

static CanTxMsgTypeDef        TxMessage;

static CanRxMsgTypeDef        RxMessage;

 

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_CAN_Init(void);

 

void Configure_Filter(void)

{

sFilterConfig.FilterNumber = 0;                   //过滤器组0

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //工作在标识符屏蔽位模式

  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//滤波器位宽为单个32位

  sFilterConfig.FilterIdHigh =(((unsigned int)0x1314<<3)&0xFFFF0000)>>16; //要过滤的ID高位

  sFilterConfig.FilterIdLow = (((unsigned int)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位

  sFilterConfig.FilterMaskIdHigh = 0xffff;

  sFilterConfig.FilterMaskIdLow = 0xffff;

  sFilterConfig.FilterFIFOAssignment =CAN_FILTER_FIFO0;//过滤器被关联到FIFO0;

  sFilterConfig.FilterActivation = ENABLE;//使能过滤器

  //sFilterConfig.BankNumber = 14;

  HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);

}

 

 

void SendData(void)

{

/* USER CODE BEGIN 2 */

  hcan.pTxMsg = &TxMessage;

  hcan.pRxMsg = &RxMessage;

 

 

  hcan.pTxMsg->StdId = 0;//0x1314;

hcan.pTxMsg->ExtId=  0x1314;

  hcan.pTxMsg->RTR = CAN_RTR_DATA;

  hcan.pTxMsg->IDE = CAN_ID_EXT;

  hcan.pTxMsg->DLC = 8;

  hcan.pTxMsg->Data[0] = 'C';

  hcan.pTxMsg->Data[1] = 'A';

  hcan.pTxMsg->Data[2] = 'N';

  hcan.pTxMsg->Data[3] = ' ';

  hcan.pTxMsg->Data[4] = 'T';

  hcan.pTxMsg->Data[5] = 'e';

  hcan.pTxMsg->Data[6] = 's';

  hcan.pTxMsg->Data[7] = 't';

 

if(HAL_CAN_Transmit(&hcan, 100) != HAL_OK)

{

}

}

 

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)

{

 

HAL_CAN_Receive_IT(hcan,CAN_FIFO0);//开启中断接收

}

 

 

int main(void)

{

 

 

  HAL_Init();

  SystemClock_Config();

 

 

  MX_GPIO_Init();

  MX_CAN_Init();

  Configure_Filter();

HAL_CAN_Receive_IT(&hcan,CAN_FIFO0);

SendData();

  while (1)

  {

 

  HAL_Delay(1000);

HAL_CAN_Receive_IT(&hcan,CAN_FIFO0);//这个重新设置为接收,算是仅仅供测试使用,为bug;

    SendData();

 

 

  }

 

}



其中滤波器需要配置,不然无法中断。


关键字:STM32F042  CubeMX  HAL库  CAN  配置

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic464916.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F407 SPI flash
下一篇:STM32 FSMC 外部使用SRAM

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

解决stm32f103通过stlink不能烧录程序问题

问题:   stm32(stm32f103c8T6)开发板只能通过串口烧录程序,而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了如果还是不行的话,就得升级一下stlink固件了,具体升级方法可百度
发表于 2019-07-19
解决stm32f103通过stlink不能烧录程序问题

STM32F4标准外设库模板工程建立与使用

sysclk为168MHzFSMC和FMCSTM32F4的某些系列是FSMC,有些是FMC浮点处理器FPUhttp://www.stmcu.org/module/forum/thread-581903-1-1.html打开 option for target 选择 C/C++ 标签, 在define中添加:USE_HAL_DRIVER,STM32F407xx,__TARGET_FPU_VFP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,ARM_MATH_CM4,__CC_ARM,由于我的是HAL的库,所以前面有USE_HAL_DRIVER的全局宏定义,如果你用的不是HAL库,而是使用固件库的话,一般会有
发表于 2019-07-19
STM32F4标准外设库模板工程建立与使用

STM32F1系列单片机USB外设相关寄存器的定义

Keil MDK网站上下载的Keil.STM32F1xx_DFP.2.2.0.pack包中的stm32f10x.h头文件里面没有USB_TypeDef的定义,只有寄存器位的定义,是不完整的头文件。没有USB的数据结构就会给访问USB寄存器带来一定的困难。虽然可以参照STM32参考手册中的USB register map自己编写出USB_TypeDef结构体,但是这样比较麻烦。不过,STM32CubeMX工具生成的STM32F103工程中的头文件stm32f103xe.h中就有完整的USB数据结构,该头文件的版本是V4.2.0,日期为31-March-2017,作者仍然是Keil里面的MCD Application Team
发表于 2019-07-19

STM32F103 DMA 通道对应的外设

今天在调试stm32f103的时候,使用串口1的RX对应DMA1通道5是正确的,但是当我调试调试到串口2的RX的时候依然在用原通道,完全忽略了芯片不同的外设所对应的DMA通道是不同的。 
发表于 2019-07-19
STM32F103 DMA 通道对应的外设

不同stm32f103芯片内部外设资源

由表可知,芯片内部的外设资源除了跟stm32f103后面的第一个字母有关外,还和flash的大小有关。上面的表中只有一部分,具体的可以参考Keil的芯片型号选择部分。下面是stm32f103c8t6的资源:  TIM1_BRK_IRQn               = 24,       TIM1_UP_IRQn                = 25,      
发表于 2019-07-19
不同stm32f103芯片内部外设资源

一种可行的STM32F103外设RTC使用方法

前言最近做的项目需要用RTC功能,记录掉上电时间。然后就开始琢磨STM32的RTC,在使用的过程中出现各种问题。搞的很是头痛。几经折腾,终于弄出一种稳定的使用方法。刚开始最大的问题就是掉电后时钟不走,代码改来该去,最后发现不管是第一次初始化还是每次上电运行,都需要打开PWR和BKP时钟。下面就把我的代码全贴出来,可以直接调用。代码#ifndef BSP_RTC_H#define BSP_RTC_H#include "stm32f10x.h"#include <time.h>//BCD码表示时间typedef struct systemtime_tag{    unsigned
发表于 2019-07-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved