stm32f103 can无法进入接收中断

2019-07-21 06:32发布

这两个星期做CAN总线,实在是搞不定了,希望求助各位大神帮忙看一下,can无法进入接收中断,另一块单片机是循环发数据的,原本不用中断时是可以接收到的,但是现在想用中断来接收,不知道是不是中断配置的问题

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"         
#include "can.h"

extern _ARMABI int rand(void);
uint8_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;
uint16_t CAN_ID;
u8 CanFlag,Display;
u8 buf[50]={0};
//——————————————————————————————————————————————————————————————————————————————————————————————————

void USB_LP_CAN1_RX0_IRQHandler(void);
void CanWriteData(uint16_t ID);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void CAN_Configuration(void);

//——————————————————————————————————————————————————————————————————————————————————————————————————
unsigned char name[]={0xD1,0xEE,0xB0,0xB2,0xCA,0xA5};
int main(void){         
//        u8 key;
//        u8 i;
//        u8 canbuf[50]={0};
//        u8 res;
        delay_init();                    //延时函数初始化          
        uart_init(115200);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        //KEY_Init();                        //按键初始化                        
           //CAN1_Init();
        NVIC_Configuration();
        GPIO_Configuration();
        CAN_Configuration();   
        while(1){
                if(CanFlag == 1){
                printf(" 已进入接收中断服务函数 ");
                LED0=!LED0;
                CanFlag = DISABLE;
                printf("CAN Receive Data ");
                printf("CAN ID %x ",CAN_ID);
                printf("CAN_DATA0 %x ",CAN_DATA0);
                printf("CAN_DATA1 %x ",CAN_DATA1);
                printf("CAN_DATA2 %x ",CAN_DATA2);
                printf("CAN_DATA3 %x ",CAN_DATA3);
                printf("CAN_DATA4 %x ",CAN_DATA4);
                printf("CAN_DATA5 %x ",CAN_DATA5);
                printf("CAN_DATA6 %x ",CAN_DATA6);
                printf("CAN_DATA7 %x ",CAN_DATA7);
                                //res=Can_Receive_Msg(canbuf);
                                delay_ms(1);
                                CAN_FIFORelease(CAN1,CAN_FIFO0);//释放FIFO0
                                //MyPrintfArray(canbuf,res);
                                LED0=!LED0;        //if(res)
                                delay_ms(10);  
                }       
        }
}

//——————————————————————————————————————接收中断服务函数————————————————————————————————————————
/*void USB_LP_CAN1_RX0_IRQHandler(void)
{
                CanRxMsg RxMessage;                                                  //定义CAN接收消息结构体
                NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);    //使能CAN1消息接收中断
                CAN_Receive(CAN1,0, &RxMessage);  //将FIFO0中接收数据信息存入消息结构体中  CAN_FIFO0        // 此函数包含释放提出报文了的,在非必要时,不需要自己释放
                //CAN_ID=RxMessage.StdId;
                //CAN_ID=RxMessage.ExtId;
                //if(RxMessage.Data[0]==0aRxMessage.Data[1]==01){
               
                CAN_DATA0=RxMessage.Data[0];
                CAN_DATA1=RxMessage.Data[1];
                CAN_DATA2=RxMessage.Data[2];
                CAN_DATA3=RxMessage.Data[3];
                CAN_DATA4=RxMessage.Data[4];
                CAN_DATA5=RxMessage.Data[5];
                CAN_DATA6=RxMessage.Data[6];
                CAN_DATA7=RxMessage.Data[7];
               
                printf(" 接收中断服务函数 ");
                CanFlag = 1;
}*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
       
          CanRxMsg RxMessage;
        int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
        for(i=0;i<8;i++)
        buf[i]=RxMessage.Data[i];  //
        //return RxMessage.DLC;           //
        //printf("rxbuf[%d]:%d ",i,RxMessage.Data[i]);
        printf(" 接收中断服务函数 ");
        CanFlag = 1;
}
void CanWriteData(uint16_t ID)
{
          CanTxMsg TxMessage;
       
          CAN_DATA0=rand()%0xff;  CAN_DATA1=rand()%0xff;  
          CAN_DATA2=rand()%0xff;  CAN_DATA3=rand()%0xff;  
          CAN_DATA4=rand()%0xff;  CAN_DATA5=rand()%0xff;
          CAN_DATA6=rand()%0xff;  CAN_DATA7=rand()%0xff;
       
          /* transmit */
          TxMessage.StdId = ID;  /* 设置标准id  注意标准id的最高7位不能全是隐性(1)。共11位 */
                //TxMessage.ExtId = 0x00;     //设置扩展id  扩展id共18位
          TxMessage.RTR = CAN_RTR_DATA; /* 设置为数据帧 */
          TxMessage.IDE = CAN_ID_STD;   /* 使用标准id        */
          TxMessage.DLC = 8;            /* 数据长度, can报文规定最大的数据长度为8字节 */
          TxMessage.Data[0] = CAN_DATA0;   
          TxMessage.Data[1] = CAN_DATA1;   
          TxMessage.Data[2] = CAN_DATA2;   
          TxMessage.Data[3] = CAN_DATA3;   
          TxMessage.Data[4] = CAN_DATA4;   
          TxMessage.Data[5] = CAN_DATA5;     
          TxMessage.Data[6] = CAN_DATA6;   
          TxMessage.Data[7] = CAN_DATA7;      
          CAN_Transmit(CAN1,&TxMessage);  /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */       
}

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable CAN1 RX0 interrupt IRQ channel */
  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);
}

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* CAN Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟

  GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
  /* Configure CAN pin: RX */
    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);                //初始化IO

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO             

}

void CAN_Configuration(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        NVIC_Configuration();
          GPIO_Configuration();
          /* CAN register init */
          CAN_DeInit(CAN1);
          CAN_StructInit(&CAN_InitStructure);

        CAN_InitStructure.CAN_TTCM=DISABLE;                        //非时间触发通信模式  //
        CAN_InitStructure.CAN_ABOM=DISABLE;                        //软件自动离线管理         //
          CAN_InitStructure.CAN_AWUM=DISABLE;                        //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
          CAN_InitStructure.CAN_NART=ENABLE;                        //禁止报文自动传送 //
          CAN_InitStructure.CAN_RFLM=DISABLE;                        //报文不锁定,新的覆盖旧的 //
          CAN_InitStructure.CAN_TXFP=DISABLE;                        //优先级由报文标识符决定

        CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN设置为正常模式
    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //重新同步跳跃宽度1个时间单位
    CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;      //时间段1为3个时间单位
    CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;      //时间段2为2个时间单位
    CAN_InitStructure.CAN_Prescaler=60;         //时间单位长度为60
    CAN_Init(CAN1,&CAN_InitStructure);          //波特率为:72M/2/60(1+3+2)=0.1 即波特率为100KBPs

        //配置过滤器
        CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         /* 屏敝模式 */
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0       
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
       
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.
        CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);

        CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
        CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。