本帖最后由 相信哥咯 于 2011-7-23 15:43 编辑
----------------------------------
我快被它搞残了
------------------------------------------
main()
{
unsigned int a;
RCC_Configuration();
/*初始化 GPIOC时钟*/
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
USART_Configuration();
Delay(10);
CAN_configure();
// LedInit();
while(1)
{
//CAN_ClearFlag(CAN_FLAG_BOF);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
Delay(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
Delay(10);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
Delay(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
Delay(10);
can_send(0x57);
a=can_rev();
USART1_Putc(a);
}
}
--------------------------------------------------------------------------------------------------
#include"stm32f10x_lib.h"
void CAN_configure(void)
{
u8 wrong;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*can register int*/
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_LoopBack;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=5;
wrong=CAN_Init(&CAN_InitStructure);
while(wrong==CANINITFAILED){}
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//((u32)0x0020<<21)>>16;//标识符
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//(((u32)0x0020<<21)|CAN_ID_STD|CAN_RTR_DATA);//
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
// CAN_ITConfig(CAN_IT_FMP0, ENABLE);
}
void can_send(unsigned char data)
{
CanTxMsg TxMessage;
u8 TransmitMailbox = 0;
TxMessage.StdId=0x0020;//标识符
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.IDE=CAN_ID_STD;
TxMessage.DLC=2;
TxMessage.Data[0]=data;
TxMessage.Data[1]=0xFE;
TransmitMailbox=CAN_Transmit(&TxMessage);
while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送
}
unsigned char can_rev(void)
{
CanRxMsg RxMessage;
RxMessage.StdId=0x11;//不需要设置
RxMessage.IDE=CAN_ID_STD;
RxMessage.DLC=2;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
while (CAN_MessagePending(CAN_FIFO0)==0);//等到接收
CAN_Receive(CAN_FIFO0, &RxMessage);
CAN_FIFORelease(CAN_FIFO0);
return RxMessage.Data[0];
}
-------------------------------------------------------------------------------------------------
void RCC_Configuration(void)
{
//***
ErrorStatus HSEStartUpStatus;
//***
//* system clocks configuration -----------------系统时钟配置-------------------///
//* RCC system reset(for debug purpose) //
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
//* Enable HSE *
RCC_HSEConfig(RCC_HSE_ON); //开启外部高速晶振(HSE)
//* Wait till HSE is ready /
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振
if(HSEStartUpStatus == SUCCESS) //若成功起振,(下面为系统总线时钟设置)
{
//* Enable Prefetch Buffer /
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存
//* Flash 2 wait state /
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值)
//* HCLK = SYSCLK /
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟=72 MHz
//* PCLK2 = HCLK/2 /
RCC_PCLK2Config(RCC_HCLK_Div2); //设置APB1时钟=36 MHz(APB1时钟最大值)
//* PCLK1 = HCLK/2 /
RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB2时钟=72 MHz
//* Configure ADCCLK such as ADCCLK = PCLK2/2 /
// RCC_ADCCLKConfig(RCC_PCLK2_Div2); //RCC_PCLK2_Div2,4,6,8
//* PLLCLK = 8MHz * 9 = 72 MHz /
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数)
//* Enable PLL /
RCC_PLLCmd(ENABLE);
//* Wait till PLL is ready /
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//* Select PLL as system clock source /
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//* Wait till PLL is used as system clock source /
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
//*****
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
//***/
}
|