首页 > 其他分享 >初学STM32 CAN通信(三)

初学STM32 CAN通信(三)

时间:2024-03-23 13:44:24浏览次数:19  
标签:NVIC void 通信 STM32 RxMessage 初学 InitStruct GPIO CANx

1. stm32 CAN通信标准库函数

//CAN通信初始化函数
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct);
//筛选器初始化函数
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct);
//发送信息函数
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
//发送信息状态函数
uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);
//接收信息函数
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
//CAN通信中断使能函数
void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState);
//状态有关的函数
FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT);
void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT);

2. 利用标准库进行初始化

/*
	CAN_TX:PB_13
	CAN_RX:PB_12
*/
void CAN_Config(void)
{
	//定义初始化所需结构体变量
	CAN_InitTypeDef CAN_InitStruct;
	GPIO_InitTypeDef GPIO_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	//开启所用的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	//引脚复用
	GPIO_PinAFConfig(GPIOB,GPIO_Pin_13,GPIO_AF_CAN2);
	GPIO_PinAFConfig(GPIOB,GPIO_Pin_12,GPIO_AF_CAN2);
	//GPIO初始化
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速率
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	//CAN初始化
	CAN_InitStruct.CAN_ABOM=ENABLE;//是否使能ABOM自动离线管理功能
	CAN_InitStruct.CAN_AWUM=ENABLE;//是否使能AWUM自动唤醒功能
	CAN_InitStruct.CAN_NART=ENABLE;//是否使能NART自动重传功能
	CAN_InitStruct.CAN_RFLM=DISABLE;//是否使能RFLM锁定功能
	CAN_InitStruct.CAN_TTCM=DISABLE;//是否使能TTCM时间触发功能
	CAN_InitStruct.CAN_TXFP=DISABLE;//配置TXFP报文优先级的判定方法
	CAN_InitStruct.CAN_Mode=CAN_Mode_LoopBack;//回环模式
	CAN_InitStruct.CAN_Prescaler=6;//配置CAN外设的时钟分频,可设置1-1024
	CAN_InitStruct.CAN_SJW=CAN_SJW_2tq;//配置SJW极限值
	CAN_InitStruct.CAN_BS1=CAN_BS1_4tq;//配置BS1段长度
	CAN_InitStruct.CAN_BS2=CAN_BS2_2tq;//配置BS2段长度
	CAN_Init(CAN2,&CAN_InitStruct);
	//开启中断使能
	CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);
	//配置中断向量
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStruct.NVIC_IRQChannel=CAN2_RX0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStruct);
	
}

3. 筛选器初始化

void CAN_Filter(void)
{
	CAN_FilterInitTypeDef CAN_FilterInitStruct;
	
	CAN_FilterInitStruct.CAN_FilterNumber=14;//筛选器编号
	CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;//设置筛选器的尺度
	CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;//掩码模式
	CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//设置经过筛选后数据存储到那个接收器
	CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;//是否使能筛选器
	
	CAN_FilterInitStruct.CAN_FilterIdHigh=					  (((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0xFFFF0000);//CAN_FxR1寄存器的高16位
	CAN_FilterInitStruct.CAN_FilterIdLow=(((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0x0000FFFF);//CAN_FxR1寄存器的低16位
	CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;CAN_FxR2寄存器的高16位
	CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF;CAN_FxR2寄存器的低16位
	
	CAN_FilterInit(&CAN_FilterInitStruct);
}

4. 发送数据

uint8_t mail_box;
CanTxMsg TxMessage;

TxMessage.StdId=0;//标准格式为0 ,使用扩展格式
TxMessage.ExtId=0x1314;//使用扩展格式
TxMessage.IDE=CAN_Id_Extended;//配置使用标准格式还是扩展格式
TxMessage.RTR=CAN_RTR_Data;//配置是数据帧还是遥控帧
TxMessage.DLC=8;//发送的数据长度
for(i=0;i<8;i++)
{
    TxMessage.Data[i]=data[i];//存放数据
}
mail_box = CAN_Transmit(CAN2,&TxMessage);

5. 接收数据

//在终端中进行接收
void CAN2_RX0_IRQHandler(void)
{
	if(CAN_GetITStatus(CAN2,CAN_IT_FMP0)==SET)
	{
		CAN_Receive(CAN2, CAN_FIFO0,&RxMessage);
		printf("RxMessage.StdId:%x\r\n" ,RxMessage.StdId);
		printf("RxMessage.ExtId:%x\r\n" ,RxMessage.ExtId);
		printf("RxMessage.IDE:%x\r\n" 	,RxMessage.IDE);
		printf("RxMessage.RTR:%x\r\n"	,RxMessage.RTR);
		printf("RxMessage.DLC:%x\r\n"	,RxMessage.DLC);
		for(i=0;i<RxMessage.DLC;i++)
		{
			printf("RxMessage.Data[i]:%x\r\n",RxMessage.Data[i]);
		}
	}
}

标签:NVIC,void,通信,STM32,RxMessage,初学,InitStruct,GPIO,CANx
From: https://www.cnblogs.com/lyk-23/p/18091029

相关文章

  • STM32之HAL开发——启动文件详解【精华版】
    启动文件介绍启动文件是使用机器认识的汇编语言,由汇编编写,是系统上电复位后第一个执行的程序,经过一些必要的配置,最终能够调用main函数,使得用户程序能够在MCU上正常运行起来的必备文件。无论是是何种MCU,从简单的51,MSP430,到ARM9,ARM11,A7都必须有启动文件,因为对于嵌入式......
  • STM32之HAL开发——点灯大师
    点灯步骤注意:本次点灯操作分为俩种,一种为低级点灯——HAL库点灯,一种为高级高效点灯——寄存器点灯。引脚时钟开启__HAL_RCC_GPIOX_CLK_ENABLE()引脚初始化/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDefGPIO_InitStruct;/*选择要控制的GPIO......
  • STM32G431RBT6之定时器05
    以该框图为例: 选择引脚配置参数 80MHz变为100Hz的配置设置占空比 打开定时器 手动更改占空比voidkeyb2_3_func(){if(key[1].single_flag==1){pa6_duty+=10;if(pa6_duty>=100){pa6_duty=10;}......
  • 蓝桥杯嵌入式(STM32G431RBT6)——扩展板——IC采集频率(PUSL1、PUSL2)
    1.原理图2.Cubemx配置3.代码(1)timer.c#include"timer.h"unsignedintPUSL1_frq_T2CH2=0;unsignedintPUSL2_frq_T2CH3=0;uint32_tuwIC2Value1_T2CH2=0;//第一次捕获上升沿的时间uint32_tuwIC2Value2_T2CH2=0;//第二次捕获上升沿的时间uint32_tu......
  • STM32 RCC时钟设置
    前面几篇我讲了如何使用标准固件库来让STM32实现一些功能;但是想要实现各种功能前都必须要对单片机时钟源进行设置,时钟树:如果大家对这块不懂的话推荐大家看看【STM32】超清晰STM32时钟树动画讲解固件库函数代码编写ErrorStatusHSEStartUpStatus;RCC_DeInit();//RCC寄......
  • 【STM32+HAL库】---- 驱动DHT11温湿度传感器
    硬件开发板:STM32F407VET6软件平台:cubemax+keil+VScode1DHT11工作原理1.1简介DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿......
  • 初学STM32 CAN通信(二)
    初学STM32CAN通信(二)1.STM32的CAN外设​ STM32的芯片中具有bxCAN控制器(BasicExtendedCAN),它支持CAN协议2.0A和2.0B标准。​ 该CAN控制器支持最高的通讯速率为1Mb/s;可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文;外设中具有3个发送邮箱,发送报文的优先级可以使......
  • STM32G431RBT6按键模块04
    按键用法: 短按长按双击/三击按键电平变化:按下为0,弹起为1cubeMX中配置按键引脚并将其设置为上拉 设置定时器,时钟源,分频系数,重装载值 时钟源:InternalClock;Prescaler:79;CounterPeriod:9999; 这样的设置是10ms中断一次使能中断 interrupt.c&&inte......
  • 初学STM32 CAN通信(一)
    #初学STM32CAN通信(一)1.CAN协议简介​ CAN是控制器局域网络(ControllerAreaNetwork)的简称,是国际上应用最广泛的现场总线之一,近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。​ ......
  • STM32G431RBT6之LCD03
    导入三个文件lcd.c&&lcd.h&&fonts.h  初始化&&界面显示LCD_Init();LCD_Clear(Black);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);chartemp[20];LCD_DisplayStringLine(Line1,(u8)"DATA");spri......