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

📄 main.c

📁 基于stm32f103rb微处理的9路AD采样并上传至can总线
💻 C
字号:
/**********************************************************************************
程序说明:本程序完成人形机器人脚掌传感系统的采样,并通过串口将数据传出
作者:xiaocai_cqu
开始时间:2008/11/9
完成时间: 
**********************************************************************************/

#include "stm32f10x_lib.h"              /* STM32F10x Library Definitions      */

/*变量申明*/
CanTxMsg TxMessage;
CanRxMsg RxMessage;
extern unsigned short int ADC_ConvertedValue[9];
unsigned short int ADC_Can_Buffer[9]={0};//缓存ADC转换结果
bool Flag_RemoteFrame=FALSE;

/* 函数原型申明*/
extern void SetupClock  (void);
extern void SetupADC    (void);		   
extern void SetupGPIO   (void);
void SetupCAN (void);
void NVIC_Configuration(void);
void CAN_Transimit(void);

int main (void)
{
  SetupClock();//配置时钟系统
  SetupGPIO(); //配置端口
  SetupCAN();//配置can
  NVIC_Configuration();//配置嵌套向量中断控制器
  SetupADC();  //配置ADC
  
  while(1)
  {
     if(CAN_MessagePending(CAN_FIFO0))	 //等待FIFO 0中接收到有报文
      {
	    CAN_Receive(CAN_FIFO0, &RxMessage);
	    if(RxMessage.RTR==CAN_RTR_REMOTE)
		 {
		   Flag_RemoteFrame=TRUE;
		 }
	   }
	 //CAN_Transimit();//通过can总线发送数据
//   /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode*/
//   if(Trans_Empty_Flag == TRUE)
//    {
//      Trans_Empty_Flag=FALSE;
//	  /* Turn on led connected to PB.11 pin (LD4) */
//      GPIO_SetBits(GPIOB, GPIO_Pin_11);//标识发送邮箱全部为空
//	  CAN_Transimit();//通过can总线发送数据
//	}
//	else GPIO_ResetBits(GPIOB, GPIO_Pin_11);//标识发送邮箱不全部为空 
   }                 
}

/*******************************************************************************
* 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=ADC_IRQChannel;//can发送中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* Function Name  : CAN_Transimit 注意:最后应该在adc转换结束中断里面写此函数
* Description    : Configures the CAN and transmit,and receive by interruption
* Input          : None
* Output         : None
* Return         : PASSED if the reception is well done, FAILED in other case
*******************************************************************************/
//void CAN_Transimit(void)
//{
//  u16 m=0;//i=0,
//  u8 TransmitMailbox;//存储发送数据后返回的邮箱编号
//   
//  for(m=0;m<9;m++)ADC_Can_Buffer[m]=ADC_ConvertedValue[m];//缓存采样数据
//  
//  /* transmit the first message */
//  TxMessage.StdId=0x0000;
//  TxMessage.ExtId=0x0000;
//  TxMessage.IDE=CAN_ID_STD;//使用标准标识号
//  TxMessage.RTR=CAN_RTR_DATA;
//  TxMessage.DLC=8;
//  TxMessage.Data[0]=(char)(ADC_Can_Buffer[0]>>8);
//  TxMessage.Data[1]=(char)(ADC_Can_Buffer[0]&0x00FF);
//  TxMessage.Data[2]=(char)(ADC_Can_Buffer[1]>>8);
//  TxMessage.Data[3]=(char)(ADC_Can_Buffer[1]&0x00FF);
//  TxMessage.Data[4]=(char)(ADC_Can_Buffer[2]>>8);
//  TxMessage.Data[5]=(char)(ADC_Can_Buffer[2]&0x00FF);
//  TxMessage.Data[6]=(char)(ADC_Can_Buffer[3]>>8);
//  TxMessage.Data[7]=(char)(ADC_Can_Buffer[3]&0x00FF);
//  TransmitMailbox=CAN_Transmit(&TxMessage);
//  while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)){};
//  /* transmit the second message */
//  TxMessage.StdId=0x0000;
//  TxMessage.ExtId=0x0000;
//  TxMessage.IDE=CAN_ID_STD;//使用标准标识号
//  TxMessage.RTR=CAN_RTR_DATA;
//  TxMessage.DLC=8;
//  TxMessage.Data[0]=(char)(ADC_Can_Buffer[4]>>8);
//  TxMessage.Data[1]=(char)(ADC_Can_Buffer[4]&0x00FF);
//  TxMessage.Data[2]=(char)(ADC_Can_Buffer[5]>>8);
//  TxMessage.Data[3]=(char)(ADC_Can_Buffer[5]&0x00FF);
//  TxMessage.Data[4]=(char)(ADC_Can_Buffer[6]>>8);
//  TxMessage.Data[5]=(char)(ADC_Can_Buffer[6]&0x00FF);
//  TxMessage.Data[6]=(char)(ADC_Can_Buffer[7]>>8);
//  TxMessage.Data[7]=(char)(ADC_Can_Buffer[7]&0x00FF);
//  //CAN_Transmit(&TxMessage);
//  TransmitMailbox=CAN_Transmit(&TxMessage);
//  while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)){};
//  /* transmit the third message */
//  TxMessage.StdId=0x0000;
//  TxMessage.ExtId=0x0000;
//  TxMessage.IDE=CAN_ID_STD;//使用标准标识号
//  TxMessage.RTR=CAN_RTR_DATA;
//  TxMessage.DLC=2;
//  TxMessage.Data[0]=(char)(ADC_Can_Buffer[8]>>8);
//  TxMessage.Data[1]=(char)(ADC_Can_Buffer[8]&0x00FF);
//  TxMessage.Data[2]=0;
//  TxMessage.Data[3]=0;
//  TxMessage.Data[4]=0;
//  TxMessage.Data[5]=0;
//  TxMessage.Data[6]=0;
//  TxMessage.Data[7]=0;
//  //CAN_Transmit(&TxMessage);
//  TransmitMailbox=CAN_Transmit(&TxMessage);
//  while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)){};
//
////  CAN_ITConfig(CAN_IT_RQCP0&CAN_IT_RQCP1&CAN_IT_RQCP2, ENABLE);//使能can 发送邮箱空中断(属于发送中断的一种,详见编程指导P271页)
////  CAN_ITConfig(CAN_IT_RQCP1, ENABLE);//使能can 发送邮箱空中断(属于发送中断的一种,详见编程指导P271页)
////  CAN_ITConfig(CAN_IT_RQCP2, ENABLE);//使能can 发送邮箱空中断(属于发送中断的一种,详见编程指导P271页)
//}

/*******************************************************************************
* Function Name  : SetupCAN
* Description    : Configures the CAN 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SetupCAN (void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /*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 register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=ENABLE; //硬件自动启动离线恢复过程
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=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=4; //72MHz/2=36MHz=PCLK1 => PCLK1/4=9000KHz => 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位(FxR0)配置的高16位 MSBs)
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//选择过滤器的标识号(对应一个32位(FxR0)配置的低16位 LSBs)
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//根据模式用来选择过滤器屏蔽号或者标识号(对应一个32位(FxR1)配置的高16位 MSBs)
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//根据模式用来选择过滤器屏蔽号或者标识号(对应一个32位(FxR1)配置的低16位 LSBs)
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//分配FIFO 0给过滤器1
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//can过滤器激活
  CAN_FilterInit(&CAN_FilterInitStructure);//配置滤波器
//  /*使能接受中断*/
//  CAN_ITConfig(CAN_IT_FMP0, ENABLE);
}

⌨️ 快捷键说明

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