你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103:CAN总线通信——初始化/波特率

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、CAN总线通信初始化配置
1. CAN总线通信初始化配置流程

CAN总线GPIO和时钟配置
CAN总线接收中断优先级配置
CAN总线初始化配置
2. CAN总线GPIO和时钟配置
CAN引脚配置

${BDSWRF4[GB%I%MZOLXC@3.png
P10HG5ZV(V(V~N6$YL1(]ES.png


CAN时钟配置:


NO5_I7]74%~`$QQWH_NT{EA.png

W3B$Z~7_)%U47070WW%_AUY.png


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

  1. /*CAN GPIO 和时钟配置 */
  2. void CAN_GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         /*GPIOA端口时钟使能*/         
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                                                                                                                        
  7.         /* CAN1 模块时钟使能 */
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  9.         /* Configure CAN pin: RX */         // PA11
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉输入
  12.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.         /* Configure CAN pin: TX */   // PA12
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  17. }
复制代码

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

  1. /*CAN GPIO 和时钟配置 */
  2. void CAN_GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         /* 复用功能和GPIOB端口时钟使能*/         
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                        

  7.         /* CAN1 模块时钟使能 */
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  9.         /* Configure CAN pin: RX */         // PB8
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉输入
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  13.         /* Configure CAN pin: TX */   // PB9
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  17.         //#define GPIO_Remap_CAN    GPIO_Remap1_CAN1
  18.         GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);  
  19. }
复制代码

3. CAN总线接收中断优先级配置
具体代码如下:

  1. /*CAN RX0 中断优先级配置  */
  2. void CAN_NVIC_Configuration(void)
  3. {
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.           /* Configure the NVIC Preemption Priority Bits */  
  6.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  7.         /* enabling interrupt */
  8.           NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
  9.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  10.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  11.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.           NVIC_Init(&NVIC_InitStructure);
  13. }
复制代码

4. CAN总线初始化配置

具体代码如下:

  1. void CAN_INIT(void)
  2. {
  3.         CAN_InitTypeDef        CAN_InitStructure;
  4.         CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  5.         /* CAN register init */
  6.         CAN_DeInit(CAN1);        //将外设CAN的全部寄存器重设为缺省值
  7.         CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入

  8.         /* CAN cell init */
  9.         CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式
  10.         CAN_InitStructure.CAN_ABOM=DISABLE;//没有使能自动离线管理
  11.         CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式
  12.         CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式
  13.         CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式
  14.         CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级
  15.         CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;        //CAN设置为正常模式
  16.         CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                 //重新同步跳跃宽度1个时间单位
  17.         CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;                 //时间段1为3个时间单位
  18.         CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;                 //时间段2为2个时间单位
  19.         CAN_InitStructure.CAN_Prescaler=24;                  //时间单位长度为24           250k
  20.         CAN_Init(CAN1,&CAN_InitStructure);
  21.                                                       //波特率为:36M/24(1+3+2)=0.25 即250K

  22.         /* CAN filter init */
  23.         CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1
  24.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式
  25.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位
  26.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值
  27.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//         过滤器标识符的低16位值
  28.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值
  29.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//        过滤器屏蔽标识符的低16位值
  30.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0
  31.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器
  32.         CAN_FilterInit(&CAN_FilterInitStructure);//        按上面的参数初始化过滤器

  33.         /* CAN FIFO0 message pending interrupt enable */
  34.         CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断
  35. }  
复制代码

二、CAN总线通信——波特率计算
1. CAN总线时间特性
同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。
时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。

GMOO5VVLO[FLC9U6]W{ZH.png

2. 波特率计算公式
CAN波特率=APB1时钟频率/BRP分频器/(1+tBS1+tBS2)

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

KPILTGAY5}$UF_PKKT5NJLU.png
Z[5DG6T[ZC]06389K9H3}QI.png

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

%JE[TE(VB2MHP0~NY)O$QUG.png

C2JRU3{U}`BHN)[4D(KIZN1.png



收藏 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版