找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1145|回复: 1
打印 上一主题 下一主题
收起左侧

stm32 can

[复制链接]
跳转到指定楼层
楼主
ID:304460 发表于 2018-9-3 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void can1_init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  /* GPIOA */     
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);   
        
        /* CAN1  时钟*/
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
        
        /* Configure CAN pin: RX */     // PA11
        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 */   // PA12
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        
//   GPIO_InitTypeDef  GPIO_InitStructure;

//         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//   
//   GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);                     //端口复用为CAN1   

//   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                         //PB8:CAN-RX
//   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                             //输入上拉
//   GPIO_Init(GPIOB, &GPIO_InitStructure);
//   
//   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                         //PB9:CAN-TX
//   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用模式
//   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//   GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/****************************************************************************
* 名    称:TestStatus CAN_Interrupt(void)
* 功    能:中断模式下的CAN收发
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无
****************************************************************************/
void can1_Interrupt(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;  

//  CanTxMsg TxMessage;
        
        /* CAN寄存器初始化 */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);

  /* CAN单元初始化 */
  CAN_InitStructure.CAN_TTCM = ENABLE;                           //MCR-TTCM  时间触发通信模式使能
  CAN_InitStructure.CAN_ABOM = ENABLE;                           //MCR-ABOM  自动离线管理
  CAN_InitStructure.CAN_AWUM = ENABLE;                           //MCR-AWUM  自动唤醒模式
  CAN_InitStructure.CAN_NART = DISABLE;                           //MCR-NART  禁止报文自动重传          0-自动重传   1-报文只传一次
  CAN_InitStructure.CAN_RFLM = ENABLE;                           //MCR-RFLM  接收FIFO 锁定模式  0-溢出时新报文会覆盖原有报文  1-溢出时,新报文丢弃
  CAN_InitStructure.CAN_TXFP = ENABLE;         //MCR-TXFP  发送FIFO优先级     0-优先级取决于报文标示符      1-优先级取决于发送请求的顺序
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack 环回模式   CAN_Mode_Normal

                /*波特率*////9600
//         CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                   //BTR-SJW 重新同步跳跃宽度 1个时间单元
//   CAN_InitStructure.CAN_BS1 = CAN_BS1_1tq;                   //BTR-TS1 时间段1 占用了2个时间单元
//   CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;                   //BTR-TS1 时间段2 占用了3个时间单元
//   CAN_InitStructure.CAN_Prescaler = 945;  
  
        ///*波特率*/9.4 k
        CAN_InitStructure.CAN_SJW = CAN_SJW_4tq;                   //BTR-SJW 重新同步跳跃宽度 1个时间单元
  CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;                   //BTR-TS1 时间段1 占用了2个时间单元
  CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;                   //BTR-TS1 时间段2 占用了3个时间单元
  CAN_InitStructure.CAN_Prescaler = 358;  
        ///////////               350  < CAN_Prescaler  < 372

//   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                   //BTR-SJW 重新同步跳跃宽度 1个时间单元
//   CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq;                   //BTR-TS1 时间段1 占用了2个时间单元
//   CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;                   //BTR-TS1 时间段2 占用了3个时间单元
//   CAN_InitStructure.CAN_Prescaler = 487;
        
  CAN_Init(CAN1, &CAN_InitStructure);

  /* CAN过滤器初始化 */
  CAN_FilterInitStructure.CAN_FilterNumber=13;                                                           //
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;                 //FM1R  过滤器组0的工作模式。
                                                                                                                                          //0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;
                                                                                                                                          //1: 过滤器组x的2个32位寄存器工作在标识符列表模式。
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;        //FS1R 过滤器组0(13~0)的位宽。
                                                                                                                                          //0:过滤器位宽为2个16位; 1:过滤器位宽为单个32位。
  
//   /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
//   CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x1234<<3)&0xFFFF0000)>>16;                                //要过滤的ID高位
//   CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x1234<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位
//   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
//   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
  
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                       
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  /* 全为0,忽略了报文标识符判别 */
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;                                //FFAx : 过滤器位宽设置 报文在通过了某过滤器的过滤后,
                                                                                                                                          //将被存放到其关联的FIFO中。 0:过滤器被关联到FIFO0; 1:过滤器被关联到FIFO1。
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                //FACTx : 过滤器激活 软件对某位设置1来激活相应的过滤器。只有对FACTx位清0,
                                                                                                                                          //或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器
                                                                                                                                        //x(CAN_FxR[0:1])。 0:过滤器被禁用; 1:过滤器被激活。
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 接收中断使能 */
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
        
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-9-3 17:26 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表