STM32F429 HAL库的CAN单节点发送

    最近两个月一直很头秃,网上很多人吐槽HAL库,但是我一直没有舍弃,一直在努力的适应。问题如下:

    电路板单板调试CAN发送数据,程序总是卡死在if ( ( Timeout == 0 ) || ( ( HAL_GetTick() - tickstart ) > Timeout ) ),有人说,有病,为何不用回环模式。当然可以!不过在设备正常运行的时候,如果有设备离线,总线上只剩下一个CAN节点的时候与现在恰好相同。

    刚开始我也忽略这个问题,但设备联调中,一旦有某些设备故障,CAN上只剩下一个节点,程序卡死的问题不容虎视,我决定不在逃避,尝试解决这个问题。

    网上大侠告诉我应该是发送和接收同时发生,导致邮箱不够用,OK,我都用子优先级相同的中断来操作,依旧不行;有大侠说是因为systick没有使能,我debug查看systick正常计数;有大侠说是CAN的自动离线管理出了问题,开启离线恢复就可以解决,我尝试,如果CAN总线其他节点没有恢复,程序仍然卡死。最终我检查程序发现systick的中断不能进入,导致uwTick++不能执行。查看HAL库的systick中断优先级配置,发现是最低的,然并卵,卡死的位置并不在中断内。

    我浅尝辄止(主要是hal底层不懂),没有继续研究为何systick中断不进入,而且打算半路截胡,想看看如果投机取巧的解决这个问题。有人说,利用OS系统中的其他计数器替代可以解决,然而我并没有是用OS。有人说你可以把中断优先级设高一些,我认为这并不是一个好方案,1ms的中断对程序的影响还是存在的,而且我程序中本身就有10ms的定时器中断。于是,我决定用系统计数器更换uwTick的判断条件。方法如下

    uint32_t ticks;        
    uint32_t told, tnow, tcnt = 0;    
    uint32_t reload = SysTick->LOAD;        

    ticks=Timeout*1000*fac_us;                         //需要的节拍数 
    told=SysTick->VAL;                        //刚进入时的计数器值     

 

   if ( tcnt<=ticks )
   {
           if(tnow<told)tcnt+=told-tnow;    //这里注意一下SYSTICK是一个递减的计数器就可以了.
           else tcnt+=reload-tnow+told;        
           told=tnow;
   }
   else
   {
           hcan->State = HAL_CAN_STATE_TIMEOUT;
            /* Process unlocked */
            __HAL_UNLOCK ( hcan );
            return HAL_TIMEOUT;
    }

虽然不是一个好方法,但是确实解决了问题。

 

 

 

 

 

 

 

STM32F103系列是意法半导体公司推出的32位片机系列,具有强大的功能和性能。HAL库是基于STM32Cube软件包的一种软件开发工具,提供了一系列的库函数,方便用户开发基于STM32F103系列的应用程序。 CAN(Controller Area Network)是一种通信协议,特别适用于多节点的实时通信系统。STM32F103系列的HAL库提供了丰富的CAN相关的函数和接口,方便用户在开发CAN通信应用时的使用。 使用HAL库的CAN功能,我们可以通过以下几个步骤来实现CAN通信: 1. 初始化CAN总线:通过调用CAN_Init函数,配置CAN总线的参数,如波特率、传输模式等。 2. 配置CAN过滤器:通过调用CAN_FilterConfig函数,设置CAN过滤器,用于过滤接收到的CAN帧。 3. 发送CAN帧:通过调用CAN_Transmit函数,可以将数据发送到CAN总线上。 4. 接收CAN帧:通过调用CAN_Receive函数,可以接收CAN总线上的数据。 5. 处理接收到的CAN帧:在CAN的接收中断中,可以调用相应的处理函数,对接收到的CAN帧进行处理。 通过这些函数和接口,我们可以很方便地在STM32F103系列的片机上实现CAN通信功能。同时,HAL库还提供了其他一些函数,如CAN中断的使能和禁止、CAN通信中断的处理等,提高了开发效率和灵活性。 总之,STM32F103系列的HAL库提供了丰富的CAN库函数和接口,方便用户在开发CAN通信应用时的使用。通过使用这些函数和接口,我们可以轻松地在STM32F103片机上实现CAN通信功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值