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

【经验分享】STM32F407VET6两个CAN同时工作

[复制链接]
STMCU小助手 发布时间:2022-4-23 16:44
一、注意点7 O' ~3 t6 w0 d1 F) G; w9 j
两个CAN接口同时工作主要是初始化的时候必须一起使能时钟
7 Z  D$ f7 F. T3 _( N" ?  I5 a5 S+ A& g- ]- j+ p- T: _+ e. b+ p
二、代码分享/ O8 l8 h: r2 H( r; _) ~! d* }
% P1 ?* b2 Z& X4 i. m1 Y2 R
  1. u8 can_init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
    4 i3 c) e# c; V8 o% U  }
  2. {3 B6 X% E' Y6 \7 N' k5 i; u, {0 X
  3.         u16 std_id_1 =0x123;  
    * `7 ~8 {& a! ?- p% ?  ?6 L

  4. . C' I4 m1 ]' E$ ~/ N0 c
  5.         u16 std_id_2 =0x123;  9 z# F- n3 f8 B: [! [1 L
  6. " W0 D5 k4 w* x3 O4 [; D9 J
  7.         GPIO_InitTypeDef GPIO_InitStructure;
    & X9 B2 Z. _* H2 `1 |; E
  8.         CAN_InitTypeDef        CAN_InitStructure;
    . M" x6 X! j5 L# m5 _3 \. ~
  9.         CAN_FilterInitTypeDef  CAN_FilterInitStructure;8 n2 y) ^* v; S2 c, E4 b5 {4 i
  10.         #if CAN1_RX0_INT_ENABLE 3 ]3 C) {( F0 y9 G! k: V+ d
  11.         NVIC_InitTypeDef  NVIC_InitStructure;
    + S- w; H0 b$ F+ t# g% w' g
  12.         #endif
    0 u: R8 I% Q+ P% g7 \
  13.         //使能相关时钟
    5 ?% W# _/ [% ^$ E. X% n; X/ z' \! R
  14.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                    6 E" ?6 h' T+ \' U) Q
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能PORTA时钟           
    ; e6 E# K) y) W/ c! M. N
  16. 3 K; V( V# N+ b6 [4 C4 S
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟        
    0 ^' b7 C+ |- @, Q2 C' v
  18.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN1时钟        9 F/ l, Z8 k2 ~; p  y
  19. ( k/ ?( ~# E: |0 l' _$ n8 a
  20.         //初始化GPIO0 o9 r9 V2 L  b: J/ E) ]" G4 i
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;. ]) o2 v% t- p! f) w
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能: Y& O6 r/ P. d% k( V  j' a/ S
  23.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出4 t* y( S9 ~' [! \6 g/ j7 g; w* D
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz5 }! D2 h6 j6 I0 _7 K. I
  25.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    % g! a4 K0 f" |# f
  26.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
    3 \7 _8 h3 P. i) W  ~1 K1 x, c

  27. 4 h0 I9 c) d4 a; Q5 h, B' E3 s
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
    + y# ^4 [+ b8 I
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能/ }% C& S: }3 [5 G* C$ D7 P/ d) P
  30.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    ' `0 o4 |4 m0 [; S% W3 B
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    . |2 V. H7 [% f! Y% S! e
  32.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉! F& b; `$ C9 e( I
  33.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PA12,PA137 ]; V, L# i+ w( S

  34.   p' A7 e5 x$ f1 m$ L
  35.         //引脚复用映射配置" Z6 d3 t& V7 r) U4 `1 u
  36.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN10 u) i2 Q  [- m. M/ k6 ~0 k/ O
  37.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN16 R: L+ I9 H: z# a4 ?' H
  38. / W% _+ \& l0 {0 z( o6 T
  39.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_CAN2); //GPIOA11复用为CAN25 h  K- N/ ^3 l( A6 f5 U- p
  40.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_CAN2); //GPIOA12复用为CAN2
    3 T, W) G3 c4 e( J. ], E
  41.         //CAN单元设置
    * `, Q. t1 ^* V# ]; ^
  42.         CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   6 [- K7 [# W4 B* I0 }1 e
  43.         CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理         
    # Y4 U8 _1 r  w5 q
  44.         CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)  u5 M, {" W; I6 j
  45.         CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送
    7 ~( W( ^: y& k$ ^$ r, l# w: N
  46.         CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  
    ! I* }( t/ W" Y
  47.         CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定
    , y/ P" s" d& k4 f: K
  48.         CAN_InitStructure.CAN_Mode= mode;         //模式设置 2 u$ u1 z  M6 S  h6 f) p
  49.         CAN_InitStructure.CAN_SJW=tsjw;        //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
    : _$ @( }9 L( P0 _7 g/ M
  50.         CAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
    * O1 I6 U1 Z" c8 @9 B
  51.         CAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
    % I+ D6 v' j& v5 c8 Z5 d- `6 ^
  52.         CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1        
    " R4 X: w# p8 t* A9 L5 e' R
  53.         CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1         
    - y/ s; b) p4 E2 A
  54.         CAN_Init(CAN2, &CAN_InitStructure);   // 初始化CAN2
    & J" ?& W! a6 [" n
  55.         //配置过滤器
    ' b- _( ^! I/ X) r2 b( L& ?) ^
  56.         CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
    - p0 {& f* H6 h
  57.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽模式
      B3 p- a6 W" ?7 K3 q" Q2 f! w
  58.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
    / b% h7 Z1 i, l- E
  59.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID
    , A% Z4 F% ^, D4 c" a! k( B
  60.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;           ^, e2 L3 ?8 `8 X6 S0 V# v

  61. 5 R2 y3 o0 q: V
  62.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
    " q7 y$ b( T1 z. p& l
  63.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;: _. F2 _$ L/ x/ K
  64.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    # k9 n- U, q0 P1 N
  65.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
    / J1 t- l. G) A& b, q. H
  66.         CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化, q5 b' L7 S! @8 U# D4 ]4 g/ ?
  67.         /*---------------------------------------------------------------------------------------------------------------------------------*/               
    8 F% f- w3 G. M- Q

  68.   _2 ]4 d$ w. k6 g: U" K7 k! u
  69.         CAN_FilterInitStructure.CAN_FilterNumber=14; //过滤器14
    3 M5 p6 o. k8 O8 R' {1 \) T* }
  70.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽模式* W9 ^/ V. B& X
  71.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
    7 n2 v0 l% O; e$ Q
  72.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID( N% y( B7 g1 M7 ]1 @4 N1 k
  73.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; * n6 T& M! _+ ?4 g0 O' c
  74. ; @" ]6 F, u% ]0 e( o! e
  75.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK& u; Y7 m) ^! x: h( V0 f: e
  76.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;" |. `; N+ u! ]% h( I4 N5 p" `
  77.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    ; P' _  \. ^: G: N5 Y; u% a4 t
  78.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器08 n6 r# j; y/ l# R! p
  79.         CAN_FilterInit(&CAN_FilterInitStructure);  //CAN2
    & S, F4 h7 F* }: R: v0 P

  80. % M7 F$ ~6 x& o+ O( ?, u
  81.         #if CAN1_RX0_INT_ENABLE
    ! @: m+ z! p  \/ z" b
  82. . E  d# u: |9 o" q
  83.         CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    ! P4 M: ]" o  Z9 P! ]$ D
  84. . E. l! l# g. B" s% l' C5 J+ r
  85.         NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
      j# Q8 O, J% \' G& M4 f+ {
  86.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
    9 t# y* q- {3 F+ F  D9 w
  87.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
    % c* V& G  Z- T) D
  88.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    % v( B4 ]6 A8 g
  89.         NVIC_Init(&NVIC_InitStructure);
    6 R) {, l8 ^- y4 B( `
  90.         #endif' \6 ^8 Z4 A8 C, k: a8 T' O
  91. ; x1 W# ~! _8 ~: P. _, v* B
  92.         #if CAN2_RX0_INT_ENABLE0 u9 h( V9 n! }
  93. ) F$ d1 n& k( J, t0 Q. ^+ r# g
  94.         CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    6 `( y" M1 @- P- c5 n7 _" I, [' _, W
  95. 7 A+ f0 m. B! E' i$ L
  96.         NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;' d  w6 z3 I- ~0 l( e( G! c
  97.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1% \. ?: W0 l: h% a  T' f5 P- L
  98.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            // 次优先级为0$ s; m2 V5 Z- r" Z5 R! k
  99.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    # W* \, V4 n4 f* }( y% X! z
  100.         NVIC_Init(&NVIC_InitStructure);( ^; J  E) i* U- g7 u. [, U8 U2 H& v4 ?; @) r
  101.         #endif
    * G$ x7 t) a; b
  102.         return 0;
    1 S# k3 M/ w( J
  103. }
复制代码

* e  D: e. B$ D3 M7 Q+ I' f
5 p3 P4 u# z8 Q$ s4 B+ ~9 k' x" j
. Q7 O; r; p( \# X) n6 p6 v5 |" s) I
赞 收藏 评论0 发布时间:2022-4-23 16:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版