STM32F103标准库开发----CAN总线通信实验----初始化/波特率

发布者:程序界的行者最新更新时间:2022-09-19 来源: csdn关键字:STM32F103  CAN总线通信  初始化  波特率 手机看文章 扫描二维码
随时随地手机看文章

一、CAN总线通信初始化配置

1. CAN总线通信初始化配置流程

CAN总线GPIO和时钟配置

CAN总线接收中断优先级配置

CAN总线初始化配置


2. CAN总线GPIO和时钟配置

CAN引脚配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

CAN时钟配置:

在这里插入图片描述
在这里插入图片描述

PA11和PA12引脚,CAN GPIO初始化,具体代码如下:


/*CAN GPIO 和时钟配置 */

void CAN_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure; 

/*GPIOA端口时钟使能*/  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                          

/* CAN1 模块时钟使能 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 


/* Configure CAN pin: RX */ // PA11

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

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

GPIO_Init(GPIOA, &GPIO_InitStructure);

  

/* Configure CAN pin: TX */   // PA12

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

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

GPIO_Init(GPIOA, &GPIO_InitStructure);

}


PB8和PB9引脚,CAN GPIO初始化,具体代码如下:


/*CAN GPIO 和时钟配置 */

void CAN_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure; 

/* 复用功能和GPIOB端口时钟使能*/  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);                          


/* CAN1 模块时钟使能 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 


/* Configure CAN pin: RX */ // PB8

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

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

GPIO_Init(GPIOB, &GPIO_InitStructure);

  

/* Configure CAN pin: TX */   // PB9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

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

GPIO_Init(GPIOB, &GPIO_InitStructure);

  

//#define GPIO_Remap_CAN    GPIO_Remap1_CAN1 

GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);  

}


3. CAN总线接收中断优先级配置

具体代码如下:


/*CAN RX0 中断优先级配置  */

void CAN_NVIC_Configuration(void) 

 {

    NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);


/* enabling interrupt */

  NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}


4. CAN总线初始化配置

具体代码如下:


void CAN_INIT(void) 

{

CAN_InitTypeDef        CAN_InitStructure;

CAN_FilterInitTypeDef  CAN_FilterInitStructure;


/* CAN register init */

CAN_DeInit(CAN1); //将外设CAN的全部寄存器重设为缺省值

CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入


/* 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;//没有使能接收FIFO锁定模式

CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级

CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN设置为正常模式

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位

CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; //时间段1为9个时间单位

CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位

CAN_InitStructure.CAN_Prescaler=6;  //时间单位长度为6    500k

CAN_Init(CAN1,&CAN_InitStructure);

                                      //波特率为:36M/6(1+9+2)=0.5 即500K


/* CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式

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

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;// 过滤器标识符的低16位值

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;// 过滤器屏蔽标识符的低16位值

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器

CAN_FilterInit(&CAN_FilterInitStructure);// 按上面的参数初始化过滤器


/* CAN FIFO0 message pending interrupt enable */ 

CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断

 }  


二、CAN总线通信——波特率计算

1. CAN总线时间特性

具体位时间特性图如下所示:

在这里插入图片描述

与标准CAN中位时序有些许差异,bxCAN将PTS段与原有的PBS1段结合,并重新命名了。


具体内容如下表所示:

image.png

2. 采样点的设置

采样点:读取总线电平,并将读到的电平作为位值的点。

采样点设置在合适的范围,CAN通信会更稳定。


采样点设置范围如下表:

image.png

采样点的计算方式:

采样点 = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)


3. 波特率计算

波特率的计算公式:


CAN波特率=APB1时钟频率 / CAN_Prescaler / (1+CAN_BS1+CAN_BS1)


4. CAN波特率有关的寄存器

在这里插入图片描述
在这里插入图片描述

5. CAN波特率----参数配置表

需要配置的参数如下表:

image.png

参数设置时,尽量符合下面的要求,这样CAN通信更加稳定:


1. 波特率 = APB1时钟频率 / CAN_Prescaler / (1 + CAN_BS1 + CAN_BS1)

2. 采样点 = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)

3. CAN_SJW < CAN_BS2


一般APB1时钟频率为36Mhz。如下图常见CAN总线的波特率设置。

image.png

关键字:STM32F103  CAN总线通信  初始化  波特率 引用地址:STM32F103标准库开发----CAN总线通信实验----初始化/波特率

上一篇:STM32F103标准库开发---SPI实验---底层驱动程序
下一篇:STM32F103标准库开发----CAN总线通信实验----发送和接收

推荐阅读最新更新时间:2024-11-11 09:30

stm32f103zet6定时器详解及应用
  1、stm32f103zet6芯片及引脚图        2、stm32f103xx器件功能与配置      3、stm32f103zet6 定时器   大容量的STM32F103XX增强型系列产品包含最多2个高级控制定时器、4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。   下表比较了高级控制定时器、普通定时器和基本定时器的功能:   定时器功能比较      1)计数器三种计数模式   向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时   向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时   中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后
[单片机]
<font color='red'>stm32f103</font>zet6定时器详解及应用
1、STM32学习笔记——系统时钟初始化函数
STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK): 1:HSI振荡器时钟(内部时钟) 2:HSE振荡器时钟 (外部时钟,即晶振所提供) 3:PLL时钟(锁相环时钟) 这些设备有以下2种二级时钟源: (1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 (2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。 1:常用配置如下 使用HSE作为PLL的输入源,将PLL的输出配置为72MHZ,然后将PLL作为系统时钟,最后将其他时钟配置为
[单片机]
1、STM32学习笔记——系统时钟<font color='red'>初始化</font>函数
si4438使用stm32f103配置调试成功!
刚拿到si4438时候在网上找了一大波资源,发现能使用的并没有多少,于是自己配置一发。经过不懈努力配置成功,现在将一些配置过程分享给大家!源码已上传。尽情下载! 1.首先打开工程文件,app下的si4438即是驱动si4438的一些库函数,都已经封装完成,只需要直接使用即可。 2.si4438在接受到数据时会IRQ引脚会产生下降沿,需要将接IRQ引脚的单片机IO配置为下降沿中断才行,当进入中断时通过自定义函数(在.c文件中)读取接收的包,接受的数据存到数组中,只需要定义一个数据,取出数据即可。 3.spi配置:使用硬件的spi,速率不能超过200khz,nss引脚配置成软件管理,读取数据从第二个时钟沿开始读取数据。
[单片机]
8051单片机波特率计算公式(配套C语言例程)
8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod /32)×(定时器T1溢出率),其中smod是PCON 7 ,表示是否波特率加倍,Fsoc是系统的晶振大小。 波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc; 最终公式: 波特率:Baud=(2smod × Fsoc)/(32 ×12×(256-TH1)) 我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式: TH1=256-(Fsoc×2smod)/(12×32×Baud) 下面针对
[单片机]
将伺服电机与STM32F103C8板连接起来的教程
在电子领域,伺服电机主要用于机器人项目,因为它们的准确性和易于操作。伺服电机尺寸较小,非常有效且节能。它们提供高扭矩,可用于根据电机规格提升或推动重物。在本教程中,我们将了解伺服电机以及如何将伺服与STM32F103C8板连接。还连接了一个电位计来改变伺服电机轴的位置,和一个LCD来显示角度值。 所需组件 STM32F103C8 (蓝色药丸)板 伺服电机 (SG90) 液晶显示器(16x2) 电位计 面包板 跳线 电路图和连接 SMT32F103C8 引脚详细信息 在STM32F103C8中,我们有10个ADC引脚(PA0-PB1),这里我们只使用一个引脚(PA3)进行模拟读取(),用于通过电位计设置电机的轴位置。此外,在
[单片机]
将伺服电机与<font color='red'>STM32F103</font>C8板连接起来的教程
串口通信工作方式1波特率的计算
本文只讨论串口通信工作方式1的波特率。 公式:波特率=(2^SMOD/32)*(T1溢出率) 其中,当SMOD=0,波特率正常 当SMOD=1,波特率加倍. T1溢出率就是T1定时器溢出的频率,只要算出T1定时器每溢出一次所需的时间T,就可以算出溢出率1/T.单位为Hz。 T1定时器使用工作方式2(TMOD=0X20),即8位初值自动重装的定时器。其工作过程是,在TLX和THX中装好相同的初值,在时钟的作用下TLX加一计数,当TLX加满溢出后,CPU会自动将THX的值装入TLX中......如此循环。 每计一个数的时间为一个机器周期,一个机器周期为12个时钟周期。如采用11.0592MHz的晶振,机器周期为12
[单片机]
stm32f103 flash模拟eeprom
STM32F103是意法半导体(STMicroelectronics)推出的一款32位单片机系列,该系列芯片具有高性能和丰富的外设接口,广泛应用于工业控制、消费电子、汽车电子等领域。其中,STM32F103的Flash存储器可以模拟EEPROM的功能,在本文中我们将详细介绍如何使用STM32F103的Flash存储器来实现EEPROM。 概述 EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可擦写的非易失性存储器,可以在不使用外部电压的情况下对其进行擦除和编程。它不同于Flash存储器的主要特点是可以对单个字节进行随机读写操作。而STM32F103的Fl
[单片机]
Bootloader中LCD硬件初始化和软件驱动程序设计
Android系统在正常启动中,刷屏功能一般在内核中执行,而Bootloader的任务应该是执行硬件初始化,并尽快跳转到Linux内核。在Bootloader启动过程中使能一个显示驱动,实现刷屏功能,并不违背这一目标。本文通过对Bootloader的原理分析和嵌入式芯片C6310中LCD控制器的研究,设计了Bootloader中LCD硬件初始化和软件驱动程序。该设计完善了Bootloader的扩展功能,加快了手机动画的实现,改善了客户的使用体验。 Android自2011年以来实现了计算机诞生以来最快速度的用户群体增长,目前Android以每天85万新激活数的速度快速征服世界,在世界范围内成为占有率最高的智能手机操作系
[单片机]
Bootloader中LCD硬件<font color='red'>初始化</font>和软件驱动程序设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved