基于STM32的CAN通讯已在实际项目中应用Word格式文档下载.docx
《基于STM32的CAN通讯已在实际项目中应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于STM32的CAN通讯已在实际项目中应用Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
所以can时钟72MHZ/2/4=9Mhz,tq=1/36Mhz
波特率为1/nominalbittime=9/9=1MHZ
=====================================================================
voidCAN_Configuration(void)
{
CAN_InitTypeDef
CAN_InitStructure;
CAN_FilterInitTypeDef
CAN_FilterInitStructure;
/*CANregisterinit*/
CAN_DeInit();
CAN_StructInit(&
CAN_InitStructure);
/*CANcellinit*/
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_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler=200;
CAN_Init(&
/*CANfilterinit*/
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&
CAN_FilterInitStructure);
}
波特率10K,公式:
72MHZ/2/200/(1+9+8)=0.01,即10Kbps
正文篇:
程序代码
/*Includes------------------------------------------------------------------*/
#include"
stm32f10x.h"
platform_config.h"
stm32f10x_rcc.h"
stm32f10x_flash.h"
stm32f10x_usart.h"
stm32f10x_gpio.h"
stm32f10x_tim.h"
stdio.h"
ErrorStatusHSEStartUpStatus;
voidUart1_PutChar(u8ch);
unsignedintj;
//j=2-8
/*Privatetypedef-----------------------------------------------------------*/
typedefenum{FAILED=0,PASSED=!
FAILED}TestStatus;
//状态量
__IOuint32_tret=0;
//用于中断返回的传递变量
volatileTestStatusTestRx;
CanTxMsgTxMessage;
CanRxMsgRxMessage;
unsignedcharread_temp;
unsignedcharopen_temp,stop_temp,top_temp;
uint16_tCCR1_Val=0;
#definestart50
#defineaccelerate10
#definePeriod999
#definePrescaler9
//doublepercent=0.9;
vu32counter=0;
vu32compare;
uint16_tHigh_fre=900;
unsignedintTulun_i=0;
//500次作为一个脉冲
GPIO_InitTypeDefGPIO_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
//Privatefunctions函数---------------------------------------------------------*/
voidUART_Init(void);
voidRCC_Configuration(void);
//申明时钟初始化函数
voidGPIO_Configuration(void);
//申明IO初始化函数
voidNVIC_Configuration(void);
//申明中断管理器初始化函数
voidCAN_Configuration(void);
//申明CAN初始化函数
voidCAN_TX(unsignedcharadd,unsignedchardata1,unsignedchardata2);
//申明CAN发送函数
TestStatusCAN_RX(void);
//申明带返回参数的CAN接收函数
voidLED_RESET(void);
voidPWM_startN(void);
voidPWM_start(void);
/******Mainprogram***********/
intmain(void)
{
u32n;
/*系统时钟初始化*/
RCC_Configuration();
/*中断管理器初始化*/
NVIC_Configuration();
/*IO初始化*/
GPIO_Configuration();
UART_Init();
//初始化串口函数
/*CAN初始化*/
CAN_Configuration();
TIM_TimeBaseStructure.TIM_Period=Period;
TIM_TimeBaseStructure.TIM_Prescaler=Prescaler;
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&
TIM_TimeBaseStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
while
(1)
{
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
//开接收中断
for(n=0;
n<
10000;
n++);
//延时
if(ret==1)
{
for(j=0;
j<
8;
j++)//发送8组数据到串口
{
Uart1_PutChar(RxMessage.Data[j]);
}
open_temp=RxMessage.Data[0];
top_temp=RxMessage.Data[1];
stop_temp=RxMessage.Data[2];
switch(open_temp)
{
case01:
PWM_start();
break;
case02:
PWM_startN();
break;
default:
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
ret=0;
}
}
/*开始输出PWM*/
voidPWM_start(void)
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=1000-CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC3Init(TIM2,&
TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Disable;
TIM_OC2Init(TIM2,&
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);
/*PWM1Modeconfiguration:
Channel2*/
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
TIM_ARRPreloadConfig(TIM2,ENABLE);
switch(top_temp)
High_fre=100;
High_fre=500;
case03:
High_fre=900;
switch(stop_temp)
compare=100000;
compare=200000;
compare=50000;
TIM_Cmd(TIM2,ENABLE);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
/*TIM2enablecounter*/
/*停止输出PWM*/
voidPWM_startN(void)
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);
voidTIM2_IRQHandler(void)
staticunsignedinti=0;
staticunsignedintj=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!
=RESET)
if(counter<
compare)
if(i<
(High_fre-start)/accelerate)
TIM2->
CCR2=1000-(start+i*accelerate);
CCR3=1000-(start+i*accelerate);
Tulun_i++;
counter++;
if(Tulun_i==500)
i++;
Tulun_i=0;
}
else
CCR2=1000-High_fre;
CCR3=1000-High_fre;
if(counter==compare)
CCR2=1000-(start+i*accelerate-j*accelerate);
CCR3=1000-(start+i*accelerate-j*accelerate);
j++;
if(j==i)
CCR2=1000;
TIM2->
CCR3=1000;
if(Tulun_i==0)
TIM_Cmd(TIM2,DISABLE);
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
i=0;
j=0;
counter=0;
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
/*关LED*/
voidLED_RESET(void)
GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)0x00);
//关LED
GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)0x00);
/*******************************************************************************
Configuresthedifferentsystemclocks.
*******************************************************************************/
voidRCC_Configuration(void)
ErrorStatusHSEStartUpStatus;
/*RCCsystemreset(fordebugpurpose)*/
RCC_DeInit();
//时钟控制寄存器全部恢复默认值
/*EnableHSE*/
RCC_HSEConfig(RCC_HSE_ON);
//外部高速时钟源开启(8M晶振)
/*WaittillHSEisready*/
HSEStartUpStatus=RCC_WaitForHSEStartUp();
//等待外部时钟就绪
if(HSEStartUpStatus==SUCCESS)//如果时钟启动成功
/*HCLK=SYSCLK*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//定义AHB设备时钟为系统时钟1分频
/*PCLK2=HCLK*/
RCC_PCLK2Config(RCC_HCLK_Div1);
//定义AHB2设备时钟为HCLK时钟1分频
/*PCLK1=HCLK/2*/
RCC_PCLK1Config(RCC_HCLK_Div2);
//定义AHB1设备时钟为HCLK时钟2分频
/*Flash2waitstate*/
FLASH_SetLatency(FLASH_Latency_2);
//设定内部FLASH的的延时周期为2周期
/*EnablePrefetchBuffer*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//使能FLASH预存取缓冲区
/*PLLCLK=8MHz*9=72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//配置PLL时钟为外部高速时钟的9倍频
/*EnablePLL*/
RCC_PLLCmd(ENABLE);
//使能PLL时钟
/*WaittillPLLisready*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL时钟设置完成准备就绪
/*SelectPLLassystemclocksource*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//使用PLL时钟作为系统时钟源
/*Wai