目录
CAN结构体
CAN_InitTypeDef初始化结构体详解
发送及接收结构体: CanTxMsg及CanRxMsg详解
CAN_FilterlnitTypeDef筛选器结构体讲解
硬件连接图
实验源码
从STM32的CAN外设我们了解到它的功能非常多,控制涉及的寄存器也非常丰富,而使用STM32标准库提供的各种结构体及库函数可以简化这些控制过程。跟其它外设一样, STM32标准库提供了CAN初始化结构体及初始化函数来控制CAN的工作方式,提供了收发报文使用的结构体及收发函数,还有配置控制筛选器模式及ID的结构体。
初始化结构体: CAN_InitTypeDef
发送及接收结构体: CanTxMsg及CanRxMsg
筛选器结构体: CAN_FilterlnitTypeDef
typedef struct
{
uintl6_t CAN_Prescaler; /*配置CAN外设的时钟分频,可设置为1-1024*/
uint8 t CAN_Mode;/*配置CAN的工作模式,回环或正常模式*/
uint8 t CAN_SJW;/*配置SJW极限值*/
uint8 t CAN_BS1;/*配置BS1段长度*/
uint8 t CAN_BS2;/*配置BS2段长度*/
FunctionalState CAN_TTCM; /*是否使能TTCM 时间触发功能*/
FunctionalState CAN_ABOM; /*是否使能ABOM 自动离线管理功能*/
FunctionalState CAN_AWUM; /*是否使能 AWUM 自动唤醒功能 */
FunctionalState CAN_NART; /*是否使能 NART 自动重传功能*/
FunctionalState CAN_RFLM; /*是否使能 RFLM 锁定 FIFO 功能*/
FunctionalState CAN_TXFP; /*配置TXFP 报文优先级的判定方法*/
}CAN_InitTypeDef;
配置完这些结构体成员后,调用库函数CAN_Init即可把这些参数写入到CAN控制寄存器中,实现CAN的初始化。
CAN_Prescaler
本成员设置CAN外设的时钟分频,它可控制时间片Tq的时间长度,这里设置的值最终会减1后再写入BRP寄存器位,即前面介绍的Tq计算公式,其中的PCLK指APB1时钟,默认值为36MHz:
等效于Tq=CAN_Prescaler* (1/36M)
CAN_Mode
本成员设置CAN的工作模式,可设置为
正常模式(CAN_Mode_Normal)
回环模式(CAN_Mode_LoopBack)
静默模式(CAN_Mode_Silent)
回环静默模式(CAN_Mode_Silent_LoopBack)
CAN_SJW
本成员可以配置SJW的极限长度,即CAN重新同步时单次可增加或缩短的最大长度,它可以被配置为1-4Tq(CAN_SJW_1/2/3/4tq)。
CAN_BS1
本成员用于设置CAN位时序中的BS1段的长度,它可以被配置为1-16个Tq长度(CAN_BS1_1/2/3...16tq)。
CAN_BS2
本成员用于设置CAN位时序中的BS2段的长度,它可以被配置为1-8个Tq长度(CAN_BS2_1/2/3...8tq)。SYNC_SEG、BS1段及BS2段的长度加起来即一个数据位的长度,即前面介绍的原来计算式:
CAN_TTCM
本成员用于设置是否使用时间触发功能(ENABLE/DISABLE),时间触发功能在某些CAN标准中会使用到。
CAN_ABOM
本成员用于设置是否使用自动离线管理(ENABLE/DISABLE),使用自动离线管理可以在节点出错离线后适时自动恢复,不需要软件干预。
CAN_AWUM
本成员用于设置是否使用自动唤醒功能(ENABLE/DISABLE),使能自动唤醒功能后它会在监测到总线活动后自动唤醒。
CAN_NART
本成员用于设置是否使用自动重传功能(ENABLE/DISABLE),使用自动重传功能时,会一直发送报文直到成功为止。
CAN_RFLM
本成员用于设置是否使用锁定接收FIFO(ENABLE/DISABLE),锁定接收FIFO后,若FIFO溢出时会丢弃新数据,否则在FIFO溢出时以新数据覆盖旧数据。
CAN_TXFP
本成员用于设置发送报文的优先级判定方法(ENABLE/DISABLE),使能时,以报文存入发送邮箱的先后顺序来发送,否则按照报文ID的优先级来发送。
发送结构体
typedef struct
{
uint32_t StdId; /*存储报文的标准标识符11位, 0-0x7FF*/
uint32_t ExtId; /*存储报文的扩展标识符29位, 0-0x1FFFFFFF */
uint8 t IDE;/*存储IDE扩展标志*/
uint8 t RTR;/*存储RTR远程顿标志*/
uint8_t DLC; /*存储报文数据段的长度, 0-8 */
uint8_t Data [8]; /*存储报文数据段的内容*/
}CanTxMsg;
Stdld
本成员存储的是报文的11位标准标识符,范围是0-0x7FF。
Extld
本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。Extld与Stdld这两个成员根据下面的IDE位配置,只有一个是有效的。
IDE
本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用Stdld成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用Extld成员存储报文ID。
RTR
本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控顿时,下面的Data[8]成员的内容是无效的。
DLC
本成员存储的是数据顿数据段的长度,它的值的范围是0-8,当报文是遥控帧时DLC值为0。
Data[8]
本成员存储的就是数据帧中数据段的数据。
接收结构体
typedef struct
{
uint32_t StdId; /*存储了报文的标准标识符11位, 0-0x7FF*/
uint32_t ExtId; /*存储了报文的扩展标识符29位, 0-0x1FFFFFFF*/
uint8_t IDE; /*存储了IDE扩展标志*/
uint8_t RTR;/*存储了RTR远程顿标志*/
uint8_t DLC; /*存储了报文数据段的长度, 0-8 */
uint8_t Data [8]: /*存储了报文数据段的内容*/
uint8_t FMI;/*存储了 本报文是由经过筛选器存储进FIFO的, 0-0xFF */
}CanRxMsg;
Stdld
本成员存储的是报文的11位标准标识符,范围是0-0x7FF。
Extld
本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。Extld与Stdld这两个成员根据下面的IDE位配置,只有一个是有效的。
IDE
本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用Stdld成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用Extld成员存储报文ID。
RTR
本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控顿时,下面的Data[8]成员的内容是无效的。
DLC
本成员存储的是数据顿数据段的长度,它的值的范围是0-8,当报文是遥控帧时DLC值为0。
Data[8]
本成员存储的就是数据帧中数据段的数据。
FMI
本成员只存在于接收结构体,它存储了筛选器的编号,表示本报文是经过哪个筛选器存储进接收FIFO的,可以用它简化软件处理。
当需要使用CAN发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数CAN_Transmit把这些内容写入到发送邮箱即可把报文发送出去。
接收报文时,通过检测标志位获知接收FIFO的状态,若收到报文,可调用库函数6AN_Receive把接收FIFO中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文。
typedef struct
{
uint16 t CAN FilterIdHigh;/*CAN_FxR1寄存器的高16位*/
uint16 t CAN FilterIdLow;/*CAN FxR1寄存器的低16位*/
uintl6_t CAN_FilterMaskIdHigh;/*CAN_FxR2 寄存器的高16位*/
uintl6 t CAN FilterMaskIdLow;/*CAN FxR2寄存器的低16位*/
uint16_t CAN_FilterFIFOAssignment; /*设置经过筛选后数据存储到哪个接收FIFO*/
uint8_t CAN_FilterNymber;/*筛选器编号,范围0-27*/
uint8 t CAN FilterMode;/*筛选器模式*/
uint8_t CAN FilterScale;/*设置筛选器的尺度*/
FunctionalState CAN_FilterActivation; /*是否使能本筛选器* /
}CAN FilterInitTypeDef;
CAN_FilterldHigh
CAN_FilterldHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
CAN FilterldLow
类似地, CAN_FilterldLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
CAN_FilterMaskldHigh
CAN_FilterMaskldHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterldHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterldHigh成员对应的掩码,与CAN_FilterldLow组成一组筛选器。
CAN FilterMaskldLow
类似地, CAN_FilterMaskldLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterldLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN FilterldLow成员对应的掩码,与CAN FilterldLow组成一组筛选器。
CAN_FilterFIFOAssignment
本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
CAN FilterNumber
本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器, CAN共有28个筛选器,所以它的可输入参数范围为0-27。
CAN FilterMode
本成员用于设置筛选器的工作模式,可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。
CAN FilterScale
本成员用于设置筛选器的尺度,可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。
CAN FilterActivation
本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。
CAN1回环模式,过滤器列表模式,CAN接收中断。
/**
******************************************************************************
* @file : user_rcc_config.c
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Include 包含---------------------------------------------------------------*/
#include "user_rcc_config.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
/*!
\brief RCC配置
\param[in] none
\param[out] none
\retval none
*/
void Rcc_config(void)
{
/*使能GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/*使能UART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/*使能CAN1时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
}
/************************************************************** END OF FILE ****/
/**
******************************************************************************
* @file : user_gpio.c
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Include 包含---------------------------------------------------------------*/
#include "user_gpio.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
/*!
\brief GPIO初始化函数
\param[in] none
\param[out] none
\retval none
*/
void Gpio_Init(void)
{
/*GPIO结构体*/
GPIO_InitTypeDef GPIO_InitTypeDefstruct;
/*UART1发送引脚配置*/
GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用输出
GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_10MHz;
/*写入结构体到GPIOA*/
GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
/*UART1接收引脚配置*/
GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_10MHz;
/*写入结构体到GPIOA*/
GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
/*CAN1 发送引脚*/
GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_12;
GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
/*写入结构体到GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitTypeDefstruct);
/*CAN1 接收引脚*/
GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitTypeDefstruct);
/*写入结构体到GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitTypeDefstruct);
}
/************************************************************** END OF FILE ****/
/**
******************************************************************************
* @file : user_uart.c
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Include 包含---------------------------------------------------------------*/
#include "user_uart.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
extern uint16_t USART_RX_STA;
extern uint8_t USART_RX_BUF[200];
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
#if 1
#pragma import(__use_no_semihosting)
/*实现Printf代码*/
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
/*!
\brief UART1初始化
\param[in] none
\param[out] none
\retval none
*/
void Uart1_Init(u32 bound)
{
/*UART结构体*/
USART_InitTypeDef USART_InitTypeDefstruct;
/*UART结构体配置*/
USART_InitTypeDefstruct.USART_BaudRate = bound; //波特率
USART_InitTypeDefstruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //不使用硬件流
USART_InitTypeDefstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收使能
USART_InitTypeDefstruct.USART_Parity = USART_Parity_No; //不使用奇偶校验
USART_InitTypeDefstruct.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitTypeDefstruct.USART_WordLength = USART_WordLength_8b; //8个数据位
/*写入USART1*/
USART_Init(USART1,&USART_InitTypeDefstruct);
/*使能串口1*/
USART_Cmd(USART1,ENABLE);
}
/*!
\brief UART1中断服务函数
\param[in] none
\param[out] none
\retval none
*/
void USART1_IRQHandler(void)
{
}
/************************************************************** END OF FILE ****/
/**
******************************************************************************
* @file : user_can.h
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Define to prevent recursive incluson---------------------------------------*/
#ifndef _USER_CAN_H__
#define _USER_CAN_H__
/* Include 包含---------------------------------------------------------------*/
#include "stdio.h"
#include "stm32f10x.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/*这里注意不懂可以看看41篇博客里的过滤模式*/
#define ID_1 (0x1111<<3 | CAN_Id_Extended | CAN_RTR_Data)
#define ID_2 (0x2222<<3 | CAN_Id_Extended | CAN_RTR_Data)
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
void CAN1_Init(void);
void Can_ID_TX_0x00001111(void);
void Can_ID_TX_0x00002222(void);
void Can_ID_TX_0x00003333(void);
#endif
/************************************************************** END OF FILE ****/
/**
******************************************************************************
* @file : user_can.c
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Include 包含---------------------------------------------------------------*/
#include "user_can.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
/*!
\brief CAN1初始化函数
\param[in] none
\param[out] none
\retval none
*/
void CAN1_Init(void)
{
/*CAN初始化结构体*/
CAN_InitTypeDef CAN_InitStructure;
/*过滤器结构体*/
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/*中断控制器结构体*/
NVIC_InitTypeDef NVIC_InitStructure;
/*配置36M/((8+9+1)*4)=500Kbps*/
CAN_InitStructure.CAN_Prescaler = 4; /*配置CAN外设的时钟分频,可设置为1-1024*/
CAN_InitStructure.CAN_Mode =CAN_Mode_LoopBack; /*配置CAN的工作模式,回环模式*/
CAN_InitStructure.CAN_SJW =CAN_SJW_1tq; /*配置SJW极限值为1*/
CAN_InitStructure.CAN_BS1 =CAN_BS1_9tq; /*配置BS1段长度*/
CAN_InitStructure.CAN_BS2 =CAN_BS2_8tq; /*配置BS2段长度*/
CAN_InitStructure.CAN_TTCM =DISABLE; /*不使能TTCM 时间触发功能*/
CAN_InitStructure.CAN_ABOM =DISABLE; /*不使能ABOM 自动离线管理功能*/
CAN_InitStructure.CAN_AWUM =DISABLE; /*不使能 AWUM 自动唤醒功能 */
CAN_InitStructure.CAN_NART =DISABLE; /*不使能 NART 自动重传功能*/
CAN_InitStructure.CAN_RFLM =DISABLE; /*不使能 RFLM 锁定 FIFO 功能*/
CAN_InitStructure.CAN_TXFP =DISABLE; /*不配置TXFP 报文优先级的判定方法*/
/*初始化CAN1*/
CAN_Init(CAN1, &CAN_InitStructure);
/*只接受扩展帧ID_1和ID_2*/
CAN_FilterInitStructure.CAN_FilterIdHigh = (ID_1 & 0xFFFF0000)>>16; /*CAN_FxR1寄存器的高16位*/
CAN_FilterInitStructure.CAN_FilterIdLow = (ID_1 & 0xFFFF); /*CAN FxR1寄存器的低16位*/
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID_2 & 0xFFFF0000)>>16; /*CAN_FxR2 寄存器的高16位*/
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID_2 & 0xFFFF); /*CAN FxR2寄存器的低16位*/
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; /*设置经过筛选后数据存储到接收FIFO1*/
CAN_FilterInitStructure.CAN_FilterNumber = 0; /*筛选器编号0*/
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; /*列表模式*/
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; /*使用32位*/
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; /*使能过滤器*/
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
/*使能FIF00消息挂号中断*/
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*!
\brief CAN1中断服务函数
\param[in] none
\param[out] none
\retval none
*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
/*CAN接收结构体*/
CanRxMsg RxMessage;
/*接收数据*/
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
/*提示*/
printf("ID:%x 数据长度:%x 数据内容:%x\r\n",RxMessage.ExtId,RxMessage.DLC,RxMessage.Data[0]);
}
/*!
\brief 发送扩展帧0x000F1111
\param[in] none
\param[in] none
\retval none
*/
void Can_ID_TX_0x00001111(void)
{
/*CAN发送结构体*/
CanTxMsg TxMessage;
TxMessage.StdId = 0x00; /*标准帧ID*/
TxMessage.ExtId = 0x1111; /*扩展帧ID*/
TxMessage.IDE = CAN_Id_Extended; /*扩展帧*/
TxMessage.RTR = CAN_RTR_Data; /*数据帧*/
TxMessage.DLC = 1; /*要发送的数据长度*/
TxMessage.Data[0] = 0x11; /*要发送的数据*/
CAN_Transmit(CAN1, &TxMessage); /*发送数据*/
}
/*!
\brief 发送扩展帧0x000F2222
\param[in] none
\param[in] none
\retval none
*/
void Can_ID_TX_0x00002222(void)
{
/*CAN发送结构体*/
CanTxMsg TxMessage;
TxMessage.StdId = 0x00; /*标准帧ID*/
TxMessage.ExtId = 0x2222; /*扩展帧ID*/
TxMessage.IDE = CAN_Id_Extended; /*扩展帧*/
TxMessage.RTR = CAN_RTR_Data; /*数据帧*/
TxMessage.DLC = 1; /*要发送的数据长度*/
TxMessage.Data[0] = 0x22; /*要发送的数据*/
CAN_Transmit(CAN1, &TxMessage); /*发送数据*/
}
/*!
\brief 发送扩展帧0x000F3333
\param[in] none
\param[in] none
\retval none
*/
void Can_ID_TX_0x00003333(void)
{
/*CAN发送结构体*/
CanTxMsg TxMessage;
TxMessage.StdId = 0x00; /*标准帧ID*/
TxMessage.ExtId = 0x3333; /*扩展帧ID*/
TxMessage.IDE = CAN_Id_Standard; /*扩展帧*/
TxMessage.RTR = CAN_RTR_Data; /*数据帧*/
TxMessage.DLC = 1; /*要发送的数据长度*/
TxMessage.Data[0] = 0x33; /*要发送的数据*/
CAN_Transmit(CAN1, &TxMessage); /*发送数据*/
}
/************************************************************** END OF FILE ****/
/**
******************************************************************************
* @file : user_mian.h
* @brief : V1.00
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "user_can.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*/
int main(void)
{
/*配置系统中断分组为2位抢占2位响应*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*延时函数初始化*/
delay_init();
/*RCC配置*/
Rcc_config();
/*GPIO初始化*/
Gpio_Init();
/*USART1初始化*/
Uart1_Init(9600);
/*初始化CAN1*/
CAN1_Init();
/*死循环*/
while(1){
/*发送数据*/
Can_ID_TX_0x00001111();
delay_ms(1000);
Can_ID_TX_0x00002222();
delay_ms(1000);
/*实际会发,但是被过滤掉了*/
Can_ID_TX_0x00003333();
delay_ms(1000);
}
}
/************************************************************** END OF FILE ****/