基于CubeMX HAL库CAN的配置

发布者:dadigt最新更新时间:2019-03-25 来源: eefocus关键字: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<

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

 

 

  }

 

}



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

关键字:CubeMX  HAL库CAN 引用地址:基于CubeMX HAL库CAN的配置

上一篇:STM32的CubeMX关于串口中断
下一篇:STM32CubeMX stm32F4 CAN 使用步骤

推荐阅读最新更新时间:2024-03-16 16:26

STM32CubeMX串口接收数据(DMA方式,HAL库
使用DMA方式可以减轻CPU负担,此例子相关配置可以参考 STM32CubeMX串口接收数据(中断方式,HAL库) (1)设置USART1中断,NVIC配置如下图 (2)设置USART1的DMA,如下图 注意:要将RX的模式设置为circular ,否则只能接收一次,如果这里不作设置,网上也有 其他方法 介绍代码实现多次接收的,但既然用到了STM32CubeMX就尽量发挥最大作用吧! (3)生成项目工程 (4)在main.c里设置变量以及启动DMA接收 /* USER CODE BEGIN PV */ /* Private variables ------------------------------------
[单片机]
STM32<font color='red'>CubeMX</font>串口接收数据(DMA方式,<font color='red'>HAL库</font>)
STM32CubeMX按键输入
1、新建工程 2、选择目标芯片 3、设置按键和LED引脚 4、配置时钟树 5、配置引脚功能 6、配置生成的代码和选择编译工具 7、打开生成的工程,编译 8、添加下面的代码 /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(!HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)){ //读取KEY按键引脚,低电平表示按下 HAL_GPIO_TogglePin(LE
[单片机]
STM32<font color='red'>CubeMX</font>按键输入
STM32CubeMX系列教程8:数模转换(DAC)
1.DAC单次转换 本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。PA5管脚配置为DAC输出通道2。 DAC配置为默认配置不需修改。 生成报告以及代码,编译程序。在adc.c文件中可以看到ADC初始化函数。在stm32f7xx_hal_dac.h头文件中可以看到DAC的操作函数。 01 /** @addtogroup DAC_Exported_Functions_Group2 02 * @{ 03 */ 04 /* I/O operation functions *****
[单片机]
STM32<font color='red'>CubeMX</font>系列教程8:数模转换(DAC)
让菜鸟秒变stm32高手的STM32CubeMX
菜鸟到高手,显得有些霸气哈,不过的确如此,官方带给我们一个比较实用的stm32的工具。这个工具就是STM32CubeMX,昨天玩freeRTOS的时候就提到过。说到freeRTOS,这里就多说两句。全局变量,在任务间相互访问的时候也是需要临界保护的,不然可能会出现奇怪的问题。不过我们可以关掉时间片调度,任务间可以访问全局变量而不用加保护(不等于菜鸟可以随意代码)。关闭了时间片调度,只有发生vTaskDelay的时候才会上下文切换。只要代码合理访问全局变量可以不加保护的。因此代码也不是可以任意书写的,关于freeRTOS的问题,多看看源码,一切都会有答案。源码较少,这里就不过多介绍。关闭时间片不是网上说的configUSE_TIME
[单片机]
让菜鸟秒变stm32高手的STM32<font color='red'>CubeMX</font>
STM32CubeMX系列 | SD卡
1. SD卡介绍 1.1 SD卡简介 很多单片机系统都需要大容量存储设备,以存储数据(常用的有U盘、FLASH芯片、SD卡等),比较而言SD卡是单片机大容量外部存储的首选,只需要少数几个IO口即可外扩一个容量从几十M到几十G的,且有多种体积尺寸可选(标准SD卡、TF卡等)的外部存储器 SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。 SD卡按容量分类,可以分为3类:SD卡
[单片机]
一知半解学CubeMX——UART:Printf实现
一知半解学习环境: 1、CubeMX 4.23.0 2、uVision 5.14.2 3、MCU 启明 STM32F407 开发板(高配版) V3.1 一知半解学习目标: 1、掌握CubeMX下RCC以及SYS的相关配置; 2、掌握CubeMX下串口配置; 3、掌握Printf的实现套路; 一知半解实现过程: 1、配置系统调试接口及时基时钟源; 2、配置外部高速时钟源; 3、根据原理图配置对应串口(USART1); 4、配置时钟树; 5、配置串口参数,保持默认参数即可; 6、生成工程,并添加程序; 首先,打开工程,在usart.c文件的最后添加如下程序;
[单片机]
一知半解学<font color='red'>CubeMX</font>——UART:Printf实现
STM32CubeMX系列教程9:内部集成电路(I2C)
1.I2C总线简介 I2C(Inter-Integrated Circuit ,内部集成电路)总线是一种由飞利浦Philip公司开发的串行总线。是两条串行的总线,它由一根数据线(SDA)和一根 时钟线(SDL)组成。I2C总线上可以接多个I2C设备,每个器件都有一个唯一的地址识别。同一时间只能有一个主设备,其他为从设备。通常MCU作为主设备控制,外设作为从设备。 2.I2C硬件电路 I2C总线为漏极开路结构(OD),因此它们必须接有上拉电阻,阻值常为 4k7 或 10k ;当总线空闲时,两根线均为高电平。OD门与其它任意数量的OD与OC门成 线与 关系,即当总线上的任一器件输出的低电平,都将使总线的信号变低。
[单片机]
STM32<font color='red'>CubeMX</font>系列教程9:内部集成电路(I2C)
STM32双缓冲机制初始化(使用STM32CubeMX
1.使用STM32CubeMX配置的串口引脚设置和dma的设置会生成在usart.c。 1)如果DMA接收想采用循环缓冲区的方式,可以直接将RX-DMA设置成Circle方式,然后数据就会硬件上自动实现环形缓冲区的功能,省了不少时间。 2)DMA在采用Normal模式的时候,当一次任务完成后,DMA- DMA_BufferSize自动清零,并且DMA自动停止。如果想再次设置DMA的BufferSize的话,必须要进行如下操作: step1:DMA_CMD(DMAx_Channely,DISABLE); step2: 设置DMA_BufferLen step3:DMA_CMD(DMAx_Channely
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
502 Bad Gateway

502 Bad Gateway


openresty
设计资源 培训 开发板 精华推荐

502 Bad Gateway

502 Bad Gateway


openresty
何立民专栏 单片机及嵌入式宝典

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

502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
502 Bad Gateway

502 Bad Gateway


openresty