
1、默认STM32CAN1就是主站。CAN2是从站1 Q. E- y/ x% h0 q7 @# V- {# K 2、主站配置如下:参考时钟是72M/2=36M& A7 {9 Y( R. S! P5 l 波特率:36M/9/(2+2+1)=800K.所以通讯频率800K。- G! \) ]1 }) E2 q' P; x7 l 注意此处BUS-Off一定要enable。否则出现插上下载器两个站就不能同时发送的情况 ![]() 7 H2 N9 q2 }& }# R9 @" t 3、中断设置% q* ?1 I& V- ]: T! H9 R % x' M# o! v+ R- Y ![]() 9 ?+ u" W# p U! ^ 4、can开启函数:. [3 c6 z @( W% H7 `3 B5 f HAL_CAN_Start(&hcan1);9 X: h k- m/ u1 u1 p$ W1 m HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);# W. t0 r2 l0 h) z can发送函数:5 F! F: t+ w% R void CAN_TRANSMIT1(void). |. `4 L; C M2 H0 ?! ^& }' Z { TxMessage2.DLC=8;! }0 }4 J' s" X0 O) `9 b TxMessage2.StdId=0x314;. d2 r# i+ x% J2 r) m1 }6 @ TxMessage2.ExtId=0x00001314; TxMessage2.IDE=CAN_ID_EXT; TxMessage2.RTR=CAN_RTR_DATA; uint8_t TR_BUF[8]=“22222222”;% q) f5 o( `) n; k if(HAL_CAN_AddTxMessage(&hcan1,&TxMessage2,TR_BUF,(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK) { printf("???1"); } } 4 Z' c4 K7 ~9 Q 5、can1配置" v. x( z" k s9 N5 ] static void MX_CAN1_Init(void)5 N7 ]" F8 ?- V8 { {& j8 _8 ]* X% b# J. ?" B + {9 y: A4 }3 I /* USER CODE BEGIN CAN1_Init 0 /0 ?9 V( k( s% c CAN_FilterTypeDef sFilterConfig;7 t/ M3 b- S2 q6 a* s4 L / USER CODE END CAN1_Init 0 */( h& \% ?, a9 l% L- { [8 [# ] O; o* Z8 U3 U 8 J3 V7 j, \* g) W3 t /* USER CODE BEGIN CAN1_Init 1 */8 E) Q6 `/ M: b0 s* P1 T0 K$ r 3 l# i5 s/ ^) ^& Z9 @; C 4 s# ~: K" s- v' L/ K( `9 @ /* USER CODE END CAN1_Init 1 / hcan1.Instance = CAN1; hcan1.Init.Prescaler = 18;- t! r0 ~; t0 L hcan1.Init.Mode = CAN_MODE_NORMAL;+ ^- K5 D9 S0 a/ `3 t0 ^; c hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;7 u, B& @' P% @0 ~/ \ hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;5 N+ U$ p( e. v, K: y hcan1.Init.TimeSeg2 = CAN_BS2_1TQ; hcan1.Init.TimeTriggeredMode = DISABLE;- u, k5 M3 m6 y2 U hcan1.Init.AutoBusOff = ENABLE;' w2 {( Z8 k# ^3 \ hcan1.Init.AutoWakeUp = DISABLE;0 s( w. n) d" ?/ H1 A) y4 f hcan1.Init.AutoRetransmission = DISABLE;" F9 E2 B* N. y9 H) L hcan1.Init.ReceiveFifoLocked = DISABLE;, Q/ T" y, O/ x, _ hcan1.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan1) != HAL_OK) {- H% h, J6 F3 q4 V7 o) y% A+ } Error_Handler();) F# G2 ]- Q4 X4 C }# ?8 a( v% W$ U+ @$ q / USER CODE BEGIN CAN1_Init 2 */ sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;6 K0 A( M* ^- M, n' B* x: Q sFilterConfig.FilterIdHigh = 0x0000;) K: w2 ?* \( V3 O% E4 R4 K sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14;6 J8 m4 G" |% m7 f6 C2 f if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)!=HAL_OK) {5 }. l- W [: t7 @ Error_Handler(); } 8 B7 p _4 r- M& ?/ t /* USER CODE END CAN1_Init 2 */3 x5 y, q5 J, U6 D* Z' I8 _; N( \5 P - A; f+ s8 C7 c } ' A7 e& r- R4 H, t7 x" z 6、CAN1中断函数 void CAN1_RX0_IRQHandler(void): _9 L! R% o" u) G% p q) V5 Z( u {( i4 g" d3 O( N) O6 v# u /* USER CODE BEGIN CAN1_RX0_IRQn 0 */" [5 Q1 e, I. x: n! m - O% U$ @8 p, T" \+ _ HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&RxMessage1,RXBUF); /* USER CODE END CAN1_RX0_IRQn 0 /* ~* S& O# m, t0 [ H* j+ m* O HAL_CAN_IRQHandler(&hcan1); / USER CODE BEGIN CAN1_RX0_IRQn 1 */ / I, X0 v6 B! b$ c! g" L9 U /* USER CODE END CAN1_RX0_IRQn 1 */1 |2 t, B6 q0 S7 {& w$ {1 v- w" ? } 2 `/ N H7 W, R9 I( @0 K' Q' ~ 7、CAN2配置 static void MX_CAN2_Init(void)7 K; n9 D& i7 t3 x) s% w' p { ( ~" a2 m& x( k* H' d2 U" J/ L /* USER CODE BEGIN CAN2_Init 0 /+ \: U# k7 o) p% }$ W CAN_FilterTypeDef sFilterConfig; / USER CODE END CAN2_Init 0 */7 [: T7 N& @/ v8 \8 O3 C8 F/ r * e/ V2 {6 |! `9 v' a /* USER CODE BEGIN CAN2_Init 1 */& B/ q2 X* j4 R3 A5 K Z L$ T4 z, \4 O /* USER CODE END CAN2_Init 1 / hcan2.Instance = CAN2; hcan2.Init.Prescaler = 18; hcan2.Init.Mode = CAN_MODE_NORMAL;* e7 C/ I+ M% s# U. r. O2 o hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan2.Init.TimeSeg1 = CAN_BS1_2TQ;; ^! D @) @2 {9 ~1 W& q. F9 F hcan2.Init.TimeSeg2 = CAN_BS2_1TQ; hcan2.Init.TimeTriggeredMode = DISABLE; hcan2.Init.AutoBusOff = ENABLE; hcan2.Init.AutoWakeUp = DISABLE;1 B$ B1 t( z* O0 M# S. m+ K hcan2.Init.AutoRetransmission = DISABLE;1 `9 g/ n f* ^5 m3 X) Y1 z! V hcan2.Init.ReceiveFifoLocked = DISABLE;( j9 U2 z7 t" |7 U4 z1 s/ f6 T hcan2.Init.TransmitFifoPriority = DISABLE;7 d' U3 D3 {$ l9 P5 g2 e if (HAL_CAN_Init(&hcan2) != HAL_OK) { Error_Handler();( y! ~+ F1 B/ ]! }5 i4 N0 \ }% A$ o( q( |# {/ C7 D / USER CODE BEGIN CAN2_Init 2 */$ |- |) a( \ ^" T. S& m 4 v# c7 o2 M! L 8 D$ U* L- O) ~- X sFilterConfig.FilterBank = 14;0 V( x. v+ j* U. y8 w J sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;: M2 i+ n& p/ O) o sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;0 m* @3 W" p3 V& c sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000;7 @# y9 ?, R( R: b sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;: m/ o- r- Y: t# C) z5 k sFilterConfig.FilterActivation = ENABLE;1 P5 s/ e# O9 ]8 t6 Q sFilterConfig.SlaveStartFilterBank = 14; $ i1 d$ V, J3 s2 v3 k* q2 K if(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig)!=HAL_OK): {3 k1 `/ Y4 G' ?* L4 H6 S8 W { Error_Handler(); } , o( q* I3 n! Q0 ~1 V HAL_CAN_Start(&hcan2);$ ]' b0 y7 ~. H0 y& |6 { HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING); & c% c' u9 ~: y5 H+ W2 i, j. u! r /* USER CODE END CAN2_Init 2 */ } 8、CAN2中断函数) E. M- r6 o8 U- B: B: b void CAN2_RX0_IRQHandler(void)% d6 L7 c8 j8 Y4 e! ]1 b { v: Z; _: @: {' L) k7 o /* USER CODE BEGIN CAN2_RX0_IRQn 0 / HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxMessage1,RXBUF);0 l, Y/ J. e) H) R" s7 O2 p / USER CODE END CAN2_RX0_IRQn 0 / HAL_CAN_IRQHandler(&hcan2); / USER CODE BEGIN CAN2_RX0_IRQn 1 */! l9 W2 L4 Y& [ /* USER CODE END CAN2_RX0_IRQn 1 */ }0 t1 z& e4 A0 d, f! f + N8 V: x; h0 n: ~$ G 9、CAN2发送函数 void CAN_TRANSMIT1(void) { static uint8_t ll;! _/ h. ?+ o0 j+ z% A/ n TxMessage2.DLC=8;$ P7 U4 T3 o. L TxMessage2.StdId=0x003; TxMessage2.ExtId=0x00000003; TxMessage2.IDE=CAN_ID_EXT;2 o" k$ `* i, r! P; b5 z8 ] v TxMessage2.RTR=CAN_RTR_DATA; ll++;; q+ ]) ?$ Q* i8 [1 B" T if(ll>100) {ll=0;} uint8_t TR_BUF[8]={0,1,2,3,4,5,6,ll};8 S* }' @2 N I$ _) B if(HAL_CAN_AddTxMessage(&hcan2,&TxMessage2,TR_BUF,0 n* {% @* J4 G$ d* j. Q/ }+ h (uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)9 n" N, X y' j! c2 s( _( W$ e' E { // } }+ i3 ]8 o! b4 M( z ————————————————& D y+ N' C* @8 t6 i! E 版权声明:冬麻麻 0 p2 L9 V, |# @7 j3 i& v8 k S) l 5 k; \" V0 H" H0 X/ @( h8 O& r/ j( F |
新版STM32Cube for Visual Studio Code开发体验
【STM32N6570-DK评测】3.CubeMX关于DCMIPP和CSI的BUG整理及摄像头使用
经验分享常被误解的开、关总中断
【STM32C0测评】Nucleo-C092开发板功耗测试
【STM32C0测评】Nucleo-C092开发板IIC通信测试(硬件IIC)
【STM32C0测评】Nucleo-C092开发板IIC通信测试(软件IIC)
【STM32C0测评】Nucleo-C092开发板IIC通信测试(硬件软件IIC一网打尽)
【STM32C0测评】Nucleo-C092开发板USART串口测试
【STM32C0测评】Nucleo-C092开发板使用PWM控制板载LED呼吸灯
【STM32C0测评】Nucleo-C092板卡外部中断控制板载LED灯