历史上的今天
今天是: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.
* 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.
* 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];
史海拾趣
|
索尼试制了不用电源线即可驱动电视机等电子产品的“无线供电系统”。这种技术通过磁场共振传输电力,可向距离50cm~80cm的电子产品传输60W的电力。供受电设备间的送电效率为80%,加上电源整流电路等,系统整体效率维持在了60%。笔者日前采访了参 ...… 查看全部问答> |
|
evc4.0能开发运行在wince5.0的程序么? 对于bin文件有什么要求么? 还是有其他别的注意事项啊? 原来运行在wince4.2上正常的程序,到wince5.0就不是有效的wince程序了是什么问题, 详细介绍最好啊!!!… 查看全部问答> |
|
为什么用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不能下载程序了,找了一块板还是同样的问题。 ”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的一些介绍。 东西挺多,挑点足够扫盲的来说。 数字信号处理器说白了也是一种信号处理用的器件。 我们似乎更加熟悉 模拟信号处理。 比如模拟信号处理的核 ...… 查看全部问答> |
|
Proteus 如何利用matlab 2013A CCS5.2 实现仿真调试 楼主 求解1 Proteus 的.hex文件不能用只能用cof文件 求解2 Proteus DSP 16位的存储单元 为啥存储器寄存器区都是 8位一个单元 求 ...… 查看全部问答> |




