基于STM32的CAN总线的数据采集卡设计

发布时间 : 星期日 文章基于STM32的CAN总线的数据采集卡设计更新完毕开始阅读

}

while(RCC_GetSYSCLKSource() != 0x08); }

/* 打开APB2总线上的GPIOA时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USA

RT1|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1, ENABLE);

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

void USART_Configuration(void) { }

USART_Cmd(USART1,ENABLE);

USART_InitStructure.USART_BaudRate = 9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl =

USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART1,&USART_InitStructure);

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;

USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1 , &USART_ClockInitStructure); USART_InitTypeDef USART_InitStructure;

USART_ClockInitTypeDef USART_ClockInitStructure;

USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_HardwareFlowControl_None;

23

#if PRINTF_ON

int fputc(int ch,FILE *f) { }

USART_SendData(USART1,(u8) ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); return ch;

4.2CAN 总线节点的软件设计

CAN 总线节点的软件设计主要包括三大部分:CAN 节点初始化、报文发送和报文接收。熟悉这三部分程序的设计, 就能编写出利用 CAN 总线进行通信的一般应用程序。当然要将 CAN 总线应用于通信任务比较复杂的系统中还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。下面仅就前面提到的三部分程序的设计作一个描述,以供大家在实际应用中参考。

(一)初始化子程序

/*********************************************************************************

功能说明:CAN1模式初始化配置

CAN1的过滤器为0~13,过滤器关联到FIFO 0

*********************************************************************************/

void CAN1_Mode_Init(void) {

GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);//使能PORTD时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟

24

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽

GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化IO CAN1 TX

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入

GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化IO CAN1 RX

GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE); //CAN1完全重映射到PD0,PD1

CAN_DeInit(CAN1); //复位CAN寄存器

CAN_StructInit(&CAN_InitStructure); //填充CAN参数结构体成员为缺省值 //CAN单元设置

CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 //

CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 //

CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//

CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 //

CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 //

CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 //

CAN_InitStructure.CAN_Mode= CAN_Mode_Normal; //模式设置: mode:0,普通模式;1,回环模式; // //设置波特率

//CAN 波特率 = RCC_APB1Periph_CAN / Prescaler /(sjw + bs1 +bs2) //CAN 波特率 = 36000000/8/(1+4+4)=500kbps

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重复同步跳跃宽度为个实际单位

CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //时间段1占用4个时间单位

CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq; //时间段2占用4个时间单位

CAN_InitStructure.CAN_Prescaler = 8; //分频系数为8 CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1

25

CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽位模式

CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //过滤器位宽32位

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位滤波器ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK ID CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0 CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化 CAN1

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 主优先级为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 次优先级为0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许. }

/**********************************************************************************

功能说明:CAN2模式初始化配置

CAN2的过滤器配置为14~28,过滤器关联到FIFO 1

**********************************************************************************/

void CAN2_Mode_Init(void) {

GPIO_InitTypeDef GPIO_InitStructure;

CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

26

联系合同范文客服:xxxxx#qq.com(#替换为@)