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

news2024/10/3 8:18:35

目录

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

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 <stdbool.h>
#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 ****/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas数据分析总结

Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。其中DataFrame&#xff0c;Json&#xff0c;数据筛选的使用频次很高&#xff0c;值得重点将基本用法学习并总结。 版本信息&#xff1a;python 3.7 pandas 1.3.5 一、DataFrame DataFrame 是一个表格型的数…

【持续更新】计算机类PDF整理

计算机相关的书籍太多太多了&#xff0c;整理太多反而很乱&#xff0c;这边我根据自己的经验和理解选了一些典型的书籍&#xff0c;大部分是自己看过觉得很有用的&#xff0c;有些是听说很nice的&#xff0c;有些是经典的&#xff0c;大家可以自行下载。 持续更新中&#xff0…

Kaggle竞赛——Titanic泰坦尼克之灾(0.76315==>0.79186)

Kaggle竞赛网址&#xff1a;https://www.kaggle.com/c/titanic 上一章&#xff1a;Kaggle竞赛——Titanic泰坦尼克之灾&#xff08;保姆级基础版&#xff09; 本次Kaggle泰坦尼克之灾分析过程大致分为&#xff1a; 第1步&#xff1a;了解数据&#xff08;上一章&#xff09; …

19_SpringBoot拓展注解@SpringBootApplication和@Configuration

文章目录Spring Boot拓展注解SpringBootApplication和Configuration0x01_SpringBootApplicationSpringBootConfigurationEnableAutoConfigurationComponentScan0x02_ConfigurationFull 全模式&#xff0c;Lite 轻量级模式Spring Boot拓展注解SpringBootApplication和Configurat…

计算机网络原理 课后习题(作业)持续更新ing

【1-03 】试从多个方面比较电路交换、报文交换和分组交换的主要优缺点 &#xff08;1&#xff09;电路交换的主要特点: ①电路交换三个阶段&#xff1a;建立连接、通信、释放连接&#xff1b; ②在整个通信过程中&#xff0c;通信的双方自始至终占用着所使用的物理信道。 由…

多线程知识笔记(五)_单例模式

文章目录1、什么是单例模式2、饿汉模式3、懒汉模式1、什么是单例模式 单例模式是一种设计模式。 什么是设计模式呢&#xff1f;设计模式就是一种模板&#xff0c;就像做饭的时候&#xff0c;新手做饭什么调料都是一把放进锅里&#xff0c;有的菜就讲究调料的先后顺序&#xff…

Java web 2022跟学尚硅谷(十一) Vue基础和Axios基础和json基础

Java web 2022跟学尚硅谷十一后端基础 书城Vue在js中定义对象的2种方式方式一方式二简单的Vue代码绑定元素的属性方式一 v-bind:value方式二 :value双向数据绑定 v-model:方式一方式二 :value可以省略&#xff0c;trim去除首尾空格条件渲染 v-if条件渲染 v-else条件渲染 特别注…

[附源码]Python计算机毕业设计高校医务管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

极地土活性层和永久冻土的比较宏基因组学

北极地区有大约87%由低有机碳矿物土壤组成&#xff0c;但对低碳永久冻土&#xff08;PF&#xff09;和活性层&#xff08;AL&#xff09;土壤中微生物活性的了解仍然有限。多种物理和生物因素可能影响碳循环&#xff0c;包括土壤化学、氮等养分的可用性以及现有微生物群落的结构…

论文解析[9] Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

发表时间&#xff1a;2021 论文地址&#xff1a;https://arxiv.org/abs/2103.14030 代码地址&#xff1a;https://github.com/microsoft/Swin-Transformer 文章目录摘要3 方法3.1 总体框架3.2 基于自注意力的移动窗口3.3 结构变形5 结论摘要 这篇论文提出了一个新的ViT叫作Swi…

大数据培训kettle安装部署

kettle安装部署和使用 2.1 kettle安装地址 官网地址 https://community.hitachivantara.com/docs/DOC-1009855 下载地址 https://sourceforge.net/projects/pentaho/files/Data%20Integration/ 2.2 Windows下安装使用 2.2.1 概述 在实际企业开发中&#xff0c;都是在本…

Html 小功能总结二

文章目录一、Html 实现弹窗的实例二、Html 实现流程图三、制作一个简单的菜单功能一、Html 实现弹窗的实例 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><style type"text/css">body…

C++ Reference: Standard C++ Library reference: Containers: map: map: crbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/crbegin/ 公有成员函数 <map> std::map::crbegin const_reverse_iterator crbegin() const noexcept;返回指向反向开始的const_reverse_iterator 返回一个指向容器中最后一个元素的const_reverse_ite…

Nacos 消息通知系统 源码讲解

目录 1. 介绍 2. Nacos 中的生产者 3. Nacos 中的消费者 4. Nacos 中的事件 5. 统一事件通知中心 NotifyCenter 6. 总结 1. 介绍 Nacos 节点内部使用了大量的事件机制进行通信&#xff0c;这样各种操作进行了解耦&#xff0c;提高了性能。 接下来就介绍。 所谓事件机制…

virtualenv系列 (5) · 打通virtualenvwrapper和PyCharm/IntelliJ IDEA的虚拟环境

PyCharm/IntelliJ IDEA已经内置了对virtualenv的支持&#xff0c;当我们为一个项目创建一个新的Python SDK时&#xff0c;就会进入到Add Python Interpreter对话框&#xff0c;选择Virtualenv Environment -> New environment就将创建一套新的virtualenv环境。这里&#xff…

关于长三角某高校能效管理平台应用成效探讨

更多请关注&#xff1a;安科瑞电气网 摘要&#xff1a; 随着现代科学技术的发展&#xff0c;在高校中开始广泛应用智能化技术&#xff0c;改善学生宿舍的用电管理模式&#xff0c;提高宿舍的管理水平&#xff0c;有利于实现高校宿舍用电管理的科学化。本文主要阐述传统高校宿…

D2. Seating Arrangements (hard version)(贪心+排序)

Problem - 1566D2 - Codeforces 这是该问题的困难版本。唯一的区别是&#xff0c;在这个版本中&#xff0c;1≤n≤300。 电影院的座位可以表示为有n行和m列的表格。每行的座位都用1到n的整数编号&#xff0c;从左到右连续编号&#xff1a;在第k行&#xff0c;从m(k-1)1到mk&am…

前端的视角聊聊如何快速入门Python

对于 NodeJs 开发的小伙伴&#xff0c;使用 node-gyp 将 C 模块转换成 NodeJs 的 addon 插件时会依赖 Python 的安装环境&#xff08;针对使用了 nvm 等版本管理工具的情况&#xff09;。对于前端小伙伴来说&#xff0c;Python 本身确实不是一个必须学习的语言&#xff0c;但也…

提前做好网络安全分析,运维真轻松(一)

背景 某汽车总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。汽车配件电子图册系统是某汽车集团的重要业务系统。本次分析重点针对汽车配件电子图册系统进行预见性分析&#xff0c;以供安全取证、性能分析、网络质量监测以及深层网络分析…

SQL基础——聚合与排序

聚合与排序前言思维导图聚合函数示例表3-1![在这里插入图片描述](https://img-blog.csdnimg.cn/9c286053f87a4ae882bece8128bdcab5.png)计算表中数据的行数 COUNT函数示例代码3.1 计算全部数据的行数执行结果计算NULL之外的数据的行数代码示例3.2 计算NULL之外的数据行数执行结…