📄 main.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 + -