|
你好, 我有開個專案MCU選用的是STM32F091CBTx 包含CANBUS的應用, 直接下載到在NUCLEO64(STM32F091RC)的時候,CAN_TX (PA12)是可以發出CAN的訊息出來 可是當我把同一個專案直接下載到STM32F091CBTx應用板上的時候,CAN_TX (PA12)發出CAN的訊息卻是不正確的- K& V% O1 a3 Y# ~0 a# ?5 Y 請問一下,這是什麼原因8 _2 v2 D7 p* c7 n: P : s; l0 I9 ~9 f% @5 b% y: B0 d 程式碼如下 /* CAN init function */6 i$ K) p7 D6 J3 \0 r3 E5 ` void MX_CAN_Init(void)- `/ @3 z8 y- Y+ G" Y {8 R0 U4 N! F, s, F( k. s9 r CAN_FilterConfTypeDef sFilterConfig;# e5 | T3 N) r# _7 F+ W- Q hcan.Instance = CAN; hcan.Init.Prescaler = 3; hcan.Init.Mode = CAN_MODE_NORMAL;. v. J% M* L% T9 c2 P9 P hcan.Init.SJW = CAN_SJW_1TQ;1 u% S7 j1 }& m3 V* F* \ hcan.Init.BS1 = CAN_BS1_10TQ;- _+ s" D* G6 ?9 I4 M4 C# Z9 d; m+ J$ L, ] hcan.Init.BS2 = CAN_BS2_4TQ; hcan.Init.TTCM = DISABLE;9 v% \7 t( {- I3 O2 i: C hcan.Init.ABOM = ENABLE; hcan.Init.AWUM = DISABLE;" d2 ]& n6 r: v4 j! K. | hcan.Init.NART = DISABLE; hcan.Init.RFLM = DISABLE; hcan.Init.TXFP = DISABLE;1 d2 O7 D: ?4 z& _/ o1 F+ t if (HAL_CAN_Init(&hcan) != HAL_OK) {% u0 L: ]% m( H) h3 ^6 I _Error_Handler(__FILE__, __LINE__);# K& k+ c, W" W* [" \ } sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;9 T- v1 o" o- S, I- ~7 ? sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;9 a. ^6 r" C, | sFilterConfig.FilterIdHigh = 0x0000;+ y" a: F& e& l7 I/ D" k sFilterConfig.FilterIdLow = 0x0000;& Z8 @7 W5 c) m/ H: U* Z sFilterConfig.FilterMaskIdHigh = 0x0000;- B3 v+ ?; M! ]9 r$ t5 W0 _5 q sFilterConfig.FilterMaskIdLow = 0x0000;0 A* V9 w* Z) J3 S. M5 ~5 j: { sFilterConfig.FilterFIFOAssignment = 0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 0; HAL_CAN_ConfigFilter(&hcan, &sFilterConfig); 8 r. ?5 }' ~7 N- t }5 D9 }; x K( S1 `* n) l4 F0 Y( S //========================================== 6 E" u( _; [% A% S* ~1 G void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle) { GPIO_InitTypeDef GPIO_InitStruct;' B: ~" Q3 S, O, R if(canHandle->Instance==CAN). f9 a/ K1 n+ Z" ~ O { /* USER CODE BEGIN CAN_MspInit 0 */ /* USER CODE END CAN_MspInit 0 */ /* CAN clock enable */( A; R. n n. r* ? E" g& K 2 x% x1 h- G- W* w$ c2 J- f ) L% u7 L- \+ N /**CAN GPIO Configuration 4 m6 D7 m+ ?) A3 }* V$ z5 u9 R PA11 ------> CAN_RX PA12 ------> CAN_TX */ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;, \ ^# W7 t, o$ A$ u GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_CAN;6 k" l, M$ L" I1 O- B2 p/ ?' i6 G3 s HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);& h. a$ |* I: @* @ __HAL_RCC_CAN1_CLK_ENABLE(); /* CAN interrupt Init */9 c2 V, G- V" \! s% B HAL_NVIC_SetPriority(CEC_CAN_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CEC_CAN_IRQn);* P t8 e* J; R2 R /* USER CODE BEGIN CAN_MspInit 1 */4 W" ~- a7 j7 N$ L 5 U0 R) h8 n( |4 A* ]) j0 _ /* USER CODE END CAN_MspInit 1 */ } }0 i6 x0 f5 @' Z7 {6 z* K- [- T void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle) {3 H- m1 o6 l, `8 } B ! A- ^. P5 o9 Y8 Q# Q if(canHandle->Instance==CAN) { /* USER CODE BEGIN CAN_MspDeInit 0 */6 B- ]/ v- c) x4 I7 w$ l; d /* USER CODE END CAN_MspDeInit 0 */2 v( n( P+ y. o) ^* D0 s+ K /* Peripheral clock disable */ __HAL_RCC_CAN1_CLK_DISABLE(); 4 v. I+ b" e$ ?( T /**CAN GPIO Configuration & I3 V+ g. X1 F+ z PA11 ------> CAN_RX" E' Y6 Z' }- w( r/ S: K$ [ PA12 ------> CAN_TX ! ?: M. T; F' v! ?! q8 y3 y */4 R( Z3 G" w) b( P HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); /* CAN interrupt Deinit */# p# @4 m: o6 R HAL_NVIC_DisableIRQ(CEC_CAN_IRQn); /* USER CODE BEGIN CAN_MspDeInit 1 */ /* USER CODE END CAN_MspDeInit 1 */ }( O \2 x$ P o: o/ W/ n! n' _2 n } & {( j# W* ~+ I+ I2 B% d //=================================================== int main(void) { /* USER CODE BEGIN 1 */6 J& M9 U' b4 k( k K L1 a F: e8 t* { /* USER CODE END 1 */ 5 K3 D8 g' z3 t! @ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */3 ]! i5 ?! r# M( g HAL_Init(); $ g% ^8 R' c3 O- F c Q SystemClock_Config();) T9 |3 p# r! K" f( y + _* C2 _' z; E% P7 O, }, z# R /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_CAN_Init(); /* USER CODE BEGIN 2 */' _! l$ M6 B' q* s CANTxMessage.DLC = 8;* r X+ D, E b* ?% s; L& W/ D* V CANTxMessage.IDE = CAN_ID_STD; j, B N$ H0 P0 ~ CANTxMessage.StdId = 0x07; CANTxMessage.RTR = CAN_RTR_DATA;$ B. }( K% l$ {+ N! r S% \ CANTxMessage.Data[0] = 0; CANTxMessage.Data[1] = 10; CANTxMessage.Data[2] = 20;5 D# n. H6 g+ f& h& t CANTxMessage.Data[3] = 30; CANTxMessage.Data[4] = 40; CANTxMessage.Data[5] = 50;! [2 S& \3 S9 J- E6 ? CANTxMessage.Data[6] = 60;0 [+ {7 j" X: u9 r+ n$ K9 ^ CANTxMessage.Data[7] = 70;: w! C# P, z/ u6 x0 T- { /* USER CODE END 2 */ hcan.pTxMsg = &CANTxMessage; while (1) { /* USER CODE END WHILE */ HAL_Delay(100);+ V; w# X& _% e J2 ?0 Z HAL_CAN_Transmit(&hcan,100); /* USER CODE BEGIN 3 */ 9 ]" `0 y( W! r# _6 p1 s } } * K' {2 j3 c5 A; e8 N Y; L /** System Clock Configuration */2 y# _ D1 M+ ~! e void SystemClock_Config(void)* e3 o* [0 z5 J2 w |7 W6 ~ {, V) p1 U) w* }# H4 V3 y 1 x1 L) ]' V) L# L3 }$ s RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Initializes the CPU, AHB and APB busses clocks % P% {; p+ I3 S" d* U% H */3 [ b( w7 i9 n% n" r7 N RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;- v1 C% c, y" _7 ~1 d2 ]: s! ] RCC_OscInitStruct.HSEState = RCC_HSE_ON; P* Z. W5 W. }1 l& B9 n RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;# Q) O+ a- U/ p+ Q, d RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;4 x# j( {/ s; a P RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK); @5 m4 f) M' S: H5 _( x' ^ { _Error_Handler(__FILE__, __LINE__);, A7 ~% t5 {7 M+ B- P5 v } /**Initializes the CPU, AHB and APB busses clocks */, W$ g: Z8 L" n! Y; I RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK% K b Z! J0 V( n4 O |RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;3 R- {) v. W7 e RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;$ x! `# l4 P/ z! C. S) @- x RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;' V: d% ~5 z6 ^ ' F" [1 z; O; b9 Z& ^ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {2 X5 Y# ]$ N3 I7 a: D1 M _Error_Handler(__FILE__, __LINE__);9 O! z. R; {, g9 l( S } ) e. v+ D: M; S0 s6 _" r9 {, c /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);- {! q7 r* r/ A6 H" s9 g# J' X , o" S( n$ A, }* k /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);7 [: L2 S' l# S7 S9 d6 } /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); }" V; {$ ~7 Q" C" J |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版