⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 LWIP在STM32裸机上的移植
💻 C
字号:
/**
  ******************************************************************************
  * @file    CAN/LoopBack/main.c 
  * @author  MCD Application Team
  * @version V3.3.0
  * @date    04/16/2010
  * @brief   Main program body
  *****************************************************************************/ 

/* Includes ------------------------------------------------------------------*/
#include "can.h"
#include "stm32f10x.h"

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
CAN_InitTypeDef        CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;

CanTxMsg TxMessage;

/* Private function prototypes -----------------------------------------------*/
void CAN_GPIO_Config(void);
void CAN_Config(void);

void Init_RxMes(CanRxMsg *RxMessage);

/* Private functions ---------------------------------------------------------*/
void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--);
}

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
void CAN_Configuration(void)
{
	/* GPIO configuration */
	CAN_GPIO_Config();
   
	/* CANs configuration */
	CAN_Config();

	/* IT Configuration for CAN1 */  
	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
  
	/* IT Configuration for CAN2 */ 
//	CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);  
	CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);	//FIFO1中断使能
}


/**
  * @brief  Configures the GPIOs.
  * @param  None
  * @retval None
  */
void CAN_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Configure CAN1 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
   
  /* Configure CAN2 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure CAN1 TX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Configure CAN2 TX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Remap CAN1 and CAN2 GPIOs */
  GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);	//重映像到PD0,PD1
  GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE);		//重映射到PB5,PB6
}

/**
  * @brief  Configures the CAN.
  * @param  None
  * @retval None
  */
void CAN_Config(void)
{
  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_DeInit(CAN2);
  CAN_StructInit(&CAN_InitStructure);

  /* CAN1 and CAN2 cell init */
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = DISABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;			//ENABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_10tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler = 10; 		//BaudRate = 36M / ((1+10+7)*10) = 36M / 180 = 200KHz
  CAN_Init(CAN1, &CAN_InitStructure);
  CAN_Init(CAN2, &CAN_InitStructure);

  /* CAN1 filter init */
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//(((u32)0x101<<21) & 0xFFFF0000)>>16;						//注意:左对齐
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(((u32)0x101<<21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF; 	//低16位
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;	   //CAN_FilterFIFO0
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  
	/* CAN2 filter init */
	CAN_FilterInitStructure.CAN_FilterNumber = 14;
	CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
	CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
	CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//(((u32)0x101<<21) & 0xFFFF0000)>>16;						//注意:左对齐
	CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(((u32)0x101<<21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF; 	//低16位
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
	CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;  //CAN_FilterFIFO1
	CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
	CAN_FilterInit(&CAN_FilterInitStructure);
  
	/* Transmit */
//	TxMessage.StdId = 0x101;
//	TxMessage.ExtId = 0x01;
//	TxMessage.RTR = CAN_RTR_DATA;
//	TxMessage.IDE = CAN_ID_STD;
//	TxMessage.DLC = 4;  
}

/**
  * @brief  Initializes a Rx Message.
  * @param  CanRxMsg *RxMessage
  * @retval None
  */
void Init_RxMes(CanRxMsg *RxMessage)
{
  uint8_t i = 0;

  RxMessage->StdId = 0x00;
  RxMessage->ExtId = 0x00;
  RxMessage->IDE = CAN_ID_STD;
  RxMessage->DLC = 0;
  RxMessage->FMI = 0;
  for (i = 0; i < 8; i++)
  {
    RxMessage->Data[i] = 0x00;
  }
}

/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -