stm32HAL库学习应用笔记之CAN通讯

既然是HAL库的话怎么配置代码此处就省略了哈…
CAN通讯原理详情什么的请看这篇文章STM32(HAL)——CAN通信
这篇文章写的已经很详细了,也可以去看看原子哥的视屏介绍,两节课,介绍的很详细。
上代码:

usr_can.h

#ifndef USR_CAN_USR_CAN_H_
#define USR_CAN_USR_CAN_H_
#include "main.h"
#include "can.h"
typedef struct
{
	uint8_t can_rxDat:1;//can接收到数据
}Can_RXTX_FLAG;


void CANx_SendMessage(CAN_HandleTypeDef *hcan,uint16_t ID, uint8_t *Data,uint16_t Len);
uint8_t CANx_SendExtData(CAN_HandleTypeDef* hcan,uint32_t ID,uint8_t *pData,uint16_t Len);
void CAN_Start(CAN_HandleTypeDef *hcan);


#endif /* USR_CAN_USR_CAN_H_ */

usr_can.c

#include "usr_can.h"
CAN_DATA_Packeg canTX_Packeg,canRX_Packeg;
Can_RXTX_FLAG canFlag;

uint8_t CanRecBuffer[256];

//发送标准帧的函数
void CANx_SendMessage(CAN_HandleTypeDef *hcan,uint16_t ID, uint8_t *Data,uint16_t Len)
{
	static CAN_TxHeaderTypeDef TxHeader;

	TxHeader.StdId = ID;
	TxHeader.ExtId = 0;
	TxHeader.IDE = CAN_ID_STD;
	TxHeader.RTR = CAN_RTR_DATA;
	TxHeader.DLC = 8;

	if(HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX0) != HAL_OK)
	{
		if(HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX1) != HAL_OK)
		{
			HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX2);
		}
	}
}


 void CAN_Start(CAN_HandleTypeDef *hcan)
 {
 	HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);
 	HAL_CAN_Start(hcan);
 }


 /*******************************************************************************
 * Function Name  : HAL_CAN_RxFifo0MsgPendingCallback
 * Description    : 消息接收回调函数
 * Input          : hcan
 * Output         : None
 * Return         : None
 *******************************************************************************/
 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
 {
	 if(hcan->Instance == CAN1)
	 {
		 CAN_RxHeaderTypeDef RxHeader;//接收句柄

		if( HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, (uint8_t *)&CanRecBuffer) == HAL_OK)
		{
			 canFlag.can_rxDat = true;
		}
	 }
 }

需要注意的是在初始化阶段需要先调用

 CAN_Start(&hcan1);

main.c


#include "can.h"


int main()
{
	uint16_t CAN_ID = 0x1234;
	uint8_t canTxAarray[7]="hello\r\n"
	//此处省略初始化代码
	 CAN_Start(&hcan1);
	
	while(1)
	{
		CANx_SendMessage(&hcan1,CAN_ID ,(uint8_t *)&canTxAarray,sizeof(canTxAarray));
		HAL_Delay(1000);
	}
}


至此 你的Can 的另一个接收端就能收到 "hello"字符了

不然发送函数不能使用哈
can配置如下
波特率500kbps
在这里插入图片描述
在这里插入图片描述
代码亲测可用哦,有啥问题欢迎私信或者评论在下方

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
在使用STM32 HAL库进行CAN发送时,你可以按照以下步骤进行配置和编写代码: 1. 首先,包含所需的头文件和库文件。引用中的代码片段中包含了一些常见的头文件,比如"main.h"和"can.h"。确保你的工程中已经包含了这些文件。 2. 然后,你需要定义一个CAN_RXTX_FLAG结构体,用于标记CAN是否接收到数据。 3. 然后,你可以编写CANx_SendMessage函数,该函数用于发送CAN消息。函数的参数包括CAN_HandleTypeDef结构体指针hcan,表示CAN总线的句柄;ID,表示消息的标识符;Data,表示要发送的数据;Len,表示数据的长度。 4. 如果需要发送扩展数据帧,你可以使用CANx_SendExtData函数。该函数的参数和功能与CANx_SendMessage函数类似。 5. 最后,你可以使用CAN_Start函数来启动CAN总线。 请注意,以上是一种使用STM32 HAL库进行CAN发送的示例。具体的配置和代码可能会因为不同的设备和需求而有所不同。你可以参考引用中提到的文章或视频来获取更详细的信息,并根据你的具体情况进行配置和编写代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [stm32HAL库学习应用笔记之CAN通讯](https://blog.csdn.net/qq_33954661/article/details/124883658)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Can 总线资料和STM32HAL库配制说明](https://download.csdn.net/download/cos12a/20008535)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值