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

STM32L0 HAL驱动 串口 DMA,I2C读MPU6050 精华  

[复制链接]
党国特派员 发布时间:2015-1-6 13:21
拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:
1 _9 G% L# _$ b% C; a-------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------& e; B, M9 h" {1 P9 }$ o
main.c
% x% h7 t+ w$ U4 a. U6 Z" [; P#include "stm32l0xx_hal.h"
# {" z0 w" e' Z  O' T2 e  q. ?  G#include "dma.h"8 m' s8 }* @2 s
#include "i2c.h"( S+ c0 l. D+ R) L- G! c$ C  k5 k8 Y
#include "tim.h"" b9 Q4 }) |& p7 A4 F! _( D1 }! M  g% {: b
#include "usart.h"0 r8 F2 |' h4 |9 z) n
#include "gpio.h"8 k7 V' G6 M& c( M2 w
#include "mpu6050.h". E- o; `: w% S1 \) \  F$ U$ I
#include "visualscope.h"
, J/ L3 t" B$ O7 G! l; [5 k+ q$ I9 F5 q
#include <string.h>. a7 p+ W1 }7 _3 t) w2 f* x
#include <math.h>
3 x. F4 F6 ^2 w. J0 w: J; G& g' T
0 e1 M( P  W% o1 b/* Private variables ---------------------------------------------------------*/9 E, Y" s- G, L; ?$ v: \- S% N' }
#define RXSIZE 8
  V- Z* i# P2 W" U! l% Z  Z#define TXSIZE 8
4 J3 X! R& h* X( U/ q# g4 Luint8_t rxBuffer[RXSIZE];
' P% E6 Q/ B  [8 j' P- ]7 g0 `uint8_t txBuffer[TXSIZE];; r  i* Y* q4 q, ~0 X- l0 F
! Z% W0 h/ d7 N
float Angle_accel = 0;
) [& ~; E. q1 p) X; i% Zfloat Angle_gyro = 0;
. u" @5 P( E  C$ D5 mfloat Angle_comp = 0;
" X0 N1 |7 R. Q+ s6 Vuint8_t outAngleData[10];% d2 _0 ?" n% H' \% T+ L* H
/* USER CODE BEGIN 0 */
9 {4 l5 l& H0 s' |  R+ b. k
5 \1 O. y6 T0 r' y! c/*---------------------------------------------------------------------------------------------------------*/* H) K, X% T) K# F5 O: G
/*  重力加速度算出的角度                                                                                       */8 N; e/ ^+ u+ s1 L0 Q; ]
/*---------------------------------------------------------------------------------------------------------*/% A' K) Q% g5 Y: w6 P
int32_t Calc_AngleAccel()7 y! T$ y! Y5 V& w. J
{5 u, I) Q" D. k2 k/ C% t9 }# l
    int32_t value = 0;* _! I+ e8 I6 p* [7 ^' W; ^; a. _
   
" y1 s4 n# |9 `  @+ P3 E    value = GetAccelValue('x');& ~! U1 ^& q% i5 E* C3 i& p
    if(value > 16384)
0 U* \' ^# Z! v' E        Angle_accel = -(asin(1) * 180 / 3.1415296);. C' h* g  |3 G# b( Z5 _4 h
    else4 L5 W$ r3 @. k
        Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);" v: I" N) N1 J
   
, L2 A3 A; `/ m  k( n* F; ~    return value;& H; S4 U, g. @" a: `0 d
}
! I9 n" ^/ G) \+ G* R
+ R* |) w% g/ o+ s/ Z; E! R, r/*---------------------------------------------------------------------------------------------------------*/, j1 k/ v8 ]5 E  s9 p0 t4 d
/*   角速度算出来的角度(积分)                                                                                     */
( B$ K% i) @  ]5 k  A. {. T* L/*---------------------------------------------------------------------------------------------------------*/0 p* d$ _1 z9 A1 G! F$ z2 M
int32_t Calc_AngleGyro()
  F" e: ^6 [  a{
8 A2 N- S5 x# e1 U    int32_t value = 0;0 r9 q1 @$ C' ^
9 B8 h$ P4 G3 z3 t
    value = GetGyroValue('y');; q2 D: e8 `, B& U, N3 f$ B
    Angle_gyro += (value / 16.384 * 0.01);
3 M' r( S  b0 V+ i7 |$ V' r   
. y6 r+ M. ^2 E0 N1 p& J9 c    return value;
: B( Q: N& G+ W0 N$ j}1 k5 L2 {/ ~1 B! L" r8 p

3 x( S' p) @+ z) y/*---------------------------------------------------------------------------------------------------------*/
/ r2 [# b5 k$ I& ]0 y/*   互补滤波求角度                                                                                     */
% e1 Y& w6 D' i7 p/*---------------------------------------------------------------------------------------------------------*/
7 F) S) L/ G% N9 r2 T7 v0 Gfloat ComplementFilter(int32_t simpleGyro)2 m! y' j9 @3 N* t
{
" @' L& l9 a; M/ u0 |    Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel;2 G7 T' g0 d/ p5 O+ Q0 |5 Q" F
    ' a2 S; t7 {9 n8 T6 ^& n
    return Angle_comp;
. F0 d9 u$ D, d}/ \( }$ S% e) M. Z+ L; d; c
+ A- v' o! l7 [6 [0 L; s' m: @1 ~
/*---------------------------------------------------------------------------------------------------------*/0 T5 M8 u) z0 g$ `& v" b! }
/*   输出角度至上位机                                                                                     */4 b  i- y- ?% F' e9 S/ M5 _
/*---------------------------------------------------------------------------------------------------------*/6 z: _5 t( S# L5 `' m
void VisualScopeAngleOutput()+ A# m  ]1 U& V* w, |3 a3 Y/ X
{0 Q- X* N8 o% {1 ~1 H
    int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;' N; f) U& }$ R
    uint16_t crcValue;- E9 M6 K' ^( O, b/ a
   
) a/ O' H9 k! X& B    AngleValue_Accel = ceil(Angle_accel * 10 -0.5);
) l3 Y/ {) r* X3 Y# m) Z$ R    AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);0 V  ~2 i: ?8 ]" Z- J1 Y
    AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);! c7 Q2 O) |) \( Y2 T
    " u0 y# p! C* W6 F- |7 Q& \
    outAngleData[0] = AngleValue_Accel & 0xFF;
4 ]4 O/ W7 x/ a; R1 S1 L$ P    outAngleData[1] = AngleValue_Accel >> 8;
  ~  k. i' R/ m0 B+ l; {    outAngleData[2] = AngleValue_Gyro & 0xFF;" l$ L* c& L0 a
    outAngleData[3] = AngleValue_Gyro >> 8;- d/ f$ B5 \  z, ]5 I5 l) `
    outAngleData[4] = AngleValue_Comp & 0xFF;
9 N2 w% M2 X  z    outAngleData[5] = AngleValue_Comp >> 8;* c- T  E9 Z5 t2 O( p9 S4 K/ @) a
    //计算CRC
( R! i, u' I3 R1 ~* ]% N2 |1 t    crcValue =  CRC_CHECK(outAngleData,8);) ~* \+ S4 Y* R0 L
    outAngleData[8] = crcValue & 0xFF;- m4 i, F( j  M" \
    outAngleData[9] = crcValue >> 8;
) [: K$ {6 U$ E6 |6 k    //发送至上位机! S, z9 f. |( y' M( q$ n! ?7 c9 G
    HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));
4 }5 o9 w6 J# i0 s  L}! I. }( B" D( N( o3 f2 _% n
/* USER CODE END 0 */2 n  L9 ]7 o7 a' x9 Z

/ K: B; o" M  v  z7 k1 ]3 V9 L/* Private function prototypes -----------------------------------------------*/- L! U$ @5 i8 x# J# y# u9 h
void SystemClock_Config(void);. j% u, U  d1 p1 x3 Q! n

# D0 G2 K; A# d7 }! b2 v5 S5 P0 w4 M# U3 d
硬件连接图:
2 \& D. y1 u  I. P/ V/ h 1.jpg
" X- @4 q0 k/ `0 g% a) E2 z波形图:
# C0 |' I# ]; D 2.jpg
  g$ w- W( F. o! B& a最后加一个视频:+ c' Q' Z" T2 }( a9 `$ S
STM32L053 演示4 G$ f0 A9 x3 M' Z) N0 \
1 收藏 17 评论75 发布时间:2015-1-6 13:21

举报

75个回答
党国特派员 回答时间:2015-1-6 13:22:04
I2C.C
( c( |. k: J, H; T#include "i2c.h"& r7 C% m$ [/ J8 ]+ Y
; h4 m3 {( l  G( t  w- \7 G
#include "gpio.h"
  L  Q% ^& f! j5 O8 l. r
; w0 x6 r( {- F: ]+ J0 Z3 N7 L1 P/* USER CODE BEGIN 0 */
0 O, B3 a% d9 s7 X! U
( Y! l6 P* b: ]& x" ]1 ~/* USER CODE END 0 */+ p8 \: w: @6 N" [, o& X

" P5 ?* r# S& i% s! @I2C_HandleTypeDef hi2cx;2 r$ Z# u# y- U( i4 l2 n
2 t7 n3 |4 |* I" L
/* I2C1 init function */. i! c) g% J" J% V9 e6 g
void MX_I2C1_Init(void): W& v4 |, P! [: C9 }+ _# b* P3 a
{
8 G/ o, L8 K3 C1 M3 ^$ l0 m6 V7 `; y% k/ u( m
  hi2cx.Instance = I2C1;
; I# e5 _+ I% ~2 ]  hi2cx.Init.Timing = 0x20D22930;
, g- N3 X, ~2 |5 ?& O4 h  hi2cx.Init.OwnAddress1 = 0;/ X9 R3 `$ K2 C$ m
  hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
' `3 M& D( Z( s2 {' h; n1 K' Y! t  hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
7 q+ B. K: f0 ]& @  hi2cx.Init.OwnAddress2 = 0;
& X) v5 E" w: T: g7 {  hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
3 k/ a5 a% m( ~+ o7 Z5 b  hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;: z* v$ h0 J- F- J/ f% U5 e& _  {
  hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
! B: e* {4 T5 @; A  _6 q  HAL_I2C_Init(&hi2cx);
: n8 Y  X; P/ p/ e: e' g' X5 Y$ ]# ]6 X; i  o* G0 V1 i; L/ {* x
    /**Configure Analogue filter
% g8 Z5 E4 N0 H' z$ L; P1 M7 L! t    */
0 b+ H8 k1 {8 j: N! ~% v  s  HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
/ F+ B  D9 I1 i: d5 ?: U. v3 {) Z9 @0 f  j8 @( v& a
}$ b; K. e, Y; O% V/ ?5 {; k. }* O

0 Q3 }- k' r& p% f: m9 a/ `void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
) t5 j6 p& N5 i) S* I& a{- \2 M- T! f( M7 Z6 W3 Q
+ {. [) h. |7 @9 |/ A) E4 u
  GPIO_InitTypeDef GPIO_InitStruct;
' ]$ F( t  m/ v4 Z! L- e3 K  if(hi2c->Instance==I2C1)! {. n6 Q/ }# k' f! Z3 ?! {2 v; f. Y1 R
  {3 }& m7 p% H' v! U4 r
    /* Peripheral clock enable */
5 N& r/ ^* H. U8 u/ K/ _! W    __I2C1_CLK_ENABLE();4 B( n' r1 a3 t+ H: {
  
9 c+ N  k6 P) E1 [' ^* |! ~1 U    /**I2C1 GPIO Configuration   : u5 y) f& c# i8 f; f  n' \
    PB6     ------> I2C1_SCL
$ m0 X+ o0 j8 |    PB7     ------> I2C1_SDA
; F+ Q6 [+ g% J0 w    */
( ~/ ^% e( |3 v0 r  Y. v    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;7 e4 _. F2 S3 `
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
3 t: g1 D3 r- c  M6 L# z9 U    GPIO_InitStruct.Pull = GPIO_NOPULL;3 d8 n7 D) V( Q& f& u5 c+ x, o5 r6 ^6 j
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
2 l: B! r* R' p! j: O$ _    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
. U3 p3 k5 S$ n, P5 G    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);7 v. h; _$ \) u/ s! b/ K

. O3 W/ u: g# k) ]  }
1 Z! u; L; N# [. R. Q}
# g, Y. l3 g6 T/ l3 k" y6 `" j7 b2 E, M: d
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)/ f7 l& s! l8 A8 L9 q
{1 J$ Z1 U$ d7 O
4 F! D9 y# J; e8 t3 D$ B, I
  if(hi2c->Instance==I2C1)
% P& X! j5 J! }8 l% [7 B- Q3 R  {
$ E# V& f  C) j; q6 s    /* Peripheral clock disable */
/ R0 B, B) w2 B: S. K' v; y" L    __I2C1_CLK_DISABLE();8 W) \. e! j0 E, z( j0 p0 j9 M
  
$ V+ e) P5 |4 w  W# w    /**I2C1 GPIO Configuration   ; V  m  C1 J- ^- ~8 I1 Z/ }; h
    PB6     ------> I2C1_SCL' \  x6 D6 @0 j7 ]1 j
    PB7     ------> I2C1_SDA
  c7 L7 t. v& ]  U6 D' `/ r    */
5 Y4 I/ v0 z4 Z: u% i    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);& `7 `+ a! n1 \( d* O* \
$ k. `/ Z; v9 O% S: |, K
  }% w3 Q) v5 K5 X7 u& V1 m
}
9 G% X  P+ Q7 O------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------( M/ a( l5 s6 L2 S
usart.c9 {( h, ?8 K/ [, g1 Z& `: W& L
#include "usart.h"! ?3 ~9 e# D; B! L
  l2 I/ }2 T# G" k6 p
#include "gpio.h", m6 i7 F( b  ]' C" ~# ]5 x# I6 V# R& x
#include "dma.h"- B3 b0 [7 G3 L: z  c% x) \
. r2 t3 y) ^' q( U4 {2 M
/* USER CODE BEGIN 0 */
8 l. ^- x- ]0 q# [& |1 m" B) k1 U( p. J: G; X2 T. s- w
/* USER CODE END 0 */; f; X4 O4 L- [7 P
1 j$ C+ r  z* Z
UART_HandleTypeDef huart2;
! i- T0 m! }& P" g0 _6 r9 @DMA_HandleTypeDef hdma_usart2_rx;
! O0 g' W( h' l; P1 @$ ZDMA_HandleTypeDef hdma_usart2_tx;) w) W* c" m4 |/ y$ L9 ~0 d, ~6 H* A

: ^5 L. t) f) E& o# f/* USART2 init function */- s3 g9 U, `. ]) b0 w4 E
7 A1 s3 Q+ B$ b1 B5 }  D
void MX_USART2_UART_Init(void). T+ u. Y9 X! T1 c
{" c: I- e. [, c, n6 J' `, ^" y

9 D4 ^5 Y& ~, u, `  huart2.Instance = USART2;& h# m$ {- h2 m; }6 ~  h
  huart2.Init.BaudRate = 9600;. P4 h3 y6 b4 e& h' W7 H( h7 W7 W4 |7 A
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
) K, Y% o: K/ ^/ a1 @1 s/ j/ Z  huart2.Init.StopBits = UART_STOPBITS_1;) F8 z: ]6 z6 l$ ~
  huart2.Init.Parity = UART_PARITY_NONE;
/ h5 N* Q9 B6 e5 ?3 `" f3 m1 h  huart2.Init.Mode = UART_MODE_TX_RX;9 u0 x  \& B- @6 }2 {
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
" C- c5 [/ z1 a( j3 n  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
/ H3 ]  \3 ~+ o: C7 H' w; D8 |  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;0 s# K. q9 {/ L6 q' n3 o
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;2 _& b+ s2 E, i% }
  HAL_UART_Init(&huart2);. ~  J+ L3 c8 d; B8 @; q

$ O$ @; t  m& n1 s}$ S) @2 B$ g# w& z7 @1 T6 n

/ ~& o# Z- d, R* O* ]# Hvoid HAL_UART_MspInit(UART_HandleTypeDef* huart)7 a* \/ D! j: J: `* k: q
{9 x/ s+ }* q4 T, F% @" C0 d4 m

( m3 I4 _% R& ?, V% N  GPIO_InitTypeDef GPIO_InitStruct;
8 E( ]1 i- j7 U4 C* L; l* ]  r  if(huart->Instance==USART2)
! W* _, d) n3 I7 h5 I  {
7 t% h/ v8 _2 n+ W, x( V& w- z    /* Peripheral clock enable */
) R/ s- z, @3 ?, W' M    __USART2_CLK_ENABLE();
9 d4 E4 h/ j/ M1 j, D' r; @  * @- H$ g+ Q2 z% }  @, N
    /**USART2 GPIO Configuration   ' U8 V- X# e4 a* ?
    PA2     ------> USART2_TX
3 }& z' w% ~0 F+ S* O( H% O4 g    PA3     ------> USART2_RX( [6 H8 o  I! p* u. e' G. e
    */
  K0 [6 }- e$ i/ G( J    GPIO_InitStruct.Pin = GPIO_PIN_2;* [' ?! Q; F1 R  H1 s
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
2 x. S$ x, R( K    GPIO_InitStruct.Pull = GPIO_NOPULL;
% E$ i, j7 Y  g0 n) G$ Y% k; D' e    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;) }& C) j) J, l
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
- s7 }4 w2 f3 o* d" A8 I: Y0 \    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);- h1 K( X( x6 {8 {! d7 Q
; Y! q' ~1 T1 u1 D) D4 @
    GPIO_InitStruct.Pin = GPIO_PIN_3;
9 o7 X4 p3 h  ~* ^' t, B    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
; L* i3 A8 r- B4 ^7 Y( I+ f/ A    GPIO_InitStruct.Pull = GPIO_NOPULL;
$ X6 a/ M( `* J    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
4 {% J3 }7 `0 W. H    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
7 v& T4 Z( l% V  @3 i    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
9 B1 e( f' M, t) x+ r2 e
( q: }/ Q/ o4 Q+ H0 ]    /* Peripheral DMA init*/
$ M- A$ S+ W8 n& F( `7 n  
9 N# Q/ Q- L, n    hdma_usart2_rx.Instance = DMA1_Channel5;
" Z2 f) a, B# h1 _    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;, ]% h+ t, e7 p
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
- u% T! R2 v" E" b% @9 ]# H5 s( h7 S1 {    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
2 I) v6 _  c2 M5 n    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;$ y& O0 K4 {9 \1 x0 n* Y( z' P5 y
    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
" _. w# G. b( m    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
8 {1 e0 A- ^; i% _, X, ^1 b    hdma_usart2_rx.Init.Mode = DMA_NORMAL;
/ M9 A; o! X2 p: `& q    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
3 z0 j" u6 r5 [0 a2 m    HAL_DMA_Init(&hdma_usart2_rx);
6 e; a' X. H& h6 J" C+ ?; e& b6 T9 O" Y) l5 A' _$ x
    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
0 R. f9 c7 v# r- h4 b: r! ?
1 [. O5 ], t; B% |! q    hdma_usart2_tx.Instance = DMA1_Channel4;
) {5 |: E9 N* G* E+ z4 L    hdma_usart2_tx.Init.Request = DMA_REQUEST_4;
" a& A; ?0 |) _# {* P& ^    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;5 R3 V' f+ U: M, _5 ]; N
    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;" g+ i& j/ a9 ?) a3 s6 ]: s
    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
7 J) j/ ~7 @! c/ e3 Z    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;! l0 U4 `8 i3 ]5 s) U% w1 s* t9 H- W
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
# M, X1 _, U6 s" B( q* G4 P2 {' u    hdma_usart2_tx.Init.Mode = DMA_NORMAL;! `- V* A8 q0 B- R5 }
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;' m9 K) Q7 G' E$ q
    HAL_DMA_Init(&hdma_usart2_tx);$ Z6 P/ ?/ x& W. b9 Y# B
7 |" I5 b% U- W, u
    __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);$ d8 {! s/ e1 ^6 |$ P  x# Z

% w. |3 c! F  v  I* i  }
8 D7 s( e; J" q}. b, e) q% |% ]7 u
4 k2 r' A/ m8 h! s: N
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
! G" P: H+ P8 M, P{' i- P* h4 A0 f9 L2 u* g* }' f

. b3 u8 G7 e1 }  if(huart->Instance==USART2): {- w% @. C# L
  {/ s' q' \5 e9 ?7 A7 k, F8 i
    /* Peripheral clock disable */
1 w! Q5 `, k4 k# W    __USART2_CLK_DISABLE();
$ ^0 i0 {2 e% H  2 N& {$ x, Y" w+ C* _" q
    /**USART2 GPIO Configuration   
. ?. y" _$ d( f+ m    PA2     ------> USART2_TX' s& f+ D/ W# q6 P" r
    PA3     ------> USART2_RX8 c' U- K6 O' Z, z" q& O5 N4 L
    */8 s1 ^, x( d0 u. r
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
. [/ d; S3 d3 M. M$ L( i5 r8 T" q
4 n0 K7 F( i* v    /* Peripheral DMA DeInit*/
/ r, E1 ^% K% M1 X+ o7 a    HAL_DMA_DeInit(huart->hdmarx);
4 R0 `9 Q$ ?0 a8 ]    HAL_DMA_DeInit(huart->hdmatx);
6 b/ j! ~' h1 h1 ^  }
+ Y$ u5 m* }- Q9 r1 K% }! U}
; g. w/ N4 C! U$ T+ O  p------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------( J. Z4 j5 I$ N' m" S1 Y
mpu6050.c
8 c1 T* ^4 d0 H" G( w) ^#include "stm32l0xx_hal.h": G4 w% l% w' B  O; H0 s$ x
#include "MPU6050.h"
* y1 v; w1 Y% B  k8 J, z( t& c
8 \4 H9 A. T+ n4 T: a1 v( O//各坐标轴上静止偏差(重力,角速度)# D+ f: K3 H2 i
int16_t offsetAccelX = -195;
1 k2 g, d! b; M( l9 o' Sint16_t offsetAccelY = 560;
# S7 ~' L* y* B5 }8 ]int16_t offsetAccelZ = -169;* F6 \7 m4 G( V* N5 M# i
7 J, k1 k0 Q9 |' B8 [
int16_t offsetGyroX = 12;
& V/ a( s. ~0 lint16_t offsetGyroY = 33;
- X/ ^( Z9 Y" c9 |8 ?8 C% Iint16_t offsetGyroZ = 4;8 C0 O- }4 [3 |
/ M0 c$ E7 c- h7 A
extern I2C_HandleTypeDef hi2cx;) \, V4 h; y# Q1 ?! R" x. z; C
3 m5 q8 x1 w. ~& g9 z
//**************************************4 r1 d# p+ _7 J% \
//向I2C设备写入一个字节数据, K' |  \6 J. [2 U! D
//**************************************
# `. [2 C7 x8 Rvoid Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
( }1 u  F+ r$ X. w5 @{
- i9 x  [4 o7 s& o& M! p6 C    uint8_t rxData[2] = {REG_Address,REG_data};  g: m3 K* D8 W+ H2 K
    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK); q% O$ S* I% D3 a7 I0 p4 D  G
    {
* g5 [$ ~5 ~3 [3 [* N        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)* Q4 J: q: N$ i$ n8 @. W4 J. h' N
        {}, j8 L4 {" M, b2 G5 N: I
    }
; u" e+ q, M* \8 i  a- P, v' o! |}
* G: p# ~: \( F0 o: i& L' w//**************************************  d( m; H. e  Q* F- h, A* E$ t
//从I2C设备读取一个字节数据
" I# Q4 m9 H/ @6 k7 L2 i//**************************************4 d# ]% o+ O  `. _5 {
uint8_t Single_ReadI2C(uint8_t REG_Address)# x$ Z+ f  J' `: w# y$ z, d
{
& C" c/ q5 C6 I* Y    uint8_t REG_data;
. `7 U, h' X1 _; t    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)1 l- [( C! Y7 [; |) E0 I5 J' u
    {
, }7 b/ L7 C$ M8 J% s) t, s" i1 @        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)* A6 S& u8 ~/ h) ^5 w- @
        {}( m- m3 v" m; ]% x4 e. K- s
    }
9 ~: I1 k- d8 t7 H* p) n  s, s9 o$ t   
: z) T6 @- Q; ?1 g    if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)
, V- a; v. N( B3 u" X" `+ K2 s. I    {
) T2 w! }  w3 o        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
$ H  [+ p* p: n" [, b( G- I0 g        {}1 o# ?4 b7 Y1 u
    }; W: j& o% O0 I# \
    return REG_data;1 ?( b2 M% D8 D* D8 V7 p
}9 M/ p7 c8 _9 ]) f8 T/ D3 a( _3 Z
//**************************************8 e" g/ K4 A4 W% o
//初始化MPU6050; Q. Z& P. _4 D% k, i$ X
//**************************************/ p" I+ x% P. G. t: F
void InitMPU6050()2 f8 I$ q7 k* f' G- _% U
{. H1 O& ^4 [5 X/ i8 p
    Single_WriteI2C(PWR_MGMT_1, 0x00);    //解除休眠状态3 U% z* D. ^4 q% o7 e

5 K, F# ]" l1 t: t    Single_WriteI2C(SMPLRT_DIV, 0x07);" Y" Y9 p; O& p7 d) ]; i0 O# x) r

1 S- R& P. [) C6 _    Single_WriteI2C(CONFIG, 0x06);
6 v* Q6 F% |5 H" o2 J, i5 h0 H5 J0 X5 V8 @0 h# o2 G1 o
    Single_WriteI2C(GYRO_CONFIG, 0x18);
& R' Y$ [* j; {% x) ?/ K. g1 Z( n& `, Y1 {6 a
    Single_WriteI2C(ACCEL_CONFIG, 0x01);6 N! ]. e* ~! o5 N* ^
}
# b! R0 V% c" @; F  U//**************************************3 k1 b. Q. ~& G( M
//合成数据
- x3 L8 [- N3 ?7 \//**************************************
  z* Y& _. l6 m4 m- lint16_t GetMPUOutValue(uint8_t REG_Address)6 o7 v; Z8 Q. n: G. _
{( F. x& V; }$ x# G1 p5 _- M
    int16_t result;6 K' }- K' B: Y9 K' a1 P
    uint8_t H,L;
/ u% T& ~' N- H1 s7 `    H=Single_ReadI2C(REG_Address);3 H8 C( q: e- q- \* T
    L=Single_ReadI2C(REG_Address+1);+ c% C( r6 L; m2 V8 X9 t( i- `
    result = (H<<8)+L;# Y; T2 {. r3 o4 f5 v
    return result;   //合成数据* A. w$ [* D. j6 H" A( [- x
}
* i! s2 M$ _6 z% e. w
  d; ]7 _8 U2 K0 n, t: O//**************************************5 n, }# Q- p2 c2 f; Q
//取某一轴上的加速度数据% ?! h1 d8 ]8 E" b: S, }
//**************************************
' R5 [+ u% }4 o4 E) N( vint16_t GetAccelValue(char axis)5 y( C! `" E* {/ r  F
{/ N% X' T$ ], K) Y7 U1 ]6 o7 S
    int16_t result = 0;, ^, D' g: j: k3 P
    switch(axis)$ @( ?$ c7 X1 a% G
    {- C$ k0 w* N. f* t1 l
        case 'x':- R6 u' B2 b, b5 r4 e6 w
        case 'X':$ Y. q  I+ n/ Y, S' v% p+ X6 X
        {
6 l5 r0 }! U/ C            result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;
+ r2 b3 C  |: a4 A0 T        }+ N2 I3 H' R" G) R
        break;
6 ~; V& {8 o8 [1 _1 H+ z        case 'y':
9 W- U* e- [: h5 ]        case 'Y':
. K' r3 @$ z, {. Y        {
, r- V. A* b7 v2 i+ ?            result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;
+ ]& m( M- c9 h" \        }
$ L- y5 Q7 Y4 R1 h; J3 q, u        break;4 ^+ O* W# f  Q* i& q% T
        case 'z':3 ~' k/ [/ ?- _" z4 ]
        case 'Z':# Z- ?# r" c: }$ \5 n/ [) g% h
        {
8 w  \7 \6 q4 m& ~3 ?- K            result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;
# C# g7 X2 t( N' @  v        }0 E4 K. B/ @3 i5 h( V
        break;
. E4 H! S3 x6 y! R2 ?! q    }
$ `7 t& [6 ]% {# w    return result;
3 v* j" S; k' `& K3 V4 L: W5 U}
2 S' a& I$ X: Y0 j9 K( l7 U2 R9 ~2 d" I. ^3 n, k3 U
//**************************************
8 @. \  T. e, \2 H, u0 o" _% ^//取某一轴上的角速度数据; O( s" M% v9 r% W3 O" D1 i
//**************************************
, V  ~$ r' h+ g! H" L, h: N! vint16_t GetGyroValue(char axis)' j- r6 j5 w3 n
{) E/ w+ w5 x3 a7 f; R
    int16_t result = 0;
, R, C8 a4 Y' e% f6 v5 c    switch(axis)
- W$ f3 I" E3 p3 a, G9 z    {& r# `' H% S6 r' W8 b
        case 'x':. E! _. S- D/ R2 y  j
        case 'X':
1 U+ d& i/ N+ l        {" h2 _( K. {* r" f, y, J
            result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;' R8 R6 J( x9 l' L
        }+ \. m1 q2 k, h. e3 v
        break;
* h( e- V( ~9 y! B5 }! p        case 'y':: H" a5 U  S- N) E. A
        case 'Y':( s' }+ V) e# r: @
        {
2 l3 [$ K; j/ H# F* c$ B            result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;3 X( N  u+ X1 }% w$ J; W( [
        }
: q, p8 j8 o6 Y8 m$ B2 N6 \, b        break;! S& p8 r3 a9 d2 }9 x- D+ J
        case 'z':
' z1 b8 r9 j* l# x7 Q9 E  L; y" |# O8 V( D  Y        case 'Z':
  t3 t- y3 o' D+ S, X        {
2 r4 T- ?7 E4 |* B9 K2 {; O            result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
% S+ V5 q# u9 Y6 g3 u        }% E( A5 ]& _7 i" d. H4 i0 u
        break;$ w5 a5 @( @" z: g
    }3 g4 C4 l1 b3 H, c0 |
    return result;2 E5 O1 k! Q( O( ~/ J
}

评分

参与人数 1ST金币 +30 收起 理由
zero99 + 30

查看全部评分

党国特派员 回答时间:2015-1-6 13:21:49
int main(void)  ~" k* w2 N5 H  T; P9 P$ ?
{
- V, Q4 k3 K. f3 o/ n# g6 ]8 M/ P! f
1 \8 N* b5 r: F" Y0 i  /* USER CODE BEGIN 1 */& S& D9 m/ Q* X
2 B3 F7 ?2 \6 |
  /* USER CODE END 1 */# a" S) i+ |: N4 g1 T4 `

7 }1 V' c4 u  E0 j# K  /* MCU Configuration----------------------------------------------------------*/1 P: E  t3 I: `! U2 `: G! C
' m0 l* r$ F% A0 y& V
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */+ b! ?6 e  c) ~. ~2 c* o' S  p! K  {& a
  HAL_Init();; |# s# P8 Y( @" G1 B
! F- H6 g  s! f0 w# ?* a# o
  /* Configure the system clock */
0 z4 W- a( \. ?! `. n/ F. ~- W) s  SystemClock_Config();
/ r' Z# W$ z' q( U9 H5 |
' q- G7 m7 m$ V6 s9 \9 Q$ P  /* System interrupt init*/
6 S6 w5 g/ }1 S7 Z  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
% }" C3 N  ], z4 c' U
  J! E. h! J: v+ n  /* Initialize all configured peripherals */7 w" B$ H' q' o+ z, k' y
  MX_GPIO_Init();9 H( N/ y; w) D
  MX_DMA_Init();% V1 q: Y! x* b! A% M
    MX_I2C1_Init();
  ]" K4 X5 D  P9 t0 S2 `    MX_TIM2_Init();* n; y- W1 r- y1 X8 y7 ?+ V6 f
  MX_USART2_UART_Init();
) |3 K9 G" K3 W( b& K) w$ b    InitMPU6050();* F0 Q- T& v, I9 ]

+ w1 s5 z. u8 {0 i  /* USER CODE BEGIN 2 */+ F5 w7 R* |$ x* d1 @
    HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);2 v/ J+ I' A% j# [4 J6 w: H0 @
    HAL_TIM_Base_Start_IT(&htim2);
4 S+ ~# T+ ^3 N6 g: c. T  /* USER CODE END 2 */% T* t4 F4 T7 G/ q  t

3 z; p% \, X+ v4 w  /* USER CODE BEGIN 3 */' W3 l# v( O& R/ a) j5 g- o* A
  /* Infinite loop */
  n% {# @% ?2 J3 C: x  while (1)
9 s. b" I# r& A% E, w, \1 |  {
4 L' p7 I& t2 w. ?' j7 G        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
! R( J' ~2 g- _/ p* ~# E6 J9 i        VisualScopeAngleOutput();
0 H  d% q+ V0 S. J1 V" C0 l        HAL_Delay(100);
: O# }- h6 m! {  }6 R- w2 P( l6 c3 i# b
  /* USER CODE END 3 */
. |* B3 j3 |# i% v2 p7 E) X1 u* K& V/ }' q
}2 `4 q$ S2 i8 R8 s6 O" L# {6 C

0 v9 B3 K) O5 X6 c5 @  T; o/** System Clock Configuration
3 m. }, k9 C8 D- p*/
# b7 @- ]$ `$ `) A, ~void SystemClock_Config(void)
  F9 n8 R7 g4 D# L( m{
' v9 ^' q9 k( R( o% h, W
' e2 C7 ~' x1 n) ]) x; L+ Z# T. L  RCC_ClkInitTypeDef RCC_ClkInitStruct;
7 q: ?- N# m, F/ {  e3 A  RCC_PeriphCLKInitTypeDef PeriphClkInit;/ E: O4 }+ {1 V
  RCC_OscInitTypeDef RCC_OscInitStruct;  H0 H& L0 }9 A. s+ M+ W0 P) \
1 M/ W$ M: L0 V# e  Z
  __PWR_CLK_ENABLE();
" l; ~  A( f( J- m& n8 M& U( |& ]: r
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/ b4 T8 q, B5 e' `& A2 u, o) `
$ y" y* A9 G5 n0 b, f5 h  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
! S" F/ M  P# p/ z, _! [  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
% ]6 p) L# k  `6 s$ H$ o  RCC_OscInitStruct.HSICalibrationValue = 16;
; z& F: q- n! z# c) }  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;; ?4 }) n/ S0 n: R
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
2 l% W) v! c, e1 ~, Y1 a  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
& J% S, W5 {: |; W6 N8 w% b  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
: U, v$ \. N; l2 K( C- ]  HAL_RCC_OscConfig(&RCC_OscInitStruct);1 Q1 w- J0 f9 [% H" I/ U

+ d2 H. a+ z3 L2 S5 z6 _  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
0 i+ b9 a, L* ]. @) l; s4 f9 Y  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
& k; u# K. q' s& _7 l3 Y  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
4 w9 G* h# _# l$ }; M  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
) h) V. l, Y- M4 r6 a+ a  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
1 D# h2 f/ W, l# h$ Y+ p/ R( `9 C' Q  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);  Q0 e; S' w2 P
: w$ d" s0 V* J6 u! x
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;- y, B5 c/ m8 a% D% e" o& j
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;. E0 s9 z& x: b6 F2 \% l1 c+ }
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);' a, n' r2 A. m0 |3 h
3 F  g! A9 o& \) T9 Z
  __SYSCFG_CLK_ENABLE();5 W  p1 \( ~7 q+ @

6 Z( ^+ {% |# n1 {, s7 [: Z' E}+ z" z: R0 {7 q% K8 [
& [  J6 h: u& f, e
/* USER CODE BEGIN 4 */3 S+ J0 s, }' n7 B8 }& ]
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
0 i' I  J( V, C/ l% Y4 A{# M1 T$ }: n  k3 ^0 ^" s- Q
    if(huart->Instance == USART2)3 x$ A, A/ V7 s! O
    {! X' f- l1 P; {) l2 E9 S5 J+ ~
        memcpy(txBuffer,rxBuffer,RXSIZE);
) z" q6 z0 b1 I  _+ E- G# K        HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
, T% e& w) L) M" |1 f. Z  U        HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
4 @: H/ E$ P, O; f! @    }
0 E" h* U8 {1 [0 S( X}. A) ~& x! n( V. j. d! x1 w

% K* S9 L; h: c0 ?/ d. Nvoid HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)( R! c" `( C+ W  U5 ~
{
" A& m# G# Y0 Y) g   
( a6 b5 @. }8 O' j}
) a1 ^* D: n7 ?# d( A" S; v* O* A6 P% M4 ?4 i# p
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)4 J% D- z$ o+ P/ b
{% w4 W" U& Y$ _# ]9 c# N
    int32_t GyroValue;3 v# ^4 P) q. |% \. H( _  b
   
( {2 W* `8 Z% W4 r9 q+ m    Calc_AngleAccel();
+ f- `5 {3 W* G. y8 p8 X. _7 `+ H    GyroValue = Calc_AngleGyro();
- b, s4 u  ?0 O' u/ D    ComplementFilter(GyroValue);
: {5 v  w1 n; [}
foxglove 回答时间:2015-2-13 15:04:47
这么好的帖子没人顶,我来了
stary666 回答时间:2015-2-13 15:08:45
星辰一方 回答时间:2015-2-16 19:00:05
楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长度不匹配怎么办?谢谢!
党国特派员 回答时间:2015-2-17 09:20:41
星辰一方 发表于 2015-2-16 19:00( |# \* \  ~* q5 t$ q' D
楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...
( A* }! s/ @" k8 }" F
使用DMA方式,接收发送数据必须是个固定长度。
党国特派员 回答时间:2015-2-17 09:21:31
星辰一方 发表于 2015-2-16 19:00
& G5 x5 o$ B9 p; k) m楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...

3 p  W5 z6 |; J: \如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
我夏了夏天 回答时间:2015-2-17 15:04:30
6666666 闲了我也玩一下
123tango 回答时间:2015-2-17 17:53:00
我也去试试
feel-376797 回答时间:2015-2-17 19:07:13
谢谢分享
星辰一方 回答时间:2015-2-28 09:50:50
党国特派员 发表于 2015-2-17 09:21
+ M% R. c/ ?# t* X- |如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
& b$ L3 v7 l& y; f* ~
好的,多谢指点!
rogerkun 回答时间:2015-4-3 22:08:29
楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?
5 i$ T# X* Z% v. L! k请问应该注意什么地方
nocoyou 回答时间:2015-4-4 09:12:05
顶顶顶顶
党国特派员 回答时间:2015-4-4 21:33:35
rogerkun 发表于 2015-4-3 22:08
$ F0 u3 X% w7 |# D" l8 s4 }6 u3 l楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?% r' u, g' a6 m, ^2 n7 k  N
请问应该注意什么地 ...

, T0 d$ r/ q- s) s我使用是没有问题的呀。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版