打印
[STM32F0]

STM32F042K6的CAN接收中断进不去,求教

[复制链接]
3353|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32F042K6的CAN接收中断进不去,求教

最近刚接触与CAN通讯相关的项目, 对着方面不是太了解, 在调STM32F042K6的CAN通讯驱动时, 死活进不了接收中断(发送中断是可以的), 希望大家不吝敕教,谢谢!!!
下面是配置代码:

/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN通讯初始化
****名称: can_init();//
****作者:
*******************************************************************************/
void can_init(void)        //
{        
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        CAN_InitTypeDef  CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
        
        //CAN中断使能和优先级设置
        NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        //CAN时钟配置
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                                                                                                            
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
        
        //CAN端口复用
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_4);
        
        //CAN_RX端口配置
        GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        //CAN_TX端口配置
        GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        //CAN_STB端口初始化
        GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        CAN_STB_OL();        //        
        
        //CAN单元设置
        CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_ABOM = DISABLE;  
        CAN_InitStructure.CAN_AWUM = DISABLE;
        CAN_InitStructure.CAN_NART = ENABLE;
        CAN_InitStructure.CAN_RFLM = DISABLE;
        CAN_InitStructure.CAN_TXFP = DISABLE;
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_Normal;
        //CAN波特率设置,500KHz@48MHz
        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 = 6;
        CAN_Init(CAN, &CAN_InitStructure);
        
        //CAN过滤器FIFO0配置
        CAN_FilterInitStructure.CAN_FilterNumber = 0;
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
        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中断
        CAN_ClearITPendingBit(CAN, CAN_IT_FF0);
        CAN_ITConfig(CAN, CAN_IT_TME, ENABLE);
        CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
        CAN_ITConfig(CAN, CAN_IT_FF0, ENABLE);
}

/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN中断服务函数
****名称: CEC_CAN_IRQHandler();//
****作者:
*******************************************************************************/

void CEC_CAN_IRQHandler(void)
{        
        u8 i = 0;
**        if (CAN_GetITStatus(CAN, CAN_IT_TME) != 0)
        {
                CAN_ClearITPendingBit(CAN, CAN_IT_TME);
                i++;
        }
        
        if (CAN_GetITStatus(CAN, CAN_IT_FMP0) != 0)
        {
***                CAN_ClearITPendingBit(CAN, CAN_IT_FMP0);
                i++;
        }
        
        if (CAN_GetITStatus(CAN, CAN_IT_FF0) != 0)
        {
                CAN_ClearITPendingBit(CAN, CAN_IT_FF0);
                i++;
        }
        
        if (CAN_GetITStatus(CAN, CAN_IT_FOV0) != 0)
        {
                CAN_ClearITPendingBit(CAN, CAN_IT_FOV0);
                i++;
        }
}


以上代码调试时,星号处是打的断点, 用CAN分析仪发数据过来, 我的代码却进不了接收中断, 确定是有数据过来的!
麻烦大家帮忙看看哪里搞错了, 非常感谢!!!


沙发
gaoyang9992006| | 2016-3-29 16:28 | 只看该作者
关于STM32中CAN发送和接受中断的使用
    “如果你用的CAN引脚是PA11和PA12,接收中断用CAN1_RX0_IRQn。如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中断用CAN1_RX1_IRQn。由于PA11和PA12也是USB的引脚,所以非互联型且带CAN控制器的微控制器的库文件在起名字时用了USB_LP_CAN1_RX0_IRQn。”具体的定义可以参考stm32F10x.h文件,其中对不同型号的中断有具体的定义。
示例如下:
1. 配置过滤器
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;   //关联FIFO0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
  
CAN_FilterInitStructure.CAN_FilterNumber = 14;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO1;   //关联FIFO1
CAN_FilterInit(&CAN_FilterInitStructure);
2. 开启CAN中断
     
   CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
   CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
   CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
   CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);
3. 中断处理函数

void CAN1_RX0_IRQHandler(void)
{
        CAN_Receive(CAN1, CAN_FIFO0, &CAN1_RxMsg);
//
}

void CAN1_RX1_IRQHandler(void)
{
        CAN_Receive(CAN1, CAN_FIFO1, &CAN1_RxMsg);
        //
}
void CAN2_RX0_IRQHandler(void)
{
        CAN_Receive(CAN2, CAN_FIFO0, &CAN2_RxMsg);
       //
}

void CAN2_RX1_IRQHandler(void)
{
        CAN_Receive(CAN2, CAN_FIFO1, &CAN2_RxMsg);
        //
}

PS:    F1不知道和F0是不是一样的。

使用特权

评论回复
板凳
hailian27|  楼主 | 2016-3-29 17:46 | 只看该作者
gaoyang9992006 发表于 2016-3-29 16:28
关于STM32中CAN发送和接受中断的使用    “如果你用的CAN引脚是PA11和PA12,接收中断用CAN1_RX0_IRQn。如果 ...

你说的这个是适用于103系列的, 我用的芯片是STM32F042K6, 中断向量是不会搞错的,可以进睡眠中断, 寄存器的值也对的上, 说明向量没问题; 我用的这个芯片是32Pin的, 就没有PB8 PB9这俩脚........

使用特权

评论回复
地板
gaoyang9992006| | 2016-3-29 19:52 | 只看该作者
hailian27 发表于 2016-3-29 17:46
你说的这个是适用于103系列的, 我用的芯片是STM32F042K6, 中断向量是不会搞错的,可以进睡眠中断, 寄存器 ...

CUBEMX那个图形化配置里,应该有CAN的配置吧。

使用特权

评论回复
5
hailian27|  楼主 | 2016-3-30 09:12 | 只看该作者
那个东西我看过了, 配的一样的, 写的东西太乱了, 感觉不太好用

使用特权

评论回复
6
seawwh| | 2016-5-28 16:57 | 只看该作者
楼主, 我遇到的问题和你不一样,使用Loop模式自发数据可以接收到并触发接收中断,但是比较奇怪的是,我写的CEC_CAN_IRQHandler 函数没有代码生成,因此中断发生后就停在下面死循环:

        PUBWEAK CEC_CAN_IRQHandler
        SECTION .text:CODE:NOROOT:REORDER(1)
CEC_CAN_IRQHandler
        B CEC_CAN_IRQHandler

我用的是 IAR 7.5

使用特权

评论回复
7
yiyigirl2014| | 2016-5-29 00:06 | 只看该作者
难兄难弟啊,这个玩意儿我也不会搞。

使用特权

评论回复
8
hailian27|  楼主 | 2016-5-30 17:44 | 只看该作者
seawwh 发表于 2016-5-28 16:57
楼主, 我遇到的问题和你不一样,使用Loop模式自发数据可以接收到并触发接收中断,但是比较奇怪的是,我写的CE ...

"我写的CEC_CAN_IRQHandler 函数没有代码生成,因此中断发生后就停在下面死循环"

使用特权

评论回复
9
hailian27|  楼主 | 2016-5-30 17:44 | 只看该作者
seawwh 发表于 2016-5-28 16:57
楼主, 我遇到的问题和你不一样,使用Loop模式自发数据可以接收到并触发接收中断,但是比较奇怪的是,我写的CE ...

"我写的CEC_CAN_IRQHandler 函数没有代码生成,因此中断发生后就停在下面死循环",
函数没有代码生成是什么意思?

使用特权

评论回复
10
hailian27|  楼主 | 2016-5-30 17:45 | 只看该作者
yiyigirl2014 发表于 2016-5-29 00:06
难兄难弟啊,这个玩意儿我也不会搞。

很久没看论坛了,这个代码的配置没有问题,是板子的CANH和CANL线搞反了

使用特权

评论回复
11
Brand2| | 2016-5-30 20:13 | 只看该作者
如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中断用CAN1_RX1_IRQn

使用特权

评论回复
12
hailian27|  楼主 | 2016-5-31 18:55 | 只看该作者
Brand2 发表于 2016-5-30 20:13
如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中断用CAN1_RX1_IRQn

手册里就没写PB8和PB9能映射为CAN功能脚, 没用过

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝