?? 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 + -