42_CAN列表模式接收中断实验

目录

CAN结构体

CAN_InitTypeDef初始化结构体详解

发送及接收结构体: CanTxMsg及CanRxMsg详解

CAN_FilterlnitTypeDef筛选器结构体讲解

硬件连接图

实验源码


CAN结构体

从STM32的CAN外设我们了解到它的功能非常多,控制涉及的寄存器也非常丰富,而使用STM32标准库提供的各种结构体及库函数可以简化这些控制过程。跟其它外设一样, STM32标准库提供了CAN初始化结构体及初始化函数来控制CAN的工作方式,提供了收发报文使用的结构体及收发函数,还有配置控制筛选器模式及ID的结构体。

初始化结构体: CAN_InitTypeDef

发送及接收结构体: CanTxMsg及CanRxMsg

筛选器结构体: CAN_FilterlnitTypeDef

CAN_InitTypeDef初始化结构体详解

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的优先级来发送。

发送及接收结构体: CanTxMsg及CanRxMsg详解

发送结构体

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中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文。

CAN_FilterlnitTypeDef筛选器结构体讲解

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组成一组筛选器。

42_CAN列表模式接收中断实验_第1张图片

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)。

硬件连接图

42_CAN列表模式接收中断实验_第2张图片

实验源码:

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 ****/

42_CAN列表模式接收中断实验_第3张图片

你可能感兴趣的:(STM32单片机,单片机,stm32,嵌入式硬件)