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

STM32 CUBE:CAN总线收发

[复制链接]
STMCU小助手 发布时间:2023-3-7 14:00
1、默认STM32CAN1就是主站。CAN2是从站
* B5 x' R7 B$ W: |2、主站配置如下:参考时钟是72M/2=36M
) \2 r# T# w; V# q. z
波特率:36M/9/(2+2+1)=800K.所以通讯频率800K。3 n1 u5 g) _6 B% w
注意此处BUS-Off一定要enable。否则出现插上下载器两个站就不能同时发送的情况' s  @3 J  u6 p) k

: `4 p, ^' z0 [; q* e7 {* z
2019082716413958.png
7 t3 T- }1 g$ K# y; Q" p
) Z( I3 R0 }) O
3、中断设置
" S( ^# v$ |* f" q6 o, z8 r8 U9 F
# b$ N3 F- p  {# Q: _# b
20190827164354890.png
0 @: }/ U( v: m0 {2 d
* f% i: `: I9 q% {6 j, E
6 V) f  V$ E: u) J
4、can开启函数:  c7 \, w1 E3 ~6 b4 g. f3 a$ Q
HAL_CAN_Start(&hcan1);8 X8 N2 B! x2 o8 f  T4 g6 p
HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);8 a1 F: l) r: I6 G) z1 e
can发送函数:: v6 Z# q; P2 Q; d5 n& ^$ j/ e* W
void CAN_TRANSMIT1(void)
; i. B; \. x% r2 \$ r{/ c5 Z5 Z( U( l: A
TxMessage2.DLC=8;/ [3 q4 m# H9 l* x1 p
TxMessage2.StdId=0x314;" i! `. N% J$ G2 s7 j; U
TxMessage2.ExtId=0x00001314;/ E! ?+ g8 m! `5 g6 z5 F
TxMessage2.IDE=CAN_ID_EXT;
6 J7 W5 c) k2 u% M3 A" HTxMessage2.RTR=CAN_RTR_DATA;
$ e8 z. \% C" E* J; X7 [6 Puint8_t TR_BUF[8]=“22222222”;2 @" `! A  I9 F( {, l) j8 v$ a
if(HAL_CAN_AddTxMessage(&hcan1,&TxMessage2,TR_BUF,(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)
1 T7 Q3 h3 T9 S; L, U{
* {4 C/ E- R! g1 G! r. nprintf("???1");" @& W  C- ]# q! K; E' _& a, c
}
, y- ?- N& D0 H; B! J}3 H) Z4 r) ?" }% y

. @2 s$ ^( h/ y( F7 l

' T9 B5 H; q8 w6 @7 y; g' ]5、can1配置
* [2 T1 e/ C/ _static void MX_CAN1_Init(void)& R* \* \: ]3 x
{
0 i' s% g! H! N0 h2 S( R/ w
5 ~4 s: p" ?$ A% b8 C, |9 _# Q
7 K( l4 W1 d- {2 D
/* USER CODE BEGIN CAN1_Init 0 /
  ~! R% y$ o" d; UCAN_FilterTypeDef sFilterConfig;
! _. S% Q; o# M/ USER CODE END CAN1_Init 0 */
) q; [- T3 l3 t2 j; A; _& G
0 h5 T7 Q& t$ G1 q

( L$ s' M+ [# b2 h4 t% R/* USER CODE BEGIN CAN1_Init 1 */4 s& x- |! g! X3 \- p
1 S, u( g6 Q6 m6 ^; G

4 e5 o1 r. x. M" F; i7 v/* USER CODE END CAN1_Init 1 /2 P& H) Z9 q- `2 G- f0 s
hcan1.Instance = CAN1;
. v1 V% D5 t; H/ W, k( bhcan1.Init.Prescaler = 18;
& A0 F( S& e! `/ f, e, E8 Jhcan1.Init.Mode = CAN_MODE_NORMAL;$ G; a) d/ X" ~2 I
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
, i5 s1 h9 b. k$ A" W, x& F2 j, W0 zhcan1.Init.TimeSeg1 = CAN_BS1_2TQ;
( o, n& E! x. N2 \  S' h1 ]hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
5 _) u8 @( W' I9 e0 u3 j! ^% Rhcan1.Init.TimeTriggeredMode = DISABLE;
5 P. I( x$ `9 r) F. thcan1.Init.AutoBusOff = ENABLE;, w/ I/ v) b- b
hcan1.Init.AutoWakeUp = DISABLE;
  [9 N; E1 l  E$ ?0 @& Q8 whcan1.Init.AutoRetransmission = DISABLE;; g. l4 s8 c1 T- Y
hcan1.Init.ReceiveFifoLocked = DISABLE;7 Z0 N' M- D) w; _( f2 k, k
hcan1.Init.TransmitFifoPriority = DISABLE;
) a' b, {  e& tif (HAL_CAN_Init(&hcan1) != HAL_OK)
3 Z( x- R$ D2 C! v$ M! G4 p{
3 x% k- O! S: Z( i7 PError_Handler();# `$ X) d5 e7 e
}
- m8 R2 E: D1 h) {/ USER CODE BEGIN CAN1_Init 2 */$ G# q# M5 z1 I5 `& o
sFilterConfig.FilterBank = 0;9 L5 ?! u/ Q! ?- _& c
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
: z6 o* n5 ~# M0 Y" m9 G8 R1 wsFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
5 ]; k# u# z9 DsFilterConfig.FilterIdHigh = 0x0000;
- N) `! d4 ~& q) p$ o& K5 [% e" osFilterConfig.FilterIdLow = 0x0000;( h9 J5 f( l; b9 P; n7 x
sFilterConfig.FilterMaskIdHigh = 0x0000;: N: O3 z" P$ h
sFilterConfig.FilterMaskIdLow = 0x0000;5 F5 O, z5 i& U) _: ]1 B
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;$ P1 F8 B0 U3 x$ l9 q# V
sFilterConfig.FilterActivation = ENABLE;
4 k: P% m3 }# x5 v1 q6 v7 SsFilterConfig.SlaveStartFilterBank = 14;
# W9 z7 R0 X+ c- s. U. u! B: M5 C& X3 {5 C* ]# j+ Y* D6 x

: `9 z# H; `" d1 M7 u: cif(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)!=HAL_OK)1 _9 H/ j) V' f  \
{' Q& y; z2 \' Q- O2 R( u# ~
Error_Handler();
; @! q% ?6 |  o- V# c* d. {}
. F; ]% I& F% k1 J  u4 s/ ?2 l! q8 j; v  q: I' s8 [# S
. H" O/ B) H, \6 N1 K
/* USER CODE END CAN1_Init 2 */
7 j: e5 K) c! P2 p0 W# O
7 x, J7 Z2 \; p# j3 F: W
! Z! j& C) ]2 }% f4 r
}" H/ q8 t8 _7 d6 d+ ?/ K/ c! _

/ \0 @+ U- H& ]- b2 d
, U% c# k  l3 V- g: s6 Z/ H" V
6、CAN1中断函数! f( s2 E! F) V! y  Z
+ Y% |3 s4 P: r/ m- \" j8 x( O, n
) ?1 k- n+ i# Y; X9 L
void CAN1_RX0_IRQHandler(void)
& o8 ]+ A) K! [- p5 o4 {! i& G{+ P2 R2 `+ x1 l0 `
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */
# W. y$ N8 f: j+ e- @6 b8 O1 K* V4 \6 {. N$ R7 [
- O/ A$ F* O& H5 Q! M$ s# G# U
HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&RxMessage1,RXBUF);
$ m. p$ r2 E0 g7 |! a
& P# J$ g) h" C  _0 i0 I/ y/* USER CODE END CAN1_RX0_IRQn 0 /+ S: V5 G2 q' a
HAL_CAN_IRQHandler(&hcan1);! C( g# w: r; ~* i
/ USER CODE BEGIN CAN1_RX0_IRQn 1 */7 q$ v5 z, I' h  C- K' R

2 j3 [% N9 h% x4 F" K! Y3 t1 I5 R) @. T

) K( O" k2 {2 n5 [, @# e3 o! g/* USER CODE END CAN1_RX0_IRQn 1 */
0 `& o" S, S& ]' M8 j}
2 Q1 s/ j( J7 S8 g' z( H/ a+ l6 {# b1 ~* h1 @8 J
$ S/ g  c; d3 o8 j" M( p6 ^0 F: S
7、CAN2配置
. k! X# y  F: {* R" \% V7 W/ ?static void MX_CAN2_Init(void)
7 L/ S# K3 s$ c: c3 k{
8 M, _3 G) T4 V
- `* `* k4 M0 c( C% t
; ?3 j, x3 o( `. x
/* USER CODE BEGIN CAN2_Init 0 /" I% A% @* y; x8 M' ^- W
CAN_FilterTypeDef sFilterConfig;4 Q' a5 q5 Y& `5 t. O9 ~
/ USER CODE END CAN2_Init 0 */
3 K: O0 y+ R3 X" J5 M# E3 x5 U6 t4 W4 V5 \( P

) i) [/ v3 D' H! _7 A; k/* USER CODE BEGIN CAN2_Init 1 */" R% q; C" q$ b! z- Q
( a! D7 F3 V: T8 R9 i/ X

0 W5 \5 o6 E7 u/* USER CODE END CAN2_Init 1 /
& g4 A/ b: Q; b0 I9 t7 @) fhcan2.Instance = CAN2;
- _; m+ L( T) b8 J+ o  v1 Zhcan2.Init.Prescaler = 18;
4 j5 F- k- z1 o, R$ B, x6 Q8 @hcan2.Init.Mode = CAN_MODE_NORMAL;4 h/ W. `) Q4 ?3 L1 k6 O
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
7 c. S3 T; o, i# H* u4 yhcan2.Init.TimeSeg1 = CAN_BS1_2TQ;
, g! I  f* U7 D4 v* H* _hcan2.Init.TimeSeg2 = CAN_BS2_1TQ;( U' _) e! @/ p2 X# y0 ~$ }
hcan2.Init.TimeTriggeredMode = DISABLE;
' d- V( t+ V7 V6 H' o; Ihcan2.Init.AutoBusOff = ENABLE;
% N9 W/ H/ ^/ c4 W% z3 e+ z; Ehcan2.Init.AutoWakeUp = DISABLE;
( Z" {3 l* h8 E7 ^/ `; Fhcan2.Init.AutoRetransmission = DISABLE;1 t/ W+ x5 C! j1 H: O
hcan2.Init.ReceiveFifoLocked = DISABLE;
3 i8 X, D( Y% ?* f" M1 Rhcan2.Init.TransmitFifoPriority = DISABLE;( l- E% t7 e% O2 j. I
if (HAL_CAN_Init(&hcan2) != HAL_OK)
2 O4 |* r6 V& j7 H% |{! x8 t% b  t; U; W% i
Error_Handler();  j- z4 v- i+ H
}
- v  v8 ?6 [5 N+ w) ^! M/ USER CODE BEGIN CAN2_Init 2 *// H% {. U+ {1 [4 l0 b4 ]+ `6 f
9 e7 E/ P, W2 E; x. p# \5 _

: z9 b; z) V' P) O: IsFilterConfig.FilterBank = 14;
+ t3 q7 o4 q8 G, r6 L2 C5 z( h/ LsFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;0 `! I5 O1 O% [3 f
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;: |7 g4 l) r3 S: I
sFilterConfig.FilterIdHigh = 0x0000;
' z5 b  u3 h- m6 \) {# `: z; I0 EsFilterConfig.FilterIdLow = 0x0000;& K- o2 x8 r9 W: o+ U
sFilterConfig.FilterMaskIdHigh = 0x0000;
$ ^# y7 K6 K- n3 ]6 j) s6 g9 v4 hsFilterConfig.FilterMaskIdLow = 0x0000;0 h0 l# T& p: D
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;4 o& e  s" K' d& A  g1 k
sFilterConfig.FilterActivation = ENABLE;
5 d% C6 u* v- [$ v) jsFilterConfig.SlaveStartFilterBank = 14;3 d- z/ d) `; x% \7 V! r

: ]8 C' f2 G! B4 I# Q

  {( p3 @# `& x8 pif(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig)!=HAL_OK)/ g- e# B7 i% O# l/ C! O
{
7 A- Q( b9 u$ A+ b. ?& sError_Handler();
  |: G. m) S) ]* l}
0 N( q& p! W5 J: y
, A9 y; w& L6 Q! P1 `        HAL_CAN_Start(&hcan2);
: S3 a1 a1 ~& h" F* }3 R0 P        HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING);               
8 {) A: f4 b) H) a/* USER CODE END CAN2_Init 2 */
& Q; u8 B  V% X% c3 u
, ~1 V$ c: K( h6 u( W
}$ [) J3 R4 m# J/ Y. }+ T4 q
8、CAN2中断函数1 V4 \6 O* N" V
void CAN2_RX0_IRQHandler(void)
) d( D4 ]6 K0 \% h& l# ?! m& d{
) I8 L5 \- S; d, ]( I/* USER CODE BEGIN CAN2_RX0_IRQn 0 /* H5 }( U. m8 E
HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxMessage1,RXBUF);
! h3 N: Q/ y" n3 D) A' c* K6 c' H+ }$ `/ USER CODE END CAN2_RX0_IRQn 0 /
0 Z, W( ~- C  F8 U; JHAL_CAN_IRQHandler(&hcan2);, V6 `4 q( E0 o
/ USER CODE BEGIN CAN2_RX0_IRQn 1 */! \& A; x4 j( `) i  M  g/ s
  z( N0 Y0 b6 P
/* USER CODE END CAN2_RX0_IRQn 1 */
# O3 K7 n; `- {; u}
! c/ \& y+ u' r$ G
7 v  ^! g) ~7 ~/ f
; i- I2 A1 F7 V  y" M
9、CAN2发送函数+ X+ @( g1 w# h6 K
void CAN_TRANSMIT1(void)4 [. @6 M3 P7 _
{4 j+ e; L8 |/ I# G
static uint8_t ll;0 K& U) u& @& E# j, y8 D
TxMessage2.DLC=8;4 i( e' ?! Y. N5 p! o
TxMessage2.StdId=0x003;& J$ J6 B6 ]3 Q4 W" U4 X- i
TxMessage2.ExtId=0x00000003;5 b9 \0 W( t/ g6 s
TxMessage2.IDE=CAN_ID_EXT;6 V3 a% r9 c  I/ \$ c' o; [; I. z
TxMessage2.RTR=CAN_RTR_DATA;, ~$ x& W: a3 A9 K' k' T! i$ N
ll++;' f/ M! q7 K; r& M3 c4 j; m/ k, F% _
if(ll>100) {ll=0;}
4 x$ B5 C  J8 n. b" h$ ?0 buint8_t TR_BUF[8]={0,1,2,3,4,5,6,ll};6 @# ^1 ~4 p# v' H
if(HAL_CAN_AddTxMessage(&hcan2,&TxMessage2,TR_BUF,6 H+ |5 C/ a3 {1 V! X$ i
(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)9 i* h: j/ k5 W5 t  i
{
. V% V- R! m" p$ W' ?& L//
9 H1 L( e& E  a: R  W( \- N9 P}% P0 G' c  C) u+ A
}
. Q" K# i/ h+ A# z# D$ {
————————————————$ l; L3 \$ X5 G  r1 d; X
版权声明:冬麻麻& `; C) e( v- l" C8 {
, l- J( l4 G9 h

& V, ]4 J" M, v
赞 收藏 评论0 发布时间:2023-3-7 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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