STM32Cubemx+CANopen

学习CANOpen 几周终于移植成功,现将移植教程做记录备份封装,方便以后使用

  1. CanFestival 移植
    固定的头文件及C文件 很多例程有整理移植,偷懒拷贝别家的即可,再次感谢很多人。
  2.  添加C文件:(文件必须的子程序) 
    
 void setTimer(TIMEVAL value)
 {}
 TIMEVAL getElapsedTime(void)
 {}
 unsigned char canSend(CAN_PORT notused, Message *m)
 {}
  1. 定时器配置:
    在这里插入图片描述
  2. CAN 配置 500K 的配置速率
    在这里插入图片描述
  3. 使用对象字典生成一个具有心跳(1000ms)的TestSlave文件
  4. 整体修改 步骤3的子程序 创建一个头文件
#include "canfestival.h"
# include "main.h"
#include "Knowledge.h"
#include "TestSlave.h"

#define CANOPEN_TIM_PERIOD                  65535          //웓퉘㉵?
/* 웓퉘큉TIM?좢쐓? */
static TIMEVAL last_counter_val = 0;
static TIMEVAL elapsed_time = 0;

void setTimer(TIMEVAL value)
{
    uint32_t timer = __HAL_TIM_GET_COUNTER(&htim6); // Copy the value of the running timer

    elapsed_time += timer - last_counter_val;
    last_counter_val = CANOPEN_TIM_PERIOD - value;
    __HAL_TIM_SET_COUNTER(&htim6, CANOPEN_TIM_PERIOD - value);
    HAL_TIM_Base_Start_IT(&htim6);
}

TIMEVAL getElapsedTime(void)
{    
    uint32_t timer = __HAL_TIM_GET_COUNTER(&htim6); // Copy the value of the running timer
    if(timer < last_counter_val)
    {
        timer += CANOPEN_TIM_PERIOD;
    }
    TIMEVAL elapsed = timer - last_counter_val + elapsed_time;
  return elapsed;
}

u8 CAN1_Send_Msg(Message *msg)
{
    uint32_t txmailbox = 0;
	uint32_t offset = 0;
	CAN_TxHeaderTypeDef hdr;
    u16 i=0;
 
    hdr.IDE = CAN_ID_STD;				// 멜D밐쐙쩄?
	hdr.RTR = CAN_RTR_DATA;			    // ?豈폮줽쮛?
	hdr.StdId = msg->cob_id;;		   // 쐙쩄멜D,榮靜1풭밃?쮌퉪0x7FF
	hdr.ExtId = 0;					   // 챨좠멜D,榮頂9풭밃?쮌퉪0x1FFF
	hdr.TransmitGlobalTime = DISABLE;     

    if(msg->rtr)
      hdr.RTR = CAN_RTR_REMOTE;
     else
      hdr.RTR= CAN_RTR_DATA;  
	tCAN.TxHeader.DLC = msg->len;
	for(i=0; i<msg->len; i++)
    {
		tCAN.TxData[i] = msg->data[i];
	}

    while(tCAN.TxHeader.DLC != 0)
	{
		hdr.DLC = tCAN.TxHeader.DLC > 8 ? 8 : tCAN.TxHeader.DLC;		// 튛쮛씫웯
		if(HAL_CAN_AddTxMessage(&hcan, &hdr, ((uint8_t *)tCAN.TxData) + offset, &txmailbox) != HAL_OK)
			return 1;
		offset += hdr.DLC;
		tCAN.TxHeader.DLC -= hdr.DLC;
	}
	return 0;
}

unsigned char canSend(CAN_PORT notused, Message *m)
{
	 return CAN1_Send_Msg((Message *) m);;
}

/************************************************
줦튛?? 밐 TIMx_DispatchFromISR
졵    컢 밐 웓퉘왱웯(얩웓퉘큉햤?
쒩    튛 밐 ?
잇 ? ?밐 ?
?    밐 strongerHuang
*************************************************/
void TIMx_DispatchFromISR(void)
{
    last_counter_val = 0;
    elapsed_time = 0;
    TimeDispatch();
}

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{	
//   static tag_CanRxMsg RxMsg;
   Message RxMsg;
   u8 i ;
	 /* Get RX message */
   if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &tCAN.RxHeader, tCAN.RxData) != HAL_OK)
   {
    /* Reception Error */
    Error_Handler();
   } 
        RxMsg.cob_id = tCAN.RxHeader.StdId;
        RxMsg.rtr   = tCAN.RxHeader.RTR;
        RxMsg.len   = tCAN.RxHeader.DLC;
        for(i = 0; i < tCAN.RxHeader.DLC; i++)
     {
		RxMsg.data[i] = (u8)tCAN.RxData[i];
	 }
     canDispatch(&TestSlave_Data, &RxMsg); 
}
7.  初始化文件添加

```c
    unsigned char nodeID = 0x01;                   //쫰왞ID
    setNodeId(&TestSlave_Data, nodeID);
    setState(&TestSlave_Data, Initialisation);
    setState(&TestSlave_Data, Operational);

备注:历经几周的CANOpen 学习,终于完成初步调试,本人确定可用 ,上图可证,具体的NMT,SDO,PDO相关参数还会继续添加调试,毕竟是要上项目的
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32F4 HAL CANopen是一种基于STM32F4系列微控制器的CANopen协议栈实现。CANopen是一种在CAN总线上运行的通信协议,常用于工业自动化领域的设备之间的通信。 通过使用STM32F4 HAL库中提供的CANopen功能,可以简化开发者在STM32F4上实现CANopen通信的的工作。HAL库提供了一系列的API函数,开发者可以使用这些API函数来实现CANopen通信所需的各种功能,例如发送和接收CANopen消息、配置CAN总线参数等。 在使用STM32F4 HAL CANopen时,开发者需要首先初始化CAN总线和CANopen协议栈。然后,可以根据需要配置CAN总线的参数,如波特率、工作模式等。接下来,可以使用HAL库提供的API函数来发送和接收CANopen消息。例如,通过调用HAL_CAN_Transmit函数可以将CANopen消息发送到总线上,而通过调用HAL_CAN_Receive函数可以从总线上接收CANopen消息。此外,还可以使用HAL库提供的其他API函数来实现一些高级功能,如节点管理、心跳等。 STM32F4 HAL CANopen的优点包括使用简单、功能强大、可靠性高等。由于HAL库提供了一系列的API函数,开发者无需深入理解CANopen协议的细节,就可以快速实现CANopen通信。此外,HAL库还提供了丰富的示例代码和开发文档,使得开发者可以更加便捷地进行开发工作。 总而言之,STM32F4 HAL CANopen为开发者提供了一种简单而强大的解决方案,用于在STM32F4微控制器上实现CANopen通信。无论是对于具有CANopen通信需求的工业自动化设备还是其他应用,这种解决方案都能够帮助开发者快速、可靠地实现所需功能。 ### 回答2: STM32F4是意法半导体(STMicroelectronics)公司推出的一款高性能32位ARM Cortex-M4核心微控制器。 CANopen是一种用于控制器区域网络(CAN)的通信协议,它具有广泛应用于工业自动化领域的特点。 STM32F4 HAL库是为STM32F4系列芯片开发的一套硬件抽象层库,可以提供丰富的外设驱动和通用功能函数,使开发者可以更方便地使用STM32F4系列芯片进行应用开发。HAL库中也包含了对CAN外设的支持。 STM32F4 HAL库提供了一系列API函数,可以方便地进行CAN外设的配置和控制。使用这些API函数,开发者可以对CAN外设进行初始化配置、发送和接收CAN消息、设置过滤器、中断处理等操作。 在CANopen协议中,使用CAN消息进行设备之间的通信。通过STM32F4 HAL库,我们可以很容易地实现对CANopen协议的支持。例如,可以使用HAL库提供的CAN发送函数将CANopen格式的消息发送到总线上,并使用CAN接收函数接收其他设备发送的CANopen消息。 此外,为了简化CANopen应用开发,还可以使用第三方的CANopen协议栈库,如CANopenNode、CANopenIA等。这些库提供了更高级的功能,如节点状态管理、PDO(Process Data Objects)传输、SDO(Service Data Objects)传输等。 在使用STM32F4 HAL库进行CANopen开发时,需要配置CAN外设的波特率、过滤器、中断,以及设置CAN消息的发送和接收参数。通过合理的配置和使用HAL库提供的功能,可以很容易地实现CANopen通信,并在工业自动化等领域中应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值