1、STM32的 can总线实验心得标签: 总线 心得 实验 2010-09-01 21:08 http:/ data = 0;int sent = FALSE;#ifdef DEBUGdebug();#endif RCC_Configuration(); NVIC_Configuration();GPIO_Configuration();USART_Configuration();CAN_Configuration();Serial_PutString(“rn伟研科技 http:/rn“);Serial_PutString(“CAN testrn“); while(1)if(GPIO_Keypr
2、ess(GPIO_KEY, BUT_RIGHT)GPIO_SetBits(GPIO_LED, GPIO_LD1); /检测到按键按下if(sent = TRUE)continue; sent = TRUE;data +;if(data z)data = 0;CAN_TxData(data);else /按键放开GPIO_ResetBits(GPIO_LED, GPIO_LD1); sent = FALSE;前面的 RCC、NVIC、GPIO、USART 配置和之前的实验大同小异,关键是分析 CAN_Configuration()函数如下:void CAN_Configuration(void)
3、 /CAN配置函数CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();/ CAN_StructInit(/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;/禁止时间触发通信模式CAN_InitStructure.CAN_ABOM=DISABLE;/软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测/到 128次 11位连续的隐性位,就退出离
4、线状态。CAN_InitStructure.CAN_AWUM=DISABLE;/睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒CAN_InitStructure.CAN_NART=ENABLE;/DISABLE; CAN报文只被发送 1次,不管发送的结果如何(成功、出错或仲裁丢失)CAN_InitStructure.CAN_RFLM=DISABLE;/在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文CAN_InitStructure.CAN_TXFP=DISABLE;/发送FIFO优先级由报文的标识符来决定/ CAN_InitStru
5、cture.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; /CAN硬件工作在正常模式 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;/重新同步跳跃宽度 1个时间单位CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;/时间段 1为 8个时间单位CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;/时间段 2为 7个时间单位CAN_InitStructure.CAN_Prescaler = 9; /(pclk1/(1+8+7
6、)*9) = 36Mhz/16/9 = 250Kbits设定了一个时间单位的长度9CAN_Init(/* CAN filter init 过滤器初始化*/CAN_FilterInitStructure.CAN_FilterNumber=0;/指定了待初始化的过滤器 0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;/指定了过滤器将被初始化到的模式标识符屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;/给出了过滤器位宽1个32位过滤器CA
7、N_FilterInitStructure.CAN_FilterIdHigh=0x0000;/用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;/用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;/用来设定过滤器屏蔽标识符或者过滤器标识符(32 位位宽时为其高段位,16 位位宽时为第一个)CAN_FilterInitStructure.CAN_FilterMaskI
8、dLow=0x0000;/用来设定过滤器屏蔽标识符或者过滤器标识符(32 位位宽时为其低段位,16 位位宽时为第二个CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;/设定了指向过滤器的FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;/使能过滤器CAN_FilterInit(/* CAN FIFO0 message pending interrupt enable */ CAN_ITConfig(CAN_IT_FMP0, ENABLE);/使能指定的 CAN中断再看看发送程序:TestStatus CAN_TxData(char data)CanTxMsg TxMessage;u32 i = 0;u8 TransmitMailbox = 0;/*u32 dataLen;dataLen = strlen(data);if(dataLen 8)dataLen = 8;*/* transmit 1 message生成一个信息 */TxMessage.StdId=0x00;/ 设定标准标识符TxMessage.ExtId=0x1234;/ 设定扩展标识符