打印
[STM32F1]

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

[复制链接]
677|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2022-4-14 22:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32F103RCT6
72M
硬件部分:

使用特权

评论回复
沙发
zwll|  楼主 | 2022-4-14 22:25 | 只看该作者

使用特权

评论回复
板凳
houcs| | 2022-4-14 22:27 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
zwll|  楼主 | 2022-4-14 22:29 | 只看该作者
代码:


配置部分:
        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;
  }
}

使用特权

评论回复
5
zwll|  楼主 | 2022-4-14 22:31 | 只看该作者

使用特权

评论回复
6
juventus9554| | 2022-4-14 22:37 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

评论回复
7
zwll|  楼主 | 2022-4-14 22:40 | 只看该作者
调试打断点无法进入 接收和发送中断函数。
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]

使用特权

评论回复
8
jiajs| | 2022-4-14 22:42 | 只看该作者
建议先用回环模式跑下,看看能否进入中断。

使用特权

评论回复
9
huwr| | 2022-4-14 22:44 | 只看该作者
甚至可以先直接拿官方例程测试下。

使用特权

评论回复
10
stly| | 2022-4-14 22:46 | 只看该作者
另外,能否看到相应中断标志被置位。

使用特权

评论回复
11
supernan| | 2022-4-14 22:48 | 只看该作者
如果基于不同型号做移植的话,注意启动文件别选择错了。

使用特权

评论回复
12
zwll|  楼主 | 2022-4-14 22:50 | 只看该作者
启动文件:startup_stm32f10x_hd.s

使用特权

评论回复
13
dengdc| | 2022-4-14 22:55 | 只看该作者
看来你漏掉相关NVIC的配置。

使用特权

评论回复
14
shimx| | 2022-4-14 22:56 | 只看该作者
以后尽量使用CubeMx进行配置,图形化勾选后 相关初始化文件都帮我们生成,少了这些麻烦。

使用特权

评论回复
15
stly| | 2022-4-14 22:58 | 只看该作者
是的,先进行回环测试,后面再进行正常模式

使用特权

评论回复
16
zwll|  楼主 | 2022-4-14 23:00 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

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

本版积分规则

885

主题

11314

帖子

5

粉丝