OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3566|回复: 2

CAN进入不了中断问题,求大神帮忙看下

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-11-1
在线时间
2 小时
发表于 2018-11-1 19:46:46 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 陆仲文 于 2018-11-1 20:16 编辑

  最近一直在做CAN的相关程序,可是我写的程序一直进不了中断,相关配置和正点原子的对照过,感觉没什么问题,但是就是进不了中断,请大家帮我看下。谢谢大家,另外我还想问下大家配置过STM32F7657IG的CAN3没有?
CAN_HandleTypeDef   CAN1_Handler;   //CAN1¾ä±ú
CAN_TxHeaderTypeDef     TxMessage;      //·¢ËíÏûÏ¢
CAN_RxHeaderTypeDef     RxMessage;      //½óêÕÏûÏ¢


                  extern u8 mydata1[8];
                        extern u8 mydata2[8];
                        extern u8 mydata3[8];
                        extern u8 mydata4[8];
                        extern u8 mydata[8];
                       
////CAN3õê¼»ˉ
//tsjw:ÖØDÂí¬2½ìøÔ¾ê±¼äμ¥Ôa.·¶Î§:CAN_SJW_1TQ~CAN_SJW_4TQ
//tbs2:ê±¼ä¶Î2μÄê±¼äμ¥Ôa.   ·¶Î§:CAN_BS2_1TQ~CAN_BS2_8TQ;
//tbs1:ê±¼ä¶Î1μÄê±¼äμ¥Ôa.   ·¶Î§:CAN_BS1_1TQ~CAN_BS1_16TQ
//brp :2¨ìØÂê·ÖÆμÆ÷.·¶Î§:1~1024; tq=(brp)*tpclk1
//2¨ìØÂê=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_MODE_NORMAL,ÆÕí¨Ä£ê½;CAN_MODE_LOOPBACK,»Ø»·Ä£ê½;
//Fpclk1μÄê±ÖóÔú3õê¼»ˉμÄê±oòéèÖÃÎa54M,èç1ûéèÖÃCAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_11tq,6,CAN_MODE_LOOPBACK);
//Ôò2¨ìØÂêÎa:54M/((6+11+1)*6)=500Kbps
//·μ»ØÖμ:0,3õê¼»ˉOK;
//    ÆäËû,3õê¼»ˉê§°ü;

u8 CAN1_Mode_Init(u32 tsjw,u32 tbs2,u32 tbs1,u16 brp,u32 mode)
{
    CAN_FilterTypeDef  CAN1_FilerConf;

    CAN1_Handler.Instance=CAN1;
    CAN1_Handler.pTxMsg=&TxMessage;     //·¢ËíÏûÏ¢
    CAN1_Handler.pRxMsg=&RxMessage;     //½óêÕÏûÏ¢
    CAN1_Handler.Init.Prescaler=brp;    //·ÖÆμÏμêy(Fdiv)Îabrp+1
    CAN1_Handler.Init.Mode=mode;        //Ä£ê½éèÖÃ
    CAN1_Handler.Init.SyncJumpWidth=tsjw;         //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1TQ~CAN_SJW_4TQ
    CAN1_Handler.Init.TimeSeg1=tbs1;         //tbs1·¶Î§CAN_BS1_1TQ~CAN_BS1_16TQ
    CAN1_Handler.Init.TimeSeg2=tbs2;         //tbs2·¶Î§CAN_BS2_1TQ~CAN_BS2_8TQ
    CAN1_Handler.Init.TimeTriggeredMode=DISABLE;     //·Çê±¼ä′¥·¢í¨DÅÄ£ê½
    CAN1_Handler.Init.AutoBusOff=DISABLE;     //èí¼t×Ô¶ˉàëÏß1üàí
    CAN1_Handler.Init.AutoWakeUp=DISABLE;     //ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)
    CAN1_Handler.Init.AutoRetransmission=ENABLE;      //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí
    CAN1_Handler.Init.ReceiveFifoLocked=DISABLE;     //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ
    CAN1_Handler.Init.TransmitFifoPriority=DISABLE;     //óÅÏè¼¶ó鱨Îıêê¶·û¾ö¶¨
    if(HAL_CAN_Init(&CAN1_Handler)!=HAL_OK) return 1;   //3õê¼»ˉ

    CAN1_FilerConf.FilterIdHigh=0X0000;     //32λID
    CAN1_FilerConf.FilterIdLow=0X0000;
    CAN1_FilerConf.FilterMaskIdHigh=0X0000; //32λMASK
    CAN1_FilerConf.FilterMaskIdLow=0X0000;  
    CAN1_FilerConf.FilterFIFOAssignment=CAN_FILTER_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0
    CAN1_FilerConf.FilterBank=0;          //1yÂËÆ÷0
    CAN1_FilerConf.FilterMode=CAN_FILTERMODE_IDMASK;
    CAN1_FilerConf.FilterScale=CAN_FILTERSCALE_32BIT;
    CAN1_FilerConf.FilterActivation=ENABLE; //¼¤»îÂË2¨Æ÷0
    CAN1_FilerConf.SlaveStartFilterBank=14;
    if(HAL_CAN_ConfigFilter(&CAN1_Handler,&CAN1_FilerConf)!=HAL_OK) return 2;//ÂË2¨Æ÷3õê¼»ˉ
    return 0;
}

//CANμ×2ãÇy¶ˉ£¬òy½ÅÅäÖã¬ê±ÖóÅäÖã¬ÖD¶ÏÅäÖÃ
//′Ëoˉêy»á±»HAL_CAN_Init()μ÷óÃ
//hcan:CAN¾ä±ú

void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_CAN1_CLK_ENABLE();                //ê1ÄüCAN1ê±Öó
    __HAL_RCC_GPIOA_CLK_ENABLE();                            //¿aÆôGPIOAê±Öó
       
    GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12;   //PA11,12   
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //íÆíì¸′óÃ
    GPIO_Initure.Pull=GPIO_PULLUP;              //éÏà-
    GPIO_Initure.Speed=GPIO_SPEED_FAST;         //¿ìËù
    GPIO_Initure.Alternate=GPIO_AF9_CAN1;  
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);         //3õê¼»ˉ

         
          
       
#if CAN1_RX0_INT_ENABLE
    __HAL_CAN_ENABLE_IT(&CAN1_Handler,CAN_IT_RX_FIFO0_MSG_PENDING);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.          
    HAL_NVIC_SetPriority(CAN1_RX0_IRQn,1,2);    //ÇàÕ¼óÅÏè¼¶1£¬×óóÅÏè¼¶2
    HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);          //ê1ÄüÖD¶Ï
#endif       
}
#if CAN1_RX0_INT_ENABLE                         //ê1ÄüRX0ÖD¶Ï
//CANÖD¶Ï·tÎñoˉêy
void CAN1_RX0_IRQHandler(void)
{
    HAL_CAN_IRQHandler(&CAN1_Handler);//′Ëoˉêy»áμ÷óÃCAN_Receive_IT()½óêÕêy¾Y
}

//CANÖD¶Ï′|àí1y3ì
//′Ëoˉêy»á±»CAN_Receive_IT()μ÷óÃ
//hcan:CAN¾ä±ú
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* hcan)
{
    int b=0;
          int a=0;


    //CAN_Receive_IT()oˉêy»á1رÕFIFO0ÏûÏ¢1òoÅÖD¶Ï£¬òò′ËÎòÃÇDèòaÖØDÂ′ò¿a
    __HAL_CAN_ENABLE_IT(&CAN1_Handler,CAN_IT_RX_FIFO0_MSG_PENDING);//ÖØD¿aÆôFIF00ÏûÏ¢1òoÅÖD¶Ï

    switch(CAN1_Handler.pRxMsg->StdId)
                {
                        case 0x190:

                        for(b=0;b<8;b++)
                        {
              mydata1=CAN1_Handler.pRxMsg->aData;
                        }
                                a=0;
                          for(b=0;b<4;b++)
                    {
                                   mydata[a++]=((int)mydata1[2*b]<<8)+mydata1[2*b+1];
                          }
                        break;
                        case 0x191:

                                for(b=0;b<8;b++)
                        {
                                mydata2=CAN1_Handler.pRxMsg->aData;
                        }
                                a=4;
                          for(b=0;b<4;b++)
                    {
                                   mydata[a++]=((int)mydata2[2*b]<<8)+mydata2[2*b+1];
                          }
                         
                        break;
                        case 0x170:
                                for(b=0;b<8;b++)
                                {
                                        mydata3=CAN1_Handler.pRxMsg->aData;
                                }
                                a=8;
                          for(b=0;b<4;b++)
                    {
                                   mydata[a++]=((int)mydata3[2*b]<<8)+mydata3[2*b+1];
                          }
                        break;
                        case 0x171:
                                for(b=0;b<8;b++)
                                {
                                        mydata4=CAN1_Handler.pRxMsg->aData;
                                }
                                a=12;
                          for(b=0;b<4;b++)
                    {
                                   mydata[a++]=((int)mydata4[2*b]<<8)+mydata4[2*b+1];
                          }
                        break;               
                        default:
                                                //printf("id:%d\r\n",CAN1_Handler.pRxMsg->StdId);

                        break;
                }
                               
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-11-3 03:05:59 | 显示全部楼层
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-11-1
在线时间
2 小时
 楼主| 发表于 2018-11-3 12:49:53 | 显示全部楼层
正点原子 发表于 2018-11-3 03:05
直接用我们例程试试

例程是可以用的,但是设置的是CAN1,现在我用的工程板,只有CAN3能用,怎么配置,都进不了中断,实在不知道问题出在哪,所以才来求助的。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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