STM32 Cubmx CAN配置2

一、CAN发送

CAN_TxHeaderTypeDef TXHeader;
CAN_RxHeaderTypeDef RXHeader;

uint8_t TXmessage[8] = {0};
uint8_t RXmessage[8];

void CANSendData(void)
{
	uint32_t pTxMailBox;
	
  TXHeader.StdId=0x401 + (BMUID << 3);
	TXHeader.ExtId=0;
	TXHeader.DLC=8;
	TXHeader.IDE=CAN_ID_STD;
	TXHeader.RTR=CAN_RTR_DATA;
	TXHeader.TransmitGlobalTime = DISABLE;
	
	if(rpmFan > 0)
	{
	  TXmessage[0] = 1;//Fan working
	}
	else
	{
	  TXmessage[0] = 0;
	}
	TXmessage[1] = 0;
	TXmessage[2] = 0;
	TXmessage[3] = 0;
	TXmessage[4] = 0;
	TXmessage[5] = 0;
	TXmessage[6] = 0;
	TXmessage[7] = 0;
	
	if((BMUID != 0) && (CANSendEn_flg == 1))
	{
	  HAL_CAN_AddTxMessage(&hcan,&TXHeader,TXmessage,&pTxMailBox);
	}
}

二、CAN接收

CAN接收通常是通过中断接收,并将接收的信息暂存到一个buffer里,并周期性的去处理接收到的信息。

1.CAN接收中断,调用RXDateStackPress()函数,将接收信息压缩进buffer里

#define CAN_BUF_SIZE 100

#define BT_BASIC_TX_CAN_ID              0x703
#define BT_BASIC_RX_CAN_ID              0x702
#define BT_SERVER_TX_CAN_ID             (BT_BASIC_TX_CAN_ID | (BMUID<<3)) 
#define BT_SERVER_RX_CAN_ID             (BT_BASIC_RX_CAN_ID | (BMUID<<3))

#define BT_SERVER_CAN_CHL               0x00

typedef union
{
  uint8_t W[19];
  struct
  {
    uint32_t TimeStamp;
    uint8_t  Channel;
    uint8_t  DLC;
    uint8_t  IDE;
    uint32_t ID;
    uint8_t  Data[8];
  } B;     /* Big-endian */
}CANBUF_tag; /* CAN Buffer */


typedef struct
{
  uint8_t Channel;
  uint32_t ID;
  uint8_t Length;
  uint8_t Extended;
  uint8_t Remote;
  uint8_t Data[8];
}CAN_APP_DATATYPE;



CAN_TxHeaderTypeDef TXHeader;
CAN_RxHeaderTypeDef RXHeader;

uint8_t TXmessage[8] = {0};
uint8_t RXmessage[8];

CANBUF_tag CanBuf[CAN_BUF_SIZE];
uint32_t can_rx_idx=0;
uint32_t can_rd_idx=0;

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	uint8_t RXmessage[8] = {0};
	
	if(hcan->Instance==CAN)
	{
		if(HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&RXHeader,RXmessage) == HAL_OK)
    {
      RXDateStackPress(hcan, CAN_RX_FIFO0, &RXHeader, RXmessage);
    }
  }
}


void RXDateStackPress(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])
{

    	CanBuf[can_rx_idx].B.TimeStamp = 0;
		CanBuf[can_rx_idx].B.Channel = 0;
		if(pHeader->IDE == 4)
		{
			CanBuf[can_rx_idx].B.ID   = pHeader->ExtId;
		}
		else
		{
			CanBuf[can_rx_idx].B.ID   = pHeader->StdId;
		}
		CanBuf[can_rx_idx].B.DLC = pHeader->DLC;  
		CanBuf[can_rx_idx].B.IDE = pHeader->IDE;
		memcpy(&CanBuf[can_rx_idx].B.Data, &aData[0], pHeader->DLC);
		
		can_rx_idx++;
		if(can_rx_idx >= CAN_BUF_SIZE)
		{
			can_rx_idx = 0;
		}
}

2.周期性的检查buffer中是否有未处理的数据

void HandleRXData(void)
{

  CANBUF_tag iCanBufStr;
  uint8_t rx_data[8];
  uint8_t rx_dlc;
  uint16_t rx_id;

	if(RXDateStackPop(&iCanBufStr))//received can buff not handle finish
	{
		memcpy(rx_data,iCanBufStr.B.Data,iCanBufStr.B.DLC);
		rx_id = iCanBufStr.B.ID;
		rx_dlc = iCanBufStr.B.DLC;
		
		//boot message
		if((rx_id == BT_SERVER_RX_CAN_ID)
		&& (rx_dlc == 8)
		&& (rx_data[0] == 0x02)
		&& (rx_data[1] == 0x10)
		&& (rx_data[2] == 0x03))
		{
           vStartBootLoader();			
		} 
  }
}


uint8_t RXDateStackPop(CANBUF_tag *tmp_buf)
{
  uint8_t SearchMsgResult = 0;

  if(can_rx_idx != can_rd_idx)
  {
    *tmp_buf = CanBuf[can_rd_idx];
    can_rd_idx++;
    if(can_rd_idx >= CAN_BUF_SIZE)
    {
      can_rd_idx = 0;
    }
    SearchMsgResult =1;
  }
  return SearchMsgResult;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32CubeMX中配置FFT需要进行以下步骤: 1. 打开STM32CubeMX软件并创建一个新的工程。 2. 选择你的目标STM32微控制器型号。 3. 在"Pinout & Configuration"选项卡中配置你的引脚和外设。 4. 在"Middleware"选项卡中找到"FFT"并勾选它。 5. 在"Configuration"选项卡中,你可以选择使用定点或浮点FFT实现方式。如果选择浮点FFT,你可以设置FFT的长度和其他参数。 6. 点击"Project"菜单中的"Generate Code"按钮生成代码。 7. 导入生成的代码到你的开发环境中,并根据需要进行修改和配置。 以上是在STM32CubeMX中配置FFT的基本步骤。具体的配置细节和代码实现可以参考ST官方文档和参考资料\[1\]\[2\]\[3\]中提供的信息。 #### 引用[.reference_title] - *1* [STM32CubeMx移植DSP库 傅立叶变化(FFT)测试](https://blog.csdn.net/weixin_45107609/article/details/127509780)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32 DSP库CUBEMX配置+FFT频率计算](https://blog.csdn.net/qq_59953808/article/details/131405743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值