完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
此处采用的是STM32F103C8T6,话不多说,直接上代码。
/*CAN RX0 中断优先级配置 */ void CAN_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* enabling interrupt */ NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /*CAN GPIO 和时钟配置 */ void CAN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能外设时钟 /* 复用功能和GPIOB端口时钟使能*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); /* Configure CAN pin: RX */ // PB8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure CAN pin: TX */ // PB9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* CAN1 模块时钟使能 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); } /* CAN初始化 */ void CAN_INIT(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CAN_GPIO_Config();//CAN管脚初始化 CAN_NVIC_Configuration(); //CAN中断初始化 /* CAN register init */ CAN_DeInit(CAN1); //将外设CAN的全部寄存器重设为缺省值 CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入 /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式 CAN_InitStructure.CAN_ABOM=ENABLE;//使能自动离线管理 CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式 CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式 CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式 CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级 CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN设置为正常模式 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位 CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; //时间段1为3个时间单位 CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; //时间段2为2个时间单位 CAN_InitStructure.CAN_Prescaler=12; //时间单位长度为60 CAN_Init(CAN1,&CAN_InitStructure); //波特率为:72M/2/12(1+3+2)=0.5 即500K /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;// 过滤器标识符的低16位值 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;// 过滤器屏蔽标识符的低16位值 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器 CAN_FilterInit(&CAN_FilterInitStructure);// 按上面的参数初始化过滤器 /* CAN FIFO0 message pending interrupt enable */ CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断 } u8 Can_Send_Msg(u8* msg,u8 len) { CanTxMsg TxMessage; u8 mbox; u16 i=8; TxMessage.StdId=0x11; // 标准标识符 TxMessage.IDE=CAN_ID_STD ; // 扩展帧 TxMessage.RTR=CAN_RTR_DATA ; // 数据帧 用于发送单元向接收单元传送数据的帧 TxMessage.DLC=len; // 要发送的数据长度 for(i=0;i mbox= CAN_Transmit(CAN1, &TxMessage); i=0; while((CAN_TransmitStatus(CAN1, mbox)== CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束 if(i>=0XFFF)return 1; return 0; } /* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */ void USB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的数据 memset(&RxMessage,0,8); CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:29 , Processed in 1.041414 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号