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

📄 main.c

📁 通过can总线接收9路AD采样并通过串口上传值PC机
💻 C
字号:
/*************************************************************************************************
程序说明:本程序通过can总线,接收下级脚掌传感数据采样控制器的数据,并通过串口将数据传到上位机显示
作者:xiaocai_cqu
开始时间:2008/11/26
完成时间: 
*************************************************************************************************/
#include <stm32f10x_lib.h>              /* STM32F10x Library Definitions      */
#include <stdio.h>

/* 函数原型申明 */
void CAN_Configuration(void);
extern void SetupClock  (void);
extern void SetupGPIO    (void);
extern void SetupUART   (void);
extern int SendChar(int ch);

/* 变量申明 */
u8 CAN_ReceiveData[18]={0};
CanRxMsg RxMessage;
CanTxMsg TxMessage;
u8 FrameNumber=0;

int main (void)
{
  int i;
  SetupClock();//设置系统时钟
  SetupGPIO();//设置端口
  SetupUART();//设置串口
  CAN_Configuration();
  while (1)
   {
//      if(FrameNumber==3)
//	   {
//		 FrameNumber=0;
//		 CAN_ITConfig(CAN_IT_FMP0, DISABLE);//停止接收can总线数据,防止数据覆盖
//		 for(i=0;i<16;i++)
//	      {
//		   SendChar((int)CAN_ReceiveData);
//	      }
//		 CAN_ITConfig(CAN_IT_FMP0,ENABLE);//继续接收can总线数据
//	   }

      if(0!=CAN_MessagePending(CAN_FIFO0))
	  {
	    CAN_Receive(CAN_FIFO0, &RxMessage);//将接受到的数据存储到定义的接受结构体RxMessage里面
        for(i=0;i<8;i++)
	      {
		   SendChar((int)RxMessage.Data[i]);
		   //printf("AD value = 0x%04X\r\n", RxMessage.Data[i]);
	      }
	    if(RxMessage.DLC==2)
	      {
		   u8 TransmitMailbox = 0;
		   TransmitMailbox=CAN_Transmit(&TxMessage);//发送远程控制帧,请求数据
           while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)){};
		  }
	  }
    }                   
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the NVIC and Vector Table base address.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
 // NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

//  /* enabling interrupt */
//  NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel;//can发送终端通道
//  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//  NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* Function Name  : CAN_Configuration
* Description    : Configures the CAN.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void CAN_Configuration(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  
  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN 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;
  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=4; //72MHz/2=36MHz=PCLK1 / 4 => 9000KHz / (1+10+7) => 500KHz
  CAN_Init(&CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;//选择将要被初始化的过滤器,其值为0-13
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//选择需要被初始化的模式:标识/屏蔽模式,或者标识列表模式(CAN_FilterMode_IdList)
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//配置过滤器规模:一个32位或者2个16位
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//选择过滤器的标识号(对应一个32位配置的高16位 MSBs)
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//选择过滤器的标识号(对应一个32位配置的低16位 LSBs)
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//根据模式用来选择过滤器屏蔽号或者标识号(对应一个32位配置的高16位 MSBs)
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//根据模式用来选择过滤器屏蔽号或者标识号(对应一个32位配置的低16位 LSBs)
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//分配FIFO 0给过滤器1
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//can过滤器激活
  CAN_FilterInit(&CAN_FilterInitStructure);//配置滤波器

  /*TxMessage初始化为:远程控制帧*/
  TxMessage.StdId=0x0000;
  TxMessage.ExtId=0x0000;
  TxMessage.IDE=0;//标准标志符
  TxMessage.RTR=CAN_RTR_REMOTE;//远程帧
  TxMessage.DLC=3;//发送数据长度
  TxMessage.Data[0]=0x00;//接受字节0
  TxMessage.Data[1]=0x00;//接受字节1
  TxMessage.Data[2]=0x00;//接受字节2
  TxMessage.Data[3]=0x00;//接受字节3
  TxMessage.Data[4]=0x00;//接受字节4
  TxMessage.Data[5]=0x00;//接受字节5
  TxMessage.Data[6]=0x00;//接受字节6
  TxMessage.Data[7]=0x00;//接受字节7

  /*RxMessage初始化*/
  RxMessage.StdId=0x0000;
  RxMessage.ExtId=0x0000;
  RxMessage.IDE=0;//标准标志符
  RxMessage.RTR=0;//数据帧
  RxMessage.DLC=0;//发送数据长度
  RxMessage.FMI=0;//过滤器匹配序列号
  RxMessage.Data[0]=0x00;//接受字节0
  RxMessage.Data[1]=0x00;//接受字节1
  RxMessage.Data[2]=0x00;//接受字节2
  RxMessage.Data[3]=0x00;//接受字节3
  RxMessage.Data[4]=0x00;//接受字节4
  RxMessage.Data[5]=0x00;//接受字节5
  RxMessage.Data[6]=0x00;//接受字节6
  RxMessage.Data[7]=0x00;//接受字节7
   
  /* CAN FIFO0 message pending interrupt enable */ 
 // CAN_ITConfig(CAN_IT_FMP0, ENABLE);

//  while (!CAN_MessagePending(CAN_FIFO0));	 //等待FIFO 0中接收到有报文
//  CAN_Receive(CAN_FIFO0, &RxMessage);
//  return (TestStatus)1;//返回ret,当ret为非零时,表示发送成功;若为0则表示发送失败

}

⌨️ 快捷键说明

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