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