OpenEdv-开源电子网

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

UCOSIII CAN1无法进入中断函数,求助!!!!!!

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-2-22
在线时间
7 小时
发表于 2016-3-31 17:18:46 | 显示全部楼层 |阅读模式
2金钱
各位大神,调试了很久,无法进入CAN1中断服务函数,求助!!!下面是相关源码!任务主体
void AppTaskTestCan(void)
{
    OS_ERR  err;  
    CPU_TS  ts;
    LED2_Off();
    while(1)
    {
        OSSemPend(&App_TestCAN1Sem,    //App_UserLEDSem当换成定时器中断发出的信号量里LED翻转   //App_TestCAN1Sem  进不了CAN1接收中断,所以也没有App_TestCAN1Sem出来
                  0,
                  OS_OPT_PEND_BLOCKING,
                  &ts,
                  &err
                  );
        BSP_LED_Toggle(2);
    }   
}
CAN1配置函数
void BSP_Can1_Init(void)
{
    CAN_InitTypeDef     CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    GPIO_InitTypeDef    GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   

    /* CAN Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);

    /* Configure CAN1 pin: RX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO_InitStructure);  
    /* Configure CAN1 pin: TX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);   

    CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);   

    /* CAN cell init */
    CAN_InitStructure.CAN_TTCM = DISABLE;
    CAN_InitStructure.CAN_ABOM = DISABLE;
    CAN_InitStructure.CAN_AWUM = DISABLE;
    CAN_InitStructure.CAN_NART = DISABLE;
    CAN_InitStructure.CAN_RFLM = DISABLE;
    CAN_InitStructure.CAN_TXFP = ENABLE;
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
    CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
    CAN_InitStructure.CAN_Prescaler=9;

    CAN_Init(CAN1,&CAN_InitStructure);

    CAN_FilterInitStructure.CAN_FilterNumber = 0;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0;
    CAN_FilterInitStructure.CAN_FilterIdLow = 0;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);
    CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);

//   


    BSP_IntVectSet(BSP_INT_ID_CAN1_RX0, CAN1_RX0_ISR_Handler);
    BSP_IntEn(BSP_INT_ID_CAN1_RX0);   
}

CAN1中断服务函数,对应于BSP_IntVectSet(BSP_INT_ID_CAN1_RX0, CAN1_RX0_ISR_Handler);
void CAN1_RX0_ISR_Handler(void)
{
    OS_ERR  err;
    CanRxMsg RxMessage;
    unsigned char i;
    if(CAN_GetFlagStatus(CAN1,CAN_IT_FMP0) != RESET)
    {
        BSP_LED_Toggle(2);        
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
        for(i = 0;i < 8; i ++)
        {
                CAN1_DATA = RxMessage.Data;
        }
        CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
        OSSemPost(&App_TestCAN0Sem,
                  OS_OPT_POST_ALL ,
                  &err
                  );
    }
}

另:#define  BSP_INT_ID_CAN1_RX0                              20    /* CAN1 RX0 Interrupts                                  */


用同样的方式(
BSP_IntVectSet(BSP_INT_ID_TIM2, BSP_Timer2_Int);
BSP_IntVectSet(BSP_INT_ID_CAN1_RX0, CAN1_RX0_ISR_Handler);
),定时器2可以实现中断,但CAN1就是不行,求大神帮忙!!!不胜感激!


最佳答案

查看完整内容[请看2#楼]

补充一下,裸机可以进入中断,另外,App_TestCAN1Sem,App_TestCAN0Sem,这两个其实是一样的,是我发贴的以为不对,临时改的,这里没有问题..麻烦各位大神看看,那里的问题,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-2-22
在线时间
7 小时
 楼主| 发表于 2016-3-31 17:18:47 | 显示全部楼层
本帖最后由 weiweiwsk 于 2016-3-31 17:32 编辑

补充一下,裸机可以进入中断,另外,App_TestCAN1Sem,App_TestCAN0Sem,这两个其实是一样的,是我发贴的以为不对,临时改的,这里没有问题..麻烦各位大神看看,那里的问题,
回复

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-3-3
在线时间
10 小时
发表于 2016-12-2 19:47:24 | 显示全部楼层
好巧,我也遇到同样的问题,裸机一起正常,上ucos就是不行,~
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-9-21
在线时间
7 小时
发表于 2019-10-28 19:34:36 | 显示全部楼层
请问楼主解决了吗,我也遇到了同样的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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