拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:( F0 b# J3 Z4 d8 |% r -------------------------------------------------------------------------------传说中的分界线---------------------------------------------------------------------------- main.c #include "stm32l0xx_hal.h" #include "dma.h" #include "i2c.h" #include "tim.h" #include "usart.h"8 v# o7 [% |# Y% @, o #include "gpio.h" #include "mpu6050.h" #include "visualscope.h"* v! M" ^# m) [: u: ^7 I #include <string.h> #include <math.h>2 F2 p1 f9 H3 L1 p /* Private variables ---------------------------------------------------------*/) y. p( }: ^$ M# s+ z/ \# ] #define RXSIZE 8 #define TXSIZE 8% e+ A' j9 N# w uint8_t rxBuffer[RXSIZE];) q( G. J" j$ W9 K$ I uint8_t txBuffer[TXSIZE]; " O7 h! d. k7 V7 c. y7 ~% p float Angle_accel = 0; float Angle_gyro = 0; float Angle_comp = 0; uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */4 A8 P6 ] G6 a0 ^4 k+ S /*---------------------------------------------------------------------------------------------------------*/ /* 重力加速度算出的角度 */ /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleAccel() {2 U- X% _9 F! U+ q6 R- ] int32_t value = 0; + J9 j d3 q# v: s' r value = GetAccelValue('x');; `/ w9 f$ z# u( M4 V8 U+ F if(value > 16384) Angle_accel = -(asin(1) * 180 / 3.1415296);- N$ S/ Z' ?3 e" Q) `, p& }. S else Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);% Q3 h/ s, V1 }+ ~8 K: C7 h " u1 S& c" Z& B7 j X" }' I# D; a return value;7 j! n- D3 M" G/ t }3 _) {. P9 e( e* F, W" z! D /*---------------------------------------------------------------------------------------------------------*/# H( I: x1 U0 Y& o /* 角速度算出来的角度(积分) */; u0 v4 e6 z( t /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleGyro()& A1 `. l# [2 a+ z) G9 ~( x {/ d A/ i1 p& k$ M9 D0 ?# Y int32_t value = 0; value = GetGyroValue('y');* F5 s& _. d5 A" m3 c Angle_gyro += (value / 16.384 * 0.01); return value;+ E" I% W3 ~8 G. d! b } 2 d8 [+ {8 \6 T: q, q8 r /*---------------------------------------------------------------------------------------------------------*/ /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/ float ComplementFilter(int32_t simpleGyro)9 P O, n7 e0 \: {( _0 ] {3 x3 e) K$ O% q9 f7 B; ~ Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; 0 G7 X5 r. U5 h$ u$ T return Angle_comp; } /*---------------------------------------------------------------------------------------------------------*/) i+ D% a& ^ Y) _" g6 r$ P, y /* 输出角度至上位机 */ /*---------------------------------------------------------------------------------------------------------*/: a' z& v1 t! v void VisualScopeAngleOutput()/ E/ C2 s3 T) |+ o4 c$ m {/ g. _0 i) [; F int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;4 N! i1 v+ P0 w& D uint16_t crcValue;( z' O2 g0 L) `0 X AngleValue_Accel = ceil(Angle_accel * 10 -0.5);' o3 @2 ?& `. B$ _8 _5 D AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5); y3 h& C% g& p- F: M2 _ AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);4 f: ]5 Q1 O+ w! h 8 R) b8 w2 v6 E0 N outAngleData[0] = AngleValue_Accel & 0xFF; outAngleData[1] = AngleValue_Accel >> 8;5 P3 X7 F/ Z( P: O4 }# K& Y! y outAngleData[2] = AngleValue_Gyro & 0xFF; outAngleData[3] = AngleValue_Gyro >> 8; outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8; //计算CRC5 ]- [! C" G# S/ X# w0 [ crcValue = CRC_CHECK(outAngleData,8); outAngleData[8] = crcValue & 0xFF;" V8 W% a& [$ p8 O+ e outAngleData[9] = crcValue >> 8;+ T8 X$ i+ j5 @ V6 y& G //发送至上位机 HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));: f0 ^- F2 e8 I4 P1 L }0 O" d0 N; s) A# j- y3 t: ]: H# v O% Z /* USER CODE END 0 */9 R( c7 w& ?( t" ` /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); 3 A# F! Y0 K: F 硬件连接图:/ J) c6 V d) Z7 O# j 波形图: 最后加一个视频: STM32L053 演示6 l. K( [; Y( ]: a |
意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS
【STM32MP135-DK】裸机移植shell
【STM32MP13DK】 在Linux主机上交叉编译一个Hello Word应用
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体在意大利建SiC整合制造厂
轻松地实现ClassB在STM32CubeIDE上的移植
ST历史小知识(6)- 与世界共同塑造美好明天
ST历史小知识(5)- SiC衬底进一步发展
ST历史小知识(4)- 投资未来
ST历史小知识(3) - 布局新兴半导体工艺
#include "i2c.h"1 G* _! Y3 B4 M$ h% e( k. {2 _% q
#include "gpio.h"; `7 J' G. P( _* n9 e
: W+ c! O# C2 U% |, d' J
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/ `+ ~- T( O, H7 a& z
I2C_HandleTypeDef hi2cx;
/* I2C1 init function */
void MX_I2C1_Init(void)# Y, ~7 a5 E" Y0 k3 ~) j# C0 K: D( X
{; n5 t D+ f+ j9 A2 k
hi2cx.Instance = I2C1;
hi2cx.Init.Timing = 0x20D22930;
hi2cx.Init.OwnAddress1 = 0;9 R' R( c. e6 `% W$ v' H8 S
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;& y2 V9 O- ]; u9 I. ?; _
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
hi2cx.Init.OwnAddress2 = 0;( m; Y1 p I% s7 ] ]/ \
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; l- L n. Y" ]* i- e- t5 j) F
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;* P( X9 W7 \# y% f2 W* s
HAL_I2C_Init(&hi2cx);' U! D9 u$ T) p2 d
/**Configure Analogue filter
*/# J4 R0 m+ r( y2 a0 K
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
}0 ?" T7 }7 R) C7 d0 }
, L& D/ N. P2 D/ O. n$ H# l
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)5 w1 ]* o! W+ k( s6 y
{
* t& M4 b5 n4 g. w
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)! W1 Z2 X+ g. ~) T& l0 W# P
{
/* Peripheral clock enable */. ?. G3 W- C: s. P. ~- k$ L
__I2C1_CLK_ENABLE(); n0 q. A; X3 p' T) U2 s
/**I2C1 GPIO Configuration 8 c ^8 t* Y1 P
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA }0 D, e; A* y4 z+ y
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;) a; w0 l4 z4 |$ D
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;2 f! A+ J) X6 w! X9 W% B
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;1 q# M2 \3 l' b/ S; g
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}0 N$ f! ^+ j# G) V" G% t
}
* k/ j& u$ @ n. J& \" @" m
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
$ V* z3 ?# g/ m& a1 X( W
if(hi2c->Instance==I2C1)3 C* G8 I% Y& ]9 n$ [0 G7 Q
{6 v0 [1 q8 q' J( M8 g
/* Peripheral clock disable */
__I2C1_CLK_DISABLE();. z' J+ s6 q: X% z0 e
/**I2C1 GPIO Configuration % T0 o; ]* J3 m0 ?8 n& d$ K
PB6 ------> I2C1_SCL# L- M P' B, V0 M# H
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
( z; `2 i$ B# P6 A$ F. T4 M: a0 d
}' `2 J! D/ Q0 V [# s
}7 ~) @ X8 w+ S6 H/ y3 P
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
usart.c7 s& ^. P& I/ G+ c9 B
#include "usart.h"$ @' q; L v. j0 X, D& }; J
! j o M3 D; O3 A
#include "gpio.h": i" ^0 l' T$ H3 }
#include "dma.h"6 j Q+ }+ x' l- U8 q( `# n. e" G
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */% c' R P" p# m0 w0 e$ r }8 b
3 S, u+ v0 _7 K
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
) ^1 `. ^0 V/ Z
/* USART2 init function */
void MX_USART2_UART_Init(void)1 w$ m5 u: r L2 t
{
huart2.Instance = USART2;$ b- b1 N- g& M' M8 G' u
huart2.Init.BaudRate = 9600;, [' S' Q; Q, _+ G0 F: ~$ |
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;4 i; I# B4 Y' n3 k; \, @8 c
huart2.Init.Mode = UART_MODE_TX_RX;& C/ R* z4 k3 q q$ M" \, D/ I
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;4 G B. B7 A5 l: O
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;& d& h" B4 G9 a/ B; ?% @) B
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;$ B h! }" G5 b7 {: h
HAL_UART_Init(&huart2);% c4 U: x4 D4 ^( E8 C/ x( n' g: N
}
) ^) U4 K: h# r" q K
void HAL_UART_MspInit(UART_HandleTypeDef* huart)0 r3 u! }# q2 ^4 {9 t
{# p+ @ c) ^8 B* }2 J1 o4 _/ B o f
GPIO_InitTypeDef GPIO_InitStruct; W& t# ?) a4 U
if(huart->Instance==USART2)
{
/* Peripheral clock enable */8 Y1 g1 I4 C$ X- Y" k9 ^4 o8 C# }
__USART2_CLK_ENABLE();
& K9 N: j1 v6 L0 }& l
/**USART2 GPIO Configuration 4 u4 S- m7 Q' \# k) e; d
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;0 t; M( |4 V3 x$ w
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2 F I: s- d5 l! U
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;' x: t9 Y+ m8 Q* w8 v+ x/ v! \% {/ v
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;& W, w5 W# K% q8 E5 r4 i( t% Z
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;: c9 b; n2 ^0 m6 i, `
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);. _7 \2 v* G/ b8 W: c# Z8 z
/* Peripheral DMA init*// r- a6 o$ q, K" e: s# P# |2 [
hdma_usart2_rx.Instance = DMA1_Channel5;
hdma_usart2_rx.Init.Request = DMA_REQUEST_4;. h. A3 }3 v, s" |; u; [2 T2 m* B: r
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;0 Z, D4 N& b. ?" H. F3 f
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;& g; f8 b2 `0 h
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;; \# \& E, p8 x+ Y$ F
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;9 [8 |- E8 G- ^& R9 w$ W
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;: f6 x2 n h( k% f( \4 T
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;1 h& m% ~: Z% ]
HAL_DMA_Init(&hdma_usart2_rx);
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
( \6 L2 q5 R9 O/ q: ~
hdma_usart2_tx.Instance = DMA1_Channel4;
hdma_usart2_tx.Init.Request = DMA_REQUEST_4;- `) d9 q4 b5 y n' f
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;9 Y- U7 A, @0 E* r$ R: n: H
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;2 q2 x$ B1 p m, C, z
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;: T1 O+ A; B6 \6 R
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;* a( R, u8 ^; @. M1 q: ?. D) q2 z
HAL_DMA_Init(&hdma_usart2_tx);9 b" q: D0 G* \( }+ h4 X- H
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
! h ^' S) Z! d/ L2 {2 C( G/ W) Q [
}3 x, T7 ^1 Z; G% n; v3 i; O
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
0 U, w K: R6 e
if(huart->Instance==USART2)
{4 y r6 _/ k3 D; _
/* Peripheral clock disable */
__USART2_CLK_DISABLE();- v9 S3 c' U& B, N2 [6 J
+ |, }& _" T$ e' q. ^/ J: K+ c
/**USART2 GPIO Configuration c8 T2 A" p: {7 @+ u. M+ M6 U4 @
PA2 ------> USART2_TX
PA3 ------> USART2_RX5 b+ @( T' Z+ ^4 r, h
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
/* Peripheral DMA DeInit*/! b# W( x6 o. `' @
HAL_DMA_DeInit(huart->hdmarx);
HAL_DMA_DeInit(huart->hdmatx);
}
}* w# ~; [ Y, s/ `. Z% J6 m5 ~% \
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------3 s5 W2 ^& I+ E
mpu6050.c
#include "stm32l0xx_hal.h"
#include "MPU6050.h" @! k0 J! X0 r2 z& B; v: B4 s
- C8 L9 Y( E4 M1 y& c7 |$ V
//各坐标轴上静止偏差(重力,角速度)8 k9 T9 p5 \) V/ W. N% P" W
int16_t offsetAccelX = -195;
int16_t offsetAccelY = 560;$ w6 j/ I( \/ {" ^5 X
int16_t offsetAccelZ = -169;- o# V- |' N+ l2 X1 P
int16_t offsetGyroX = 12;
int16_t offsetGyroY = 33;+ [5 q% |2 r; e6 ^1 C% }5 D- P# Q
int16_t offsetGyroZ = 4;1 f+ ^& Y* i/ S: ~" q
7 Q$ k4 V* ]! T
extern I2C_HandleTypeDef hi2cx;! P1 ^2 w5 i% m7 h, o9 g6 y
//**************************************
//向I2C设备写入一个字节数据# S* B, B5 D& y# I
//**************************************) n" j }0 m" U4 F' z. l
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)% S$ r ^4 q* `2 Y1 v6 B7 l
{
uint8_t rxData[2] = {REG_Address,REG_data};
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK); K3 |, E7 A Z+ {" j% Y5 }
{0 z4 b4 ?5 ] ^: e
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}) l5 L! G7 P1 D: s- B% d3 {+ a
}, Z4 \4 O: |" E) D
}
//**************************************, D1 |) O& `7 p
//从I2C设备读取一个字节数据9 n0 q$ e! l, U' M6 w* ~* z
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)+ {0 K7 ?& L9 I* g& Q' A
{
uint8_t REG_data;
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)2 o3 @1 O0 L1 S' M8 {! u
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)* C3 a$ z. Q8 l. \) \- G
{}
}, `4 O: n P) @7 }7 X }
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)
{! o4 R0 i3 ]- R8 z% j
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}
return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050(). C' J9 l! Z- J0 s/ S( K+ m. O
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态" i0 [: k- s( J2 U
% s* Q- L$ Z5 l2 l1 d
Single_WriteI2C(SMPLRT_DIV, 0x07);- H3 {/ p" `2 Z* U: M* ~% r
2 v- m0 _5 A3 ^8 ^5 N. s$ U
Single_WriteI2C(CONFIG, 0x06);
Single_WriteI2C(GYRO_CONFIG, 0x18);
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成数据6 l2 l, X0 W! g# [+ E
//**************************************4 l: I; E( R: e, b- r( |5 o
int16_t GetMPUOutValue(uint8_t REG_Address)4 N" L' m+ q6 `+ X+ M
{
int16_t result;
uint8_t H,L;! y8 k6 q: L, E4 ^; X2 {- b4 M
H=Single_ReadI2C(REG_Address); h+ _9 h# O/ ^! s% a
L=Single_ReadI2C(REG_Address+1);
result = (H<<8)+L;$ z* ]9 u. @4 r/ L
return result; //合成数据% B. Q8 w8 i& d* _/ n/ S
}( @5 s% _; `# i% K5 K
//**************************************6 D4 O" K8 H$ O2 {
//取某一轴上的加速度数据
//**************************************
int16_t GetAccelValue(char axis)
{, }+ h- @- A6 s& V" p
int16_t result = 0;
switch(axis)
{
case 'x':! _# t& ]/ w; B& V
case 'X':5 I9 \ U6 `0 R8 ]- A* W
{
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;
}+ r0 |1 D' j( j) {* W" D* ?/ x
break;
case 'y':
case 'Y':
{1 E; B! s4 g% P& L/ C4 H
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;
}& g1 T; c- u$ J4 o6 Q( x
break;
case 'z':
case 'Z':( _( w' E) B Y8 \3 |
{, t- e- V" K0 T$ \
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;
}4 \" e, b# ~: t( Q8 c/ D( N
break;1 ^# B& d4 N P2 a6 ~! N Q! d
}
return result;0 Q8 x3 j8 W; C5 V. C2 e( {) O
}2 y% _- o4 M A* z0 X6 w
//**************************************, @( t# C0 t/ n1 i# m% g5 n2 `
//取某一轴上的角速度数据
//**************************************: i: q& B' U+ i* s3 M" G; z0 s* @
int16_t GetGyroValue(char axis)
{+ }% [ O% {' G+ ]/ G7 z$ k
int16_t result = 0;0 D& M: p( Q' Y3 l; k g* a% @
switch(axis): c( Z9 x1 n* Z0 a1 ?. ]
{
case 'x':
case 'X':2 e, q, D2 z( r0 {( x0 ~% p2 l
{6 O* F6 u- o" V# D$ i9 c
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;" |, o( z* N3 k
}8 B1 k# j$ q Y; B* d
break;
case 'y':2 ~7 z# T2 h3 K9 q Q, ?1 Z+ \
case 'Y':
{ z7 S/ M7 U$ M/ i
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
}
break;3 G* j, ?; O/ @6 X' }8 G+ N
case 'z':
case 'Z':
{% r8 G0 x! G& g# j1 |7 t* C# E
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
}
break;
}% C0 S8 M9 e) p
return result;
}
评分
查看全部评分
{
, v. K; x* P/ X4 ~$ e8 ]
/* USER CODE BEGIN 1 */0 e- c8 F9 }9 ]. G0 @$ l
/* USER CODE END 1 */8 r# q8 h I1 P9 O
J1 {1 R4 t9 s. e. Z- O
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
, R" \, V& I& q# g
/* Configure the system clock */: p V& }& ^; C
SystemClock_Config();
/* System interrupt init*/3 Y3 @5 R! Q! Z- y! U
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
2 o" N! i% M4 ?: I5 a8 K7 E
/* Initialize all configured peripherals */: T% X) k+ I7 q# V0 g' g2 F. I
MX_GPIO_Init();* M4 M. c, ^, Q- ~
MX_DMA_Init();* U2 [' D1 W, v6 O+ P
MX_I2C1_Init();
MX_TIM2_Init();
MX_USART2_UART_Init();8 P- d' z: U5 d- E) z
InitMPU6050();
! |& t" [3 |5 M% ?2 ]2 v
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);. E5 S" `! U* H' n9 Z# K- D( E w
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */8 N& ]$ U5 u# ?5 [
/* USER CODE BEGIN 3 */6 h( I& T& C/ \" ^
/* Infinite loop */
while (1)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);( @! d. o ^+ ^3 D% \! [/ M( b
VisualScopeAngleOutput();
HAL_Delay(100);( h' G: A) t. ^& ]
}
/* USER CODE END 3 */- d; O: G. h( p" \( C
}- [. Z$ ^ ]) y2 K4 e
3 u+ u: w/ u D; G0 S
/** System Clock Configuration
*/
void SystemClock_Config(void)' {; f; c9 v. ^( l5 ^) i
{- m1 s8 s, K' t2 j$ \7 U
RCC_ClkInitTypeDef RCC_ClkInitStruct;5 Q* i* {, e, q# T. S! Q
RCC_PeriphCLKInitTypeDef PeriphClkInit;
RCC_OscInitTypeDef RCC_OscInitStruct;5 U l* l8 o1 f: l; L A- v$ z4 |& P
/ }) v3 |5 b5 v- {2 E1 _2 v' h
__PWR_CLK_ENABLE();( O. }& u- w* D' D5 V
' t2 ~/ U" m$ p+ i( M* n
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;0 k: u! T1 @* e, r: j
RCC_OscInitStruct.HSIState = RCC_HSI_ON;$ t$ J: j# a( u) R. h
RCC_OscInitStruct.HSICalibrationValue = 16;+ [3 U p/ `& ~
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;- {3 a9 H/ j9 Q, _* x R- I& L
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;6 s# p" E, i+ l9 G: E5 `
HAL_RCC_OscConfig(&RCC_OscInitStruct);
# I c7 r1 f7 M( k, b
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;$ Q8 ?$ {* p/ U5 m% G/ f
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;; o' I% P( Y" S/ G0 F& a! X8 I" B
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;+ p! X2 C# L' X1 n1 ]) S
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
! w9 N% A3 o' {2 a9 r
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;% E* J/ w/ b. {5 D1 f
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;& u' m9 e/ E4 `/ h, W: M0 F
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
__SYSCFG_CLK_ENABLE();
1 n* h7 x, y8 `! P
}" u- }5 J3 ?( v5 h Y; ?
: z- F; }/ N+ k3 y' t
/* USER CODE BEGIN 4 */ B- f$ z: C9 k# g; g
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): p; P W% h5 K( K, d
{
if(huart->Instance == USART2)
{
memcpy(txBuffer,rxBuffer,RXSIZE);6 ^9 l5 X8 x' S
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}
}' p: d8 ]0 v$ k$ A3 N8 _! u. _( B
7 g5 P# R! b3 I* ?
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)' J* ]% z4 y3 X5 U4 Q) R
{# _2 g+ M( J4 S% m" M9 D
}2 f9 m8 g5 {; K; Q6 {& `7 B j7 K
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ s9 Z$ a0 N& d2 {& q
int32_t GyroValue;
9 ?" x; S7 H6 u$ O3 y
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();
ComplementFilter(GyroValue);
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。