173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

stm32can程序

keros@mark 2023-03-18 资讯中心

STM32 CAN接收/发送错误寄存器如何清零?

在STM32的CAN控制器中,接收错误计数器和发送错误计数器都是由CAN_ESR寄存器来控制的。要清零接收错误计数器和发送错误计数器,可以使用如下代码:

c

Copy code

CAN_HandleTypeDef hcan;

//清零发送错误计数器

hcan.Instance-ESR |= CAN_ESR_TEC;

//清零接收错误计数器

hcan.Instance-ESR |= CAN_ESR_REC;

其中,hcan是CAN控制器的句柄,CAN_ESR_TEC和CAN_ESR_REC分别表示发送错误计数器和接收错误计数器。

在清零之前,需要先确保CAN控制器已经停止了,可以使用如下代码停止CAN控制器:

c

Copy code

//停止CAN控制器

HAL_CAN_Stop(hcan);

需要注意的是,在CAN总线中,错误计数器是非常重要的参数,它可以反映CAN总线的质量和稳定性。因此,在清零错误计数器之前,应该先检查错误发生的原因,并采取措施来解决问题,以确保CAN总线的正常工作。

求基于stm32f103c8t6的can通信程序

ain() { unsigned int a; RCC_Configuration(); /*初始化 GPIOC时钟*/ // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); USART_Configuration(); Delay(10); CAN_configure(); // LedInit(); while(1) { //CAN_ClearFlag(CAN_FLAG_BOF); GPIO_SetBits(GPIOB,GPIO_Pin_7); Delay(10); GPIO_ResetBits(GPIOB,GPIO_Pin_7); Delay(10); GPIO_SetBits(GPIOB,GPIO_Pin_7); Delay(10); GPIO_ResetBits(GPIOB,GPIO_Pin_7); Delay(10); can_send(0x57); a=can_rev(); USART1_Putc(a); } } -------------------------------------------------------------------------------------------------- #include"stm32f10x_lib.h" void CAN_configure(void) { u8 wrong; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); /* Configure CAN pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, GPIO_InitStructure); /* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); /*can register int*/ CAN_DeInit(); CAN_StructInit(CAN_InitStructure); /*can cell init*/ CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; wrong=CAN_Init(CAN_InitStructure); while(wrong==CANINITFAILED){} /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//((u32)0x002021)16;//标识符 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//(((u32)0x002021)|CAN_ID_STD|CAN_RTR_DATA);// CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(CAN_FilterInitStructure); // CAN_ITConfig(CAN_IT_FMP0, ENABLE); } void can_send(unsigned char data) { CanTxMsg TxMessage; u8 TransmitMailbox = 0; TxMessage.StdId=0x0020;//标识符 TxMessage.RTR=CAN_RTR_DATA; TxMessage.IDE=CAN_ID_STD; TxMessage.DLC=2; TxMessage.Data[0]=data; TxMessage.Data[1]=0xFE; TransmitMailbox=CAN_Transmit(TxMessage); while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送 } unsigned char can_rev(void) { CanRxMsg RxMessage; RxMessage.StdId=0x11;//不需要设置 RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=2; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00; while (CAN_MessagePending(CAN_FIFO0)==0);//等到接收 CAN_Receive(CAN_FIFO0, RxMessage); CAN_FIFORelease(CAN_FIFO0); return RxMessage.Data[0]; } ------------------------------------------------------------------------------------------------- void RCC_Configuration(void) { //*** ErrorStatus HSEStartUpStatus; //*** //* system clocks configuration -----------------系统时钟配置-------------------/// //* RCC system reset(for debug purpose) // RCC_DeInit(); //将外设RCC寄存器重设为缺省值 //* Enable HSE * RCC_HSEConfig(RCC_HSE_ON); //开启外部高速晶振(HSE) //* Wait till HSE is ready / HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振 if(HSEStartUpStatus == SUCCESS) //若成功起振,(下面为系统总线时钟设置) { //* Enable Prefetch Buffer / FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存 //* Flash 2 wait state / FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值) //* HCLK = SYSCLK / RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟=72 MHz //* PCLK2 = HCLK/2 / RCC_PCLK2Config(RCC_HCLK_Div2); //设置APB1时钟=36 MHz(APB1时钟最大值) //* PCLK1 = HCLK/2 / RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB2时钟=72 MHz //* Configure ADCCLK such as ADCCLK = PCLK2/2 / // RCC_ADCCLKConfig(RCC_PCLK2_Div2); //RCC_PCLK2_Div2,4,6,8 //* PLLCLK = 8MHz * 9 = 72 MHz / RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数) //* Enable PLL / RCC_PLLCmd(ENABLE); //* Wait till PLL is ready / while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //* Select PLL as system clock source / RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //* Wait till PLL is used as system clock source / while(RCC_GetSYSCLKSource() != 0x08) { } } //***** RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); //***/ }

stm32的can发送时序不准

stm32的can发送时序不准

使用stm32can控制器自带的回环模式测试收发功能看是否正常若正常,那就是另一个接收数据的对象接收驱动没写好若不正常,那就说明至少此stm32can的发送驱动没写好如果以上示例都完成后stm32仍然无法正常通信,那就是硬件的原因,可以先查看芯片电压等是否配置正常,是否损坏等。ps:can通信距离近的情况下不建议接120欧姆终端电阻,否则可能出现通信过程中丢帧或通信失败情况

stm32如何使用can烧写代码

stm32使用can烧写代码的步骤如下:

1、首先,打开STM32CubeMX软件,选择从MCU开始我的项目;

2、然后,选择MCU芯片我们本次实验选择STM32F407VET6芯片做MCU,进入工程编辑;

3、最后,设置烧写方式为can模式这一步必须选择一种烧写方式即可。

本文标签:stm32can程序

产品列表
产品封装
友情链接