f207vet6 我的can通信怎么不行

2019-03-23 17:58发布

/**
  ******************************************************************************
  * @file    TIM/TIM1_Synchro/main.c
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    18-April-2011
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f2xx.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//  #define KEY_PRESSED     0x00
//  #define KEY_NOT_PRESSED 0x01
vu32 ret;
#define  Uchar  unsigned char

#define BOX_DIS_IDENT         0x9555AA01
#define BOX_CTRL_IDENT        0x9555AAB0

typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
volatile TestStatus TestRx;
ErrorStatus HSEStartUpStatus;
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef        TIM_OCInitStructure;
TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;

GPIO_InitTypeDef         GPIO_InitStructure;

CAN_InitTypeDef         CAN_InitStructure;
CAN_FilterInitTypeDef   CAN_FilterInitStructure;
CanTxMsg                TxMessage;
CanRxMsg                RxMessage;
/* Private function prototypes -----------------------------------------------*/
void TIM1_Config(void);
void TIM1_PWM_Gpio(void);

void TIM2_Config(void);
void TIM2_Gpio(void);

void NVIC_Configuration(void);

void CAN_Config(void);

void Init_RxMes(CanRxMsg *RxMessage);

void can_send_order(Uchar order, Uchar data1, Uchar data2,Uchar data3,Uchar data4);        //发送命令参数




/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f2xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f2xx.c file
     */   

    /* System Clocks Configuration */
    SystemInit();
   /* GPIOA, GPIOB and GPIOC clocks enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);

    /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
   /*TIM2 clock enablae*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
  /* CAN Periph clock enable */
  // RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

  /* TIM1 Configuration */
// TIM_Config();
  NVIC_Configuration();
  TIM1_PWM_Gpio();
  TIM1_Config();

  TIM2_Gpio();
  TIM2_Config();
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  u32 i=0;
  TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);//开启计数中断
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);//开启时钟


  while (1)
  {
  can_send_order(0x1F,0xB0,7,12,0);
  for(i=0;i<=0x1ffff;i++);

  }
}

/**
  * @brief  Configures TIM1, TIM3 and TIM4 Pins.
  * @param  None
  * @retval None
  */

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef  NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  /* Enable the TIM2 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;  //先指定CAN1_RX0_IRQn进入中断口
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;  //阶级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;  //阶层0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
void TIM1_Config()
{
   /* TIM1 Peripheral Configuration ----------------------------------------*/
  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 255;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 4;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  /* Channel 1 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 127;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

  //通道2 TIM_OC1PreloadConfig
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
   TIM_OCInitStructure.TIM_Pulse = 127;
   TIM_OC2Init(TIM1, &TIM_OCInitStructure);
   //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

//通道2 TIM_OC1PreloadConfig
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
   TIM_OCInitStructure.TIM_Pulse = 127;
   TIM_OC3Init(TIM1, &TIM_OCInitStructure);
   //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
   TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);

  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  TIM_BDTRInitStructure.TIM_DeadTime = 5;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

  /* Master Mode selection */
  TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);

  /* Select the Master Slave Mode */
  TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);

  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);

}
void TIM1_PWM_Gpio(void)
{  
  /* GPIOA Configuration: TIM1 Channel1 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Connect TIM pins to AF1 */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8 , GPIO_AF_TIM1);  
   /* Connect TIM pins to AF2 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* Connect TIM pins to AF1 */
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13 , GPIO_AF_TIM1);

  //TIM1的channel2通道设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_TIM1);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* Connect TIM pins to AF1 */
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14 , GPIO_AF_TIM1);
  // GPIO_PinAFConfig(GPIOA, GPIO_PinSource14 , GPIO_AF_TIM1);

  //TIM1的channel3通道设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10 , GPIO_AF_TIM1);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* Connect TIM pins to AF1 */
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15 , GPIO_AF_TIM1);
  // GPIO_PinAFConfig(GPIOA, GPIO_PinSource14 , GPIO_AF_TIM1);
}

void TIM2_Config(void)
{
  TIM_TimeBaseStructure.TIM_Period = 6000;
  TIM_TimeBaseStructure.TIM_Prescaler = 9999;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);//开启计数中断
  /* TIM2 enable counter */
  //TIM_Cmd(TIM2, ENABLE);//开启时钟

}

void TIM2_Gpio(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   /* 硬件连接 示意图
     PA6----->D1
     PD12---->D2
     PA5----->D3
     PA4----->D4
  */
  //  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推免式   还可以配置为开漏模式 可以作为双向io 比如i2c
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//扫描频率100m
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;// GPIO_PuPd_NOPULL = 0x00,GPIO_PuPd_UP     = 0x01, GPIO_PuPd_DOWN   = 0x02 上拉下拉配置
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void CAN_Config(void)
{
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
// CanTxMsg TxMessage;
// CanRxMsg RxMessage;
  GPIO_InitTypeDef  GPIO_InitStructure;
  u32 i = 0,j;
// u8 TransmitMailbox;

  /* CAN GPIOs configuration **************************************************/

  /* Connect CAN pins to AF9 */  //引脚的复用配置(特殊功能配置)
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);

  /* Configure CAN RX pins */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //GPIO_InitStructure.GPIO_OType = GPIO_PuPd_UP;
  //GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  //GPIO_Init(GPIOD, &GPIO_InitStructure);

   /* Configure CAN  TX pins */
   //GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
// GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
//  GPIO_Init(GPIOD, &GPIO_InitStructure);
   /* Configure CAN Remap   不需要重影射 */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* CAN configuration ********************************************************/  
  /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  /* CAN register init */
  CAN_DeInit(CAN1);  //can1寄存器初始化
  CAN_StructInit(&CAN_InitStructure);
  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM = DISABLE;  //  禁止 时间触发通信模式
  CAN_InitStructure.CAN_ABOM = DISABLE;   //  软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测
                                         //到128次11位连续的隐性位,就退出离线状态
  CAN_InitStructure.CAN_AWUM = DISABLE;  //  //睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
  CAN_InitStructure.CAN_NART = DISABLE;  //  按照CAN标准,DISABLE;CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
  CAN_InitStructure.CAN_RFLM = DISABLE;   //  在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有
                                                            //的报文
  CAN_InitStructure.CAN_TXFP = DISABLE;   //发送优先级由报文的标示符决定
  CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;    ////CAN硬件工作在正常模式   
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;   // 重新同步跳跃宽度1个时间单位

  /* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
  CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;    //  时间段1为6个时间单位  主要是控制波特率的////////////////////////////////
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;    //  时间段2为8个时间单位///////////////////////////////////////////////////////////
  CAN_InitStructure.CAN_Prescaler = 4;    //  //(pclk1/((1+8+6)*4)) = 30Mhz/15/4 = 0.5Mhz设定了一个时间单位的长度2
/* 波特率计算方法 */
  /* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)  此处计算为  CANbps=36000000/(45*(4+3+1))=100kHz */                                                                                                                     //此处Tseg1+1 = CAN_BS1_8tp
  /* 配置大方向: Tseg1>=Tseg2  Tseg2>=tq; Tseg2>=2TSJW */
    CAN_Init(CAN1, &CAN_InitStructure);    //

    if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)                
  {

    while(1);
    /* 初始化时先设置CAN_MCR的初始化位 */                                                                                                                 
    /* 然后查看硬件是否真的设置了CAN_MSR的初始化位来确认是否进入了初始化模式  */                                                                                                                                          
  }       
  CAN_FilterInitStructure.CAN_FilterNumber = 0; //滤波器数值  //指定了待初始化的过滤器0

CAN_FilterInitStructure.CAN_FilterNumber = 14;  //滤波器数值

  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;  //指定了过滤器将被初始化到的模式为标识符屏蔽位模式
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //给出了过滤器位宽1个32位过滤器

  //CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;  //用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
// CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;  //用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
  CAN_FilterInitStructure.CAN_FilterIdHigh = ((BOX_CTRL_IDENT<<3)&0xFFFF0000)>>16;
  CAN_FilterInitStructure.CAN_FilterIdLow = (((BOX_CTRL_IDENT)<<3)&0x0000FFFF) | CAN_ID_EXT;


  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;  //用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个

  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;  //设定了指向过滤器的FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;  //使能过滤器
  CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);  //使能指定的CAN1的邮箱0挂起中断使能中断
/* transmit */
  TxMessage.StdId=0x00;
  TxMessage.ExtId = 0x9555AAB0;//0x9555AA01;
  TxMessage.RTR=CAN_RTR_DATA;  //确定传输消息的帧类型
  TxMessage.IDE=CAN_ID_EXT;   //设定消息标示符的类型
  TxMessage.DLC=8;

  /* can 接收设置*/

  RxMessage.StdId = 0x00;//0x00;
  RxMessage.ExtId = 0x9555AAB0;
  RxMessage.IDE=CAN_ID_EXT;  //使用扩展的ID
  RxMessage.DLC=8;
  RxMessage.FMI=0;  //过滤器匹配编号
  for (i = 0;i < 8;i++)
  {
    RxMessage.Data = 0x00;
  }
// CAN_Receive(CAN_FIFO0, &RxMessage);
     /* Enable FIFO 0 message pending Interrupt */
  //CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);  //使能指定的CAN1的邮箱0挂起中断使能中断

}
/*
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 = 0x00;
  }
}

*/

void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

    /* Pin PC.06 toggling with frequency = 73.24 Hz */
   GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)));
   GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));
   GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6)));
   GPIO_WriteBit(GPIOD, GPIO_Pin_12, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_12)));
  }
}

void can_send_order(Uchar order, Uchar data1, Uchar data2, Uchar data3,Uchar data4)//加了一个字节????等待?超时?
{
  int num;
  // CanTxMsg TxMessage;

// TxMessage.Data[0]=0xDE;
// TxMessage.Data[1]=0xCA;
  TxMessage.Data[0] = order;   
  TxMessage.Data[1] = data1;   
  TxMessage.Data[2] = data2;   
  TxMessage.Data[3] = data3;   
  TxMessage.Data[4] = data4;   
  //TxMessage.Data[5] = CAN_DATA5;     
  //TxMessage.Data[6] = CAN_DATA6;   
  //TxMessage.Data[7] = CAN_DATA7;   

  num = CAN_Transmit(CAN1,&TxMessage);  /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */       
  while (CANTXOK != CAN_TransmitStatus(CAN1,num))  
        {

        }      
}


void CAN1_RX0_IRQHandler(void)
{
  //uint8_t CanFlag;
  //uint16_t CAN_ID;
  uint8_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;
  CanRxMsg RxMessage;
  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);  /* 此函数包含释放提出报文了的,在非必要时,不需要自己释放 */
// CAN_ID=RxMessage.StdId;
  CAN_DATA0=RxMessage.Data[0];
  CAN_DATA1=RxMessage.Data[1];
  CAN_DATA2=RxMessage.Data[2];
  CAN_DATA3=RxMessage.Data[3];
  CAN_DATA4=RxMessage.Data[4];
  CAN_DATA5=RxMessage.Data[5];
  CAN_DATA6=RxMessage.Data[6];
  CAN_DATA7=RxMessage.Data[7];
  CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);  /* 清除挂起中断 */
// CanFlag = ENABLE;
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d ", file, line) */

  while (1)
  {}
}

#endif

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。