STMCU小助手
发布时间:2023-3-7 14:00
|
1、默认STM32CAN1就是主站。CAN2是从站. ?4 ~' t" z+ w! y 2、主站配置如下:参考时钟是72M/2=36M) M" M5 G- m7 K& o+ ? 波特率:36M/9/(2+2+1)=800K.所以通讯频率800K。$ @2 A9 J+ B0 N0 G6 [# t 注意此处BUS-Off一定要enable。否则出现插上下载器两个站就不能同时发送的情况7 L3 P8 }6 h# ^
3、中断设置& N; s1 U/ W: p# R, L9 Q$ w ( s% o. n! O: K- b# u& l
2 z# I% f. g) U- S+ h0 p ; h! q+ e @* l8 @ 4、can开启函数:5 r1 h6 t9 [/ l6 R' k HAL_CAN_Start(&hcan1);! l6 Y: ?5 F9 r) v3 I( G8 ]# D HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING); can发送函数: void CAN_TRANSMIT1(void) {- {8 y4 _# R' l* k3 M TxMessage2.DLC=8;) w9 T3 m6 z; m- u' F" [ TxMessage2.StdId=0x314;$ m' D" c* b2 r TxMessage2.ExtId=0x00001314;7 b* X* a- [' R/ K! d* R- _4 y TxMessage2.IDE=CAN_ID_EXT;7 s! M D" |1 m( r) @+ m- h TxMessage2.RTR=CAN_RTR_DATA; uint8_t TR_BUF[8]=“22222222”;; L: I% ]4 z/ @( X6 P/ o$ p1 z if(HAL_CAN_AddTxMessage(&hcan1,&TxMessage2,TR_BUF,(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK) { printf("???1");: s5 ?( E$ b6 K) V# k* T5 ~. T6 I) ] } }( O" m4 I) @" p, } 7 K [: R% H$ h$ u+ D2 ~. r 5、can1配置 static void MX_CAN1_Init(void) { 1 d; G+ B! _) R$ v* e /* USER CODE BEGIN CAN1_Init 0 / CAN_FilterTypeDef sFilterConfig;& s+ j" ?5 X! R3 Z1 p' q / USER CODE END CAN1_Init 0 */. k0 {6 |8 O: P J 2 i% \$ Q! U/ {, c0 F) o) \1 x7 T /* USER CODE BEGIN CAN1_Init 1 */% U, P( G( H$ b7 K: e /* USER CODE END CAN1_Init 1 / hcan1.Instance = CAN1; hcan1.Init.Prescaler = 18; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;! i7 D- |+ O9 U7 _% [0 E hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;0 T% _4 i' i l% ^6 q# i, I; H2 a2 _ hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;' ]0 h" @; t7 t, Y" q# b7 n hcan1.Init.TimeTriggeredMode = DISABLE;4 m7 g7 O& J- d* s( V x/ u4 v hcan1.Init.AutoBusOff = ENABLE; hcan1.Init.AutoWakeUp = DISABLE;% e$ G) p0 m! G7 e5 d: D: ] hcan1.Init.AutoRetransmission = DISABLE;/ g% [/ q2 ~6 f# L hcan1.Init.ReceiveFifoLocked = DISABLE;/ \# y( R; v. y( w hcan1.Init.TransmitFifoPriority = DISABLE;; x' F) ]; U* s& a( d$ ?: k if (HAL_CAN_Init(&hcan1) != HAL_OK)% R4 N, {. K+ @' W' c$ z5 ^ { Error_Handler();- x# [# b( a( T# S- F# O+ p }, e2 x2 w+ f1 W1 y& e / USER CODE BEGIN CAN1_Init 2 */ sFilterConfig.FilterBank = 0; v A8 J# k" L sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;) u w& i# T( e sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000;$ R, K: |$ Y1 K+ s& } sFilterConfig.FilterMaskIdHigh = 0x0000;, \+ @- `. I2 @' e2 W5 ^ sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;$ H, Q' `) V& R sFilterConfig.FilterActivation = ENABLE;; }8 C3 t5 r% N. u8 w; x3 D sFilterConfig.SlaveStartFilterBank = 14;! _& y9 R* Q/ I# i; }, s9 g( y * n! |- p/ X" e if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)!=HAL_OK) {& K: C5 s7 F$ I ]& H% x Error_Handler();" w" K6 M5 I7 n) X* t3 o } 5 I; E: k" n8 b1 Y4 j! R. e- d; w /* USER CODE END CAN1_Init 2 */9 y- C8 _0 l% y* h- O. B0 ]/ X 4 S8 t9 z1 T7 t2 M. }' B8 s } ' Z/ J7 Y4 @& M0 E 6、CAN1中断函数 I' p4 T( m/ q# M: j6 B8 C/ C void CAN1_RX0_IRQHandler(void) {4 T9 a; U* z# ]# y- s7 j /* USER CODE BEGIN CAN1_RX0_IRQn 0 */+ }2 z) ]# z3 I9 D 7 V3 T) p& V5 t' W8 `% f8 J+ X3 y HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&RxMessage1,RXBUF); / I5 f; U1 P6 @( P /* USER CODE END CAN1_RX0_IRQn 0 /& T: ]- ^, j* t! | HAL_CAN_IRQHandler(&hcan1); / USER CODE BEGIN CAN1_RX0_IRQn 1 */. g4 c8 Y6 o! }7 z5 |4 Z 1 X& a! F6 g2 `. \. `& t $ {$ @, x0 ^% Y! K5 h /* USER CODE END CAN1_RX0_IRQn 1 */ } 7、CAN2配置 static void MX_CAN2_Init(void)* O& l% p: s2 C5 X C' w- L- x { /* USER CODE BEGIN CAN2_Init 0 / CAN_FilterTypeDef sFilterConfig; / USER CODE END CAN2_Init 0 */ 2 m- f; T% _4 s5 k /* USER CODE BEGIN CAN2_Init 1 */ 0 c3 P; Y1 g( p /* USER CODE END CAN2_Init 1 / hcan2.Instance = CAN2;. m9 |% r5 [9 b- J hcan2.Init.Prescaler = 18; hcan2.Init.Mode = CAN_MODE_NORMAL;( a* i% i8 w/ a9 M, ] hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;7 A! d- l# k! f; j( T: y+ s hcan2.Init.TimeSeg1 = CAN_BS1_2TQ; hcan2.Init.TimeSeg2 = CAN_BS2_1TQ;& ~2 M4 k1 S" h! T( I0 A hcan2.Init.TimeTriggeredMode = DISABLE; hcan2.Init.AutoBusOff = ENABLE; hcan2.Init.AutoWakeUp = DISABLE;+ q! b+ f. U: b m7 n) `/ A4 P, } hcan2.Init.AutoRetransmission = DISABLE; hcan2.Init.ReceiveFifoLocked = DISABLE;. g, i7 Q, `) s/ ^ hcan2.Init.TransmitFifoPriority = DISABLE;7 b- D) L7 R8 l if (HAL_CAN_Init(&hcan2) != HAL_OK) {- I& F" \, D% H9 j8 u" y1 P Error_Handler();" b: ^! H. t3 {' ~ } / USER CODE BEGIN CAN2_Init 2 */+ I, V" F$ S6 }" `. H sFilterConfig.FilterBank = 14;; o' J5 S0 t, D sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;4 Q1 W: y: I4 J sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;/ D0 o5 q$ C$ l+ T2 D# f- b: | sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000;" ~; \$ I% ^8 ^7 B/ z2 } sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;$ Z5 b% W4 K4 B- \- }/ Q sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14; # n2 O* }2 P: @- e if(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig)!=HAL_OK)" v* u7 i# h3 X2 t' R7 M2 p: x, q {3 p; }8 r3 N3 i1 N& h Error_Handler(); }0 P) j4 [) w' r, r2 O! C, s8 a HAL_CAN_Start(&hcan2);& M/ Y+ I' D+ ~# g1 W1 c HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING); /* USER CODE END CAN2_Init 2 */. i; r6 j# G/ Z: d 4 J) x7 U; P& o. V }' e. x9 C) w6 F" D9 e 8、CAN2中断函数 void CAN2_RX0_IRQHandler(void)0 T# d* P- C* W" s { /* USER CODE BEGIN CAN2_RX0_IRQn 0 /, S; G3 V# m: j3 M2 o4 ` HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxMessage1,RXBUF); / USER CODE END CAN2_RX0_IRQn 0 /% ^- }4 f+ H2 Y- G3 K9 t HAL_CAN_IRQHandler(&hcan2);1 o9 j3 |6 Q4 b4 v' [7 Z& s / USER CODE BEGIN CAN2_RX0_IRQn 1 */ /* USER CODE END CAN2_RX0_IRQn 1 */ }* M( g+ B' a- B' L6 d2 t/ B) G 6 W, T9 M# Y" k( s+ [$ P 9、CAN2发送函数2 m) f9 q) m) A5 u: E4 B8 N5 n9 a5 | void CAN_TRANSMIT1(void) {- ^% I. A5 \) X8 i6 n0 T$ X static uint8_t ll;3 ]& M9 _, J0 {1 O6 ]4 c# F* o TxMessage2.DLC=8;9 j9 s. ]6 [4 \ TxMessage2.StdId=0x003; TxMessage2.ExtId=0x00000003; TxMessage2.IDE=CAN_ID_EXT; TxMessage2.RTR=CAN_RTR_DATA; ll++;3 Y* I: o7 i* S1 q& E if(ll>100) {ll=0;}3 h9 j( q8 h3 r/ M1 j5 B uint8_t TR_BUF[8]={0,1,2,3,4,5,6,ll};! P* X; G; M; q% n- L* G i if(HAL_CAN_AddTxMessage(&hcan2,&TxMessage2,TR_BUF, (uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK) {3 B' \, U( \6 c8 f //5 p2 M1 @; Q9 o; S# \ }6 `8 c$ ]% t a } ————————————————( @6 p9 a+ U5 i& K0 Q- k# _3 M$ G7 M 版权声明:冬麻麻 3 }, X; R' p8 l |
【STM32H5 评测】ADC 电压表
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】介绍、环境搭建、工程测试
#双节活动 1.在CubeMX中引用touchGFX出现的问题与解决
如何将STM32CubeMX生成的CMake工程导入STM32CubeIDE
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
微信公众号
手机版