打印
[STM32F1]

STM32 CAN 无法进入中断 且RXTX都有波形

[复制链接]
1028|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DEMRY|  楼主 | 2020-4-10 18:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 DEMRY 于 2020-4-11 10:09 编辑

STM32F103RCT6
72M

硬件部分:



代码:


配置部分:
        GPIO_InitTypeDef                          GPIO_InitStruct;
        NVIC_InitTypeDef                                 NVIC_InitStruct;
        CAN_InitTypeDef                                 CAN_InitStruct;
  CAN_FilterInitTypeDef         CAN_FilterInitStruct;

        //时钟配置
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);   
        
  //端口配置        
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;//RX
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;//TX
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        
        //中断配置
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
        
        //CAN配置
   CAN_DeInit(CAN1);//将外设CAN的全部寄存器重设为缺省值
   CAN_StructInit(&CAN_InitStruct);//把CAN_InitStruct中的每一个参数按缺省值填入

   CAN_InitStruct.CAN_TTCM=DISABLE;//关闭时间触发模式
   CAN_InitStruct.CAN_ABOM=DISABLE;//关闭自动离线管理
   CAN_InitStruct.CAN_AWUM=DISABLE;//关闭自动唤醒模式
   CAN_InitStruct.CAN_NART=DISABLE;//禁止报文自动重传
   CAN_InitStruct.CAN_RFLM=DISABLE;//溢出时报文覆盖
   CAN_InitStruct.CAN_TXFP=DISABLE;//关闭TXFP  /*0:优先级由报文的标识符来决定,1优先级由发送请求的顺序来决定。*/
   CAN_InitStruct.CAN_Mode=CAN_Mode_Normal;//工作模式(正常)
   CAN_InitStruct.CAN_SJW=CAN_SJW_1tq;        //重新同步跳跃宽度1个时间单位
   CAN_InitStruct.CAN_BS1=CAN_BS1_3tq;        //时间段1为3个时间单位
   CAN_InitStruct.CAN_BS2=CAN_BS2_2tq;        //时间段2为2个时间单位
   CAN_InitStruct.CAN_Prescaler = 240;        //时间单位长度                //波特率为:72M/240/(1+3+2))=0.05 即波特率为50KBPS
   CAN_Init(CAN1,&CAN_InitStruct);//初始化CAN

   //接收过滤器
   CAN_FilterInitStruct.CAN_FilterNumber=0;//过滤器编号为0
   CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;        //过滤器类型为标识符屏蔽位模式
   CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;        //过滤器位宽为32位
   CAN_FilterInitStruct.CAN_FilterIdHigh=0x0F00;                        //要过滤的ID高位
   CAN_FilterInitStruct.CAN_FilterIdLow=0;                                                //要过滤的ID高位
   CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0F00;        //过滤器屏蔽标识符的高16位值
   CAN_FilterInitStruct.CAN_FilterMaskIdLow=0;                                //过滤器屏蔽标识符的低16位值
   CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;        //过滤器将ID报文关联到FIFO0缓存区中,数据只能从这里导出
   CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;//过滤器使能
   CAN_FilterInit(&CAN_FilterInitStruct);//初始化过滤器

   CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);        //接收中断使能
   CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);        //发送中断使能


发送部分:
        uint8_t i=0;
        TxMessage.StdId        =        0x00;                           //标准标识符(11bit)
  TxMessage.ExtId = 0x0000;                                //标准+扩展标识符(29bit)
  TxMessage.IDE                =        CAN_ID_STD;         //标识符选择  0启用标准标识符 1启用扩展标识符
  TxMessage.RTR                =        CAN_RTR_DATA;        //帧类型  0发送数据帧   1发送远程帧   
  TxMessage.DLC                =        hbs_tx_lenth; //数据长度
        for(i=0;i<8;i++)
        {
                TxMessage.Data=HBSTxBuffer;
        }
        CAN_Transmit(CAN1, &TxMessage);        //


中断部分:
void USB_LP_CAN1_RX0_IRQHandler(void)//接收中断 FIFO0
{
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);//can接收的数据存在FIFO0的RxMessage里
        if(RxMessage.RTR == CAN_RTR_Remote)//远程帧
        {
                //
        }
        else if(RxMessage.RTR == CAN_RTR_Data)//数据帧
        {
                //
        }               
        if(RxMessage.DLC)
        {
                hbs_rece_frame_f=1;
                //RxMessage.Data[];
        }
        CAN_ClearFlag(CAN1, CAN_IT_FMP0);
}
void CAN1_RX1_IRQHandler(void)//接收中断 FIFO1
{
        //
}
//
void USB_HP_CAN1_TX_IRQHandler(void) //发送中断
{
  if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
        {
           CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
     hbs_send_frame_f=1;
  }
}

寄存器:


、、、、、、、、、、、、、、、
目前问题是
1 调试打断点无法进入 接收和发送中断函数。
2 如果开启看门狗  就会一直复位。
3 波形单片机的管脚(TX RX)都有波形,且波形相同  看起来波形也是对的。并且此波形一直存在,感觉在不断的发,而我程序中发送函数只调用一次。
4 CAN总线上没有波形。
5 排除了硬件焊错 管脚断路等低级问题
6  回环模式测试:
   //CAN_InitStruct.CAN_Mode=CAN_Mode_Normal;//工作模式(正常)
CAN_InitStruct.CAN_Mode=CAN_Mode_LoopBack;//回环模式 测试用
使用回环模式 可以触发接收中断  且接收到正确的数据   但是发送中断仍然无法触发。
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]

所以证明发送成功了,于是只有两种可能  1发送函数名错了  2发送中断未配置成功。
检查启动文件后1排除。
2的话我一直以为 CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);这一句就可以配置发送中断,因为发送中断只有一个名称。

但是实际上 也需要配置一下,尝试在程序中增加
        NVIC_InitStruct.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);

问题解决。发送中断可以触发。



使用特权

评论回复
沙发
香水城| | 2020-4-10 23:37 | 只看该作者
本帖最后由 香水城 于 2020-4-11 10:11 编辑

建议先用回环模式跑下,看看能否进入中断。
甚至可以先直接拿官方例程测试下。

另外,能否看到相应中断标志被置位。

如果基于不同型号做移植的话,注意启动文件别选择错了。

使用特权

评论回复
板凳
DEMRY|  楼主 | 2020-4-11 09:24 | 只看该作者
本帖最后由 DEMRY 于 2020-4-11 10:10 编辑
香水城 发表于 2020-4-10 23:37
建议先用回环模式跑下,看看能否进入中断。
甚至可以先直接拿官方例程测试下。

启动文件:startup_stm32f10x_hd.s

使用特权

评论回复
地板
香水城| | 2020-4-11 10:14 | 只看该作者
看来你漏掉相关NVIC的配置。
以后尽量使用CubeMx进行配置,图形化勾选后 相关初始化文件都帮我们生成,少了这些麻烦。

使用特权

评论回复
5
DEMRY|  楼主 | 2020-4-11 10:20 | 只看该作者
香水城 发表于 2020-4-11 10:14
看来你漏掉相关NVIC的配置。
以后尽量使用CubeMx进行配置,图形化勾选后 相关初始化文件都帮我们生成,少 ...

非常感谢版主指导。

打赏功能一直显示ERROR不知如何解决  抱歉。

使用特权

评论回复
6
香水城| | 2020-4-11 14:02 | 只看该作者
DEMRY 发表于 2020-4-11 10:20
非常感谢版主指导。

打赏功能一直显示ERROR不知如何解决  抱歉。

你的问题得以解决乃是最好的打赏!

使用特权

评论回复
7
hanzhen654| | 2020-4-11 15:03 | 只看该作者
是的,先进行回环测试,后面再进行正常模式

使用特权

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

本版积分规则

4

主题

21

帖子

0

粉丝