你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
jeffhe1 发表于 2020-3-13 08:41 學習中,謝謝
意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器
然后添加如下几个功能函数:
void CAN_Filter_Init(CAN_FilterTypeDef * pFilter,
uint32_t IdHigh,
uint32_t IdLow,
uint32_t MaskIdHigh,
uint32_t MaskIdLow,
uint32_t FIFOAssignment,
uint32_t Bank,
uint32_t Mode,
uint32_t Scale,
uint32_t Activation,
uint32_t SlaveStartFilterBank)
{
pFilter->FilterIdHigh = 0; //32 位 ID
pFilter->FilterIdLow = 0;
pFilter->FilterMaskIdHigh = 0; //32 位 MASK
pFilter->FilterMaskIdLow = 0;
pFilter->FilterFIFOAssignment = CAN_FILTER_FIFO0; // FIFO0
pFilter->FilterBank = 0;
pFilter->FilterMode = CAN_FILTERMODE_IDMASK;
pFilter->FilterScale = CAN_FILTERSCALE_32BIT; //32 位
pFilter->FilterActivation = ENABLE; // //激活过滤器 0
pFilter->SlaveStartFilterBank = 0;
}
/***********************CAN通信发送函数***************************/
void CAN_TxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef * pTxHeader, uint8_t aData[], uint8_t DLC)
{
uint32_t Tx_MailBox;
pTxHeader->DLC = DLC;
while(HAL_CAN_AddTxMessage(hcan, pTxHeader, aData, &Tx_MailBox) != HAL_OK)
{
printf("TxMsg Failed!!");
HAL_Delay(100);
}
printf("\nSend Tx Message Success!!Tx_Mail:%d", Tx_MailBox);
}
void User_CAN1_TxMessage(uint8_t aTxData[], uint8_t DLC)
{
CAN_TxMessage(&hcan, &hCAN1_TxHeader, aTxData, DLC);
}
/*********************** CAN启动测试函数****************************/
void CAN_Configuration(CAN_TxHeaderTypeDef * pTxHeader,
CAN_FilterTypeDef * pFilter,
uint32_t StdId,
uint32_t ExtId,
uint32_t IDE,
uint32_t RTR,
uint32_t DLC,
uint32_t IdHigh,
uint32_t IdLow,
uint32_t MaskIdHigh,
uint32_t MaskIdLow,
uint32_t FIFOAssignment,
uint32_t Bank,
uint32_t Mode,
uint32_t Scale,
uint32_t Activation,
uint32_t SlaveStartFilterBank)
{
CAN_TxHeader_Init(pTxHeader, StdId, ExtId, IDE, RTR, DLC);
CAN_Filter_Init(pFilter, IdHigh, IdLow, MaskIdHigh, MaskIdLow, FIFOAssignment, Bank, Mode, Scale, Activation, SlaveStartFilterBank);
HAL_CAN_ConfigFilter(&hcan, pFilter);
while(HAL_CAN_Start(&hcan) != HAL_OK )
{
printf("\nCAN_Start Failed!!");
HAL_Delay(100);
}
printf("\nCAN_Start Success!!");
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
}
配置完成后,在stm32f3xx_it.c文件中添加CAN接收中断函数,
void CAN_RX1_IRQHandler()
{
HAL_CAN_RxFifo0MsgPendingCallback(&hcan);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
uint8_t aRxData[8], i;
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hCAN1_RxHeader, aRxData) == HAL_OK)
{
printf("\nGet Rx Message Success!!\nData:");
for(i=0; i<8; i++)
printf("%x ", aRxData[i]);
}
}
最后为main.c文件内容
int main(void)
{
uint8_t TxData[8] = {0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89};
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CAN_Init();
MX_USART1_UART_Init();
__HAL_CAN_ENABLE_IT(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING); //CAN中断使能函数
User_CAN_Configuration();
while (1)
{
User_CAN1_TxMessage(TxData, 8);
HAL_Delay(1000);
}
}
实验结果:
程序编译成功后,下载到板卡,两块板卡其中一块可以将main.c的while中的User_CAN1_TxMessage(TxData, 8);函数屏蔽掉,专门用来接收数据,另一个则每隔1秒发送一次数据,打开两个串口通信助手,就可以看到如下信息;
感谢支持