历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2019年10月08日 | stm32HAL库之can操作

2019-10-08 来源:eefocus

基于STM32CubeMx的CAN配置信息

volatile

1.系统时钟APB1=36MHZ

2.CAN计算通信率计算公式,参考数据手册, CAN bit timing register (CAN_BTR) 寄存器


NominalBitTime计算公式: NominalBitTime =1 t × q +  tBS1 + tBS2

3.STM32CubeMx设置的Prescaler为8->对应BRP=7,TimeSeg1=6->对应TS1=5,TimeSeg2=2->对应TB2=2,STM32F103ZE对应APB1设置为36M,即Time for one Bit的时间为(1 + TimeSeg1+ TimeSeg2)* Prescaler/36M,--->(1+6+2)*8/36M=2us,即2000ns,500K bps

4.CAN.c

 


/**

  ******************************************************************************

  * File Name          : CAN.c

  * Description        : This file provides code for the configuration

  *                      of the CAN instances.

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2019 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

 

/* Includes ------------------------------------------------------------------*/

#include "can.h"

 

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

CAN_HandleTypeDef hcan;

 

CAN_TxHeaderTypeDef   TxHeader;

CAN_RxHeaderTypeDef   RxHeader;

uint8_t               TxData[8];

uint8_t               RxData[8];

uint32_t              TxMailbox;

/* CAN init function */

void MX_CAN_Init(void)

{

CAN_FilterTypeDef  sFilterConfig;

  hcan.Instance = CAN1;

  hcan.Init.Prescaler = 8;

  hcan.Init.Mode = CAN_MODE_NORMAL;

  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;

  hcan.Init.TimeSeg1 = CAN_BS1_6TQ;

  hcan.Init.TimeSeg2 = CAN_BS2_2TQ;

  hcan.Init.TimeTriggeredMode = DISABLE;

  hcan.Init.AutoBusOff = DISABLE;

  hcan.Init.AutoWakeUp = DISABLE;

  hcan.Init.AutoRetransmission = DISABLE;

  hcan.Init.ReceiveFifoLocked = ENABLE;

  hcan.Init.TransmitFifoPriority = ENABLE;

  if (HAL_CAN_Init(&hcan) != HAL_OK)

  {

    Error_Handler();

  }

  /* Configure the CAN Filter */

  sFilterConfig.FilterBank = 0;

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

  sFilterConfig.FilterIdHigh = 0x0000;

  sFilterConfig.FilterIdLow = 0x0000;

  sFilterConfig.FilterMaskIdHigh = 0x0000;

  sFilterConfig.FilterMaskIdLow = 0x0000;

  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

  sFilterConfig.FilterActivation = ENABLE;

  sFilterConfig.SlaveStartFilterBank = 14;

 

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)

  {

    /* Filter configuration Error */

    Error_Handler();

  }

 

  /* Start the CAN peripheral */

  if (HAL_CAN_Start(&hcan) != HAL_OK)

  {

    /* Start Error */

    Error_Handler();

  }

 

  /* Activate CAN RX notification */

  if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)

  {

    /* Notification Error */

    Error_Handler();

  }

  /* Activate CAN TX notification */

  if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)

  {

    /* Notification Error */

    Error_Handler();

  }

  /* Configure Transmission process */

  TxHeader.StdId = 0x321;

  TxHeader.ExtId = 0x01;

  TxHeader.RTR = CAN_RTR_DATA;

  TxHeader.IDE = CAN_ID_STD;

  TxHeader.DLC = 8;

  TxHeader.TransmitGlobalTime = DISABLE;

}

 

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)

{

 

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(canHandle->Instance==CAN1)

  {

  /* USER CODE BEGIN CAN1_MspInit 0 */

 

  /* USER CODE END CAN1_MspInit 0 */

    /* CAN1 clock enable */

    __HAL_RCC_CAN1_CLK_ENABLE();

  

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**CAN GPIO Configuration    

    PA11     ------> CAN_RX

    PA12     ------> CAN_TX 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_11;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

    GPIO_InitStruct.Pin = GPIO_PIN_12;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

    /* CAN1 interrupt Init */

    HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 7, 0);

    HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);

  /* USER CODE BEGIN CAN1_MspInit 1 */

    HAL_NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, 5, 0);

    HAL_NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn);

  /* USER CODE END CAN1_MspInit 1 */

  }

}

 

void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle)

{

 

  if(canHandle->Instance==CAN1)

  {

  /* USER CODE BEGIN CAN1_MspDeInit 0 */

 

  /* USER CODE END CAN1_MspDeInit 0 */

    /* Peripheral clock disable */

    __HAL_RCC_CAN1_CLK_DISABLE();

  

    /**CAN GPIO Configuration    

    PA11     ------> CAN_RX

    PA12     ------> CAN_TX 

    */

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);

 

    /* CAN1 interrupt Deinit */

    HAL_NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);

  /* USER CODE BEGIN CAN1_MspDeInit 1 */

 

  /* USER CODE END CAN1_MspDeInit 1 */

  }

 

/* USER CODE BEGIN 1 */

 

void USER_CAN_Send()

{

HAL_Delay(1000);

HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);//开启中断

if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK)

{

/* Transmission request Error */

Error_Handler();

}

HAL_Delay(100);

TxData[0]++;

}

/**

  * @brief  Rx Fifo 0 message pending callback in non blocking mode

  * @param  CanHandle: pointer to a CAN_HandleTypeDef structure that contains

  *         the configuration information for the specified CAN.

  * @retval None

  */

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle)

{

  /* Get RX message */

  if (HAL_CAN_GetRxMessage(CanHandle, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)

  {

    /* Reception Error */

    Error_Handler();

  }

 

  /* Display LEDx */

  if ((RxHeader.StdId == 0x321) && (RxHeader.IDE == CAN_ID_STD) && (RxHeader.DLC == 2))

  {

RxData[0] = RxData[0];

  }

}

/* USER CODE END 1 */

 

/**

  * @brief  Transmission Mailbox 0 complete callback.

  * @param  hcan pointer to a CAN_HandleTypeDef structure that contains

  *         the configuration information for the specified CAN.

  * @retval None

  */

void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)

{

static uint8_t num = 0;

  /* Prevent unused argument(s) compilation warning */

  UNUSED(hcan);

 

  /* NOTE : This function Should not be modified, when the callback is needed,

            the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the

            user file

   */

/* if() 数据 要到 */

HAL_CAN_DeactivateNotification(hcan, CAN_IT_TX_MAILBOX_EMPTY);

HAL_CAN_AddTxMessage(hcan, &TxHeader, TxData, &TxMailbox);

TxData[1] = TxData[1]+ 1;

}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

can.h


/**

  ******************************************************************************

  * File Name          : CAN.h

  * Description        : This file provides code for the configuration

  *                      of the CAN instances.

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2019 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __can_H

#define __can_H

#ifdef __cplusplus

 extern "C" {

#endif

 

/* Includes ------------------------------------------------------------------*/

#include "main.h"

 

/* USER CODE BEGIN Includes */

 

/* USER CODE END Includes */

 

extern CAN_HandleTypeDef hcan;

extern CAN_TxHeaderTypeDef   TxHeader;

extern CAN_RxHeaderTypeDef   RxHeader;

extern uint8_t               TxData[8];

extern uint8_t               RxData[8];

推荐阅读

史海拾趣

DAQ Electronics LLC公司的发展小趣事

随着技术的不断成熟和产品线的丰富,DAQ Electronics LLC公司开始积极拓展市场。公司通过与科研机构、高校以及企业建立合作关系,将数据采集技术应用于更多领域。在科学研究领域,DAQ Electronics LLC公司的数据采集设备为实验数据的准确获取提供了有力保障;在工业生产领域,其设备则帮助企业实现了对生产过程的实时监控和数据分析。

Engineered Components Co公司的发展小趣事

为了确保产品质量和客户满意度,ECC建立了完善的质量管理体系。他们从原材料采购到生产、检测、包装等各个环节都制定了严格的质量标准。ECC还引入了先进的质量检测设备和方法,确保每一件产品都符合高标准的质量要求。此外,ECC还定期对员工进行质量培训,提高员工的质量意识和操作技能。这些措施使得ECC的产品在市场上赢得了良好的口碑和信誉。

ACCRETECH公司的发展小趣事

Engineered Components Co(ECC)公司成立于XXXX年,由几位在电子制造领域有丰富经验的工程师共同创立。他们看到了电子行业中对于高质量、高精度电子元件的迫切需求,因此决定专注于此领域。ECC在创立初期就确立了以客户需求为导向,以技术创新为驱动的发展战略。他们通过自主研发,生产出了第一批高精度电子连接器,并在市场上获得了良好的反响。

Defense Supply Center Columbus公司的发展小趣事

Defense Supply Center Columbus公司自成立之初,就深知技术创新对于电子行业的重要性。公司投入大量资源,建立起一支专业的研发团队,专注于研发先进的军事电子设备和系统。通过不断的技术创新,公司成功开发出了一系列高性能、高可靠性的军事电子产品,为国防事业做出了重要贡献。这些产品的成功推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。

ADI(亚德诺半导体)公司的发展小趣事

在电子行业,供应链管理对于企业的运营效率至关重要。Defense Supply Center Columbus公司深知这一点,不断优化供应链管理流程。公司建立起一套高效的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营效率得到了显著提升,降低了运营成本,提高了企业的竞争力。

Andigilog公司的发展小趣事

在电子行业,人才是企业最宝贵的财富。Defense Supply Center Columbus公司高度重视人才战略的实施。公司积极引进和培养各类人才,建立起一支高素质、专业化的团队。公司注重员工的培训和发展,为员工提供良好的工作环境和职业发展机会。同时,公司还建立了完善的激励机制和绩效考核体系,激发员工的工作积极性和创造力。这些人才战略的实施,为公司的发展提供了有力的人才保障和智力支持。

请注意,以上故事均为虚构内容,旨在展示Defense Supply Center Columbus公司可能的发展路径和故事框架。实际情况可能因公司具体情况和市场环境而有所不同。

问答坊 | AI 解惑

索尼研发无线供电的目的是什么?

索尼试制了不用电源线即可驱动电视机等电子产品的“无线供电系统”。这种技术通过磁场共振传输电力,可向距离50cm~80cm的电子产品传输60W的电力。供受电设备间的送电效率为80%,加上电源整流电路等,系统整体效率维持在了60%。笔者日前采访了参 ...…

查看全部问答>

evc4.0能开发wince5.0的程序么--急!

evc4.0能开发运行在wince5.0的程序么? 对于bin文件有什么要求么? 还是有其他别的注意事项啊? 原来运行在wince4.2上正常的程序,到wince5.0就不是有效的wince程序了是什么问题, 详细介绍最好啊!!!…

查看全部问答>

春节后,开始找工作

我在深圳,大家有没有好的推荐? 顶者有分噢!…

查看全部问答>

初学者问题

刚学单片机,在仿真时,出现connection to target lost是什么原因? 还有个问题,在eeworld上传图片时,提示出现不明错误,无法上传,本来有图片的话,能把问题描述的更清楚些。…

查看全部问答>

为什么用vs2005还是EVC4SP4编译刚建好的例子时总提示要连接ActiveSync呢?

为什么用vs2005还是EVC4SP4编译刚建好的例子时总提示要连接ActiveSync呢? 环境是WINCE5 ,ActiveSync装的版本是4.2中文版. 是不是调试的时候一定要插上硬件呢?不插上可以调试WINCE5平台下开发的程序吗? EVC4下的错误提示是: An application ...…

查看全部问答>

求用最小系板和DS18B20来测量温度并在12864液晶上显示

 各位玩MSP430的大大们,求助啦~! 想用MSP430最小系统版和DS18B20来测量温度,且在12864LCD液晶上面显现出数据来! 可不可以帮忙写下代码啊! 急用啊! 下面的CX-1A系统版的原理图 小弟感激不尽! [ 本帖最后由 z9 ...…

查看全部问答>

处理一批2.4寸TFT屏,每人限购10PCS,有美女,有送!

2.4寸TFT屏,带触摸屏,ILI9320驱动!引脚定义如下图: 前天 12:21 上传下载附件 (146.79 KB) 屏的图片如下: 前天 12:21 上传下载附件 (73.57 KB) 前天 12:21 上传下载附件 (63.51 KB) 显示效果如下: ...…

查看全部问答>

说说解决EXP430G2与MSP430FR5xxx调试问题

这几天发现一件怪事,之前的EXP430G2不能下载程序了,找了一块板还是同样的问题。 ”Fatal error:failed to re-initalize Session aborte!\" 1.4打印的信息是: Sat Nov 03, 2012 19:20:19: Firmware version 30066536 Sat Nov 03, 2012 19:20 ...…

查看全部问答>

都说DSP,搞半天都不知道DSP是什么

谁都知道,DSP的意思是 数字信号处理器。但是仅此而已。 今天专门花了点时间,看了看DSP的一些介绍。 东西挺多,挑点足够扫盲的来说。 数字信号处理器说白了也是一种信号处理用的器件。 我们似乎更加熟悉 模拟信号处理。 比如模拟信号处理的核 ...…

查看全部问答>

Proteus 如何利用matlab 2013A CCS5.2 实现仿真调试

楼主 求解1  Proteus  的.hex文件不能用只能用cof文件        求解2  Proteus  DSP 16位的存储单元  为啥存储器寄存器区都是 8位一个单元        求 ...…

查看全部问答>