请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
党国特派员 发布时间:2015-1-6 13:21
拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:, x; W, f  b- g6 p
-------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------9 W8 y3 ?/ c* u4 _( x2 S& J
main.c
; @( v, b+ c# C; X( I8 V) r% F' c7 t/ ~#include "stm32l0xx_hal.h"
% ?+ C7 _% G4 ]+ c- q#include "dma.h"3 @+ c4 ]  j0 f5 S/ L3 R' a
#include "i2c.h". ^6 D2 v( r9 ~. {' ^
#include "tim.h"/ H& P* a$ l: j, ^4 ~! ~% J* _. Y( ~
#include "usart.h"
4 f: B9 a8 w' u/ q#include "gpio.h"
, E9 R: M0 ]9 N( @5 E#include "mpu6050.h"
9 C! X' R- I( R#include "visualscope.h"
4 n3 X+ A1 k! s* G
/ q( Y* L3 E* M3 q1 p0 |, \4 X6 M#include <string.h>
4 {$ E6 h$ z+ v! I! h. C#include <math.h>
9 t; |4 n6 L- k( q' ^# c
4 K. z6 O( P; V) o$ D) H8 E; ]/* Private variables ---------------------------------------------------------*/2 K9 W; G: ?2 c4 j7 G$ Z
#define RXSIZE 8
( A# X, i6 R4 k/ A6 M#define TXSIZE 8. S4 u/ ~% A1 R2 i3 c) z
uint8_t rxBuffer[RXSIZE];
# H; G% a+ e* X" N1 X) i' n% Zuint8_t txBuffer[TXSIZE];; [3 x5 A' V) ]* H% v; c2 v0 u
: Y7 u; b/ d7 G( V* ?, L
float Angle_accel = 0;% n, N7 ?; p; L6 \# x* h8 R
float Angle_gyro = 0;
! H( A9 C- e% Y9 ^+ e$ kfloat Angle_comp = 0;9 h# w" W( N0 n& m7 y) M
uint8_t outAngleData[10];
' f* j3 A! L% V0 k, w$ @3 q/* USER CODE BEGIN 0 */
: @! T. T( y, A* t& ~! M5 v* r$ r# d- Z! |; l  T' c, y- h- L/ f: D
/*---------------------------------------------------------------------------------------------------------*/! @! I$ T6 ]( A: M' N' {1 s7 r
/*  重力加速度算出的角度                                                                                       */
$ g+ l8 n- H, S7 P( I, d6 t0 p& Y/*---------------------------------------------------------------------------------------------------------*/( q: J1 Y1 K* Y
int32_t Calc_AngleAccel()
9 f+ M# w2 u5 ~{8 G0 S# w0 ~* b8 x* L- w
    int32_t value = 0;& p- g, b7 D  H  I' b& ~) m" q
    * p* {4 d6 {# q1 g4 U' ]8 w
    value = GetAccelValue('x');4 M9 S5 B5 n% M3 g7 w9 W6 ?
    if(value > 16384)2 a* d% D  z* F
        Angle_accel = -(asin(1) * 180 / 3.1415296);, e1 L& g1 {/ E4 u9 B* ~6 k
    else
. k: |7 L2 U- ^        Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);% y  s1 h# H/ d: I# D
   
5 F$ b" k4 ~% u7 Q    return value;9 l6 E- j' G( t6 \; ]0 d
}
6 t; q6 ?' |7 Z# Y; ]9 w
6 _8 N  v" ~2 ], C1 F4 @/*---------------------------------------------------------------------------------------------------------*/0 }* k1 y3 G' E& j7 H
/*   角速度算出来的角度(积分)                                                                                     *// z7 h: r$ O$ r! _3 |* M$ ^; Q% M
/*---------------------------------------------------------------------------------------------------------*/
5 z, d3 ~6 T6 C+ c- }/ y& t: ?int32_t Calc_AngleGyro()2 H+ ^. K5 V5 c! B
{* m: `/ t- Q4 r( x9 ~
    int32_t value = 0;
5 {0 U* ^- l, E! k0 b) P$ K; S+ O; e
    value = GetGyroValue('y');/ H  d/ S/ W; @: |
    Angle_gyro += (value / 16.384 * 0.01);  o/ I$ J& J/ [! w9 F
   
7 [3 G2 ?0 _8 d2 S0 X    return value;) y8 }5 w8 s* ~- C) @2 z. D& n
}6 S) w/ p7 y& A$ f! F) N: y

) W# P- l! B& m: g/*---------------------------------------------------------------------------------------------------------*/
2 F* L& r$ P% N. z% T/*   互补滤波求角度                                                                                     */
! c  ?8 I3 k4 s( h0 _7 f8 t/*---------------------------------------------------------------------------------------------------------*/
2 S" A/ K4 Z+ v6 O4 h0 afloat ComplementFilter(int32_t simpleGyro)* I6 C  C  l' b
{  Z$ q0 ?- e: A5 {/ y# v0 }, G' B3 T
    Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel;$ t' j- Z) a5 M
   
) ~5 v) Y# T3 G2 G" a    return Angle_comp;
1 t% J+ ]4 G; s" m2 ^, v}! v& M9 r- j* }- S3 l9 ?+ h

. R$ `5 S3 b- A1 P5 c" y+ H) K/ k/*---------------------------------------------------------------------------------------------------------*/4 R/ F1 h2 F* v" }  {; D
/*   输出角度至上位机                                                                                     */7 \9 j3 c7 Y4 F  D5 X. m7 P" O7 K8 ?7 H$ l
/*---------------------------------------------------------------------------------------------------------*/
, @( u  g& A5 t# s" _( O1 hvoid VisualScopeAngleOutput()
6 @4 l7 y7 n  [% k{
: I4 Q- I- B# \5 R  I    int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;
; b! n" [7 t5 q# Q- L1 R2 @    uint16_t crcValue;
3 m$ y8 b, D7 ]# I   
$ I  G( Y$ ?& R; \( s) r    AngleValue_Accel = ceil(Angle_accel * 10 -0.5);
) r, n' }2 B+ w4 {    AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);
' e+ i% K, P7 |2 u/ d1 n4 y/ o( F; Z    AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);
6 y% S; |, l! Y! {2 y    4 M) N  n6 U* \4 P! ~7 |
    outAngleData[0] = AngleValue_Accel & 0xFF;
  O$ d$ c  @; @+ z  j    outAngleData[1] = AngleValue_Accel >> 8;7 d& K6 M( [4 H! o! c7 h  a
    outAngleData[2] = AngleValue_Gyro & 0xFF;
6 }( e" i& Z- c3 A    outAngleData[3] = AngleValue_Gyro >> 8;
: Q& C- X: p* e+ X    outAngleData[4] = AngleValue_Comp & 0xFF;: {# M% q: V1 d- ]& _
    outAngleData[5] = AngleValue_Comp >> 8;
" U- r  N) y, a# o' s    //计算CRC
! |0 K3 v4 r- z3 ]1 e% C    crcValue =  CRC_CHECK(outAngleData,8);
' \8 z/ d* t4 i4 U/ C0 j    outAngleData[8] = crcValue & 0xFF;
) q: F6 J: U& V+ \; O    outAngleData[9] = crcValue >> 8;0 W, R$ f; m- `1 C; e' s
    //发送至上位机
; {$ r0 O+ H4 `! [0 o- c) y    HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));! {; w/ l, K+ J. G# Z* n
}
% v" }! h: C( s/* USER CODE END 0 */
/ _/ ^  F9 [6 {5 M( w/ z6 Y2 ^- [8 m& M# |8 x1 @  X
/* Private function prototypes -----------------------------------------------*/
3 D8 i$ U2 y! o/ B; cvoid SystemClock_Config(void);- a$ e. a9 z- e/ `! @
- q% I' B' a' P5 v" O* d

3 j& C/ s9 ^; j, \+ K: u! n" X# H硬件连接图:3 x) p. @; t( j9 W
1.jpg
" M& j- ~) f/ Z/ p, D  Z' s5 @波形图:
( s( E9 N. }6 O2 \ 2.jpg
6 E4 D9 O8 w6 F4 \) L最后加一个视频:5 Q7 w8 u! m& f* t. [: D* H
STM32L053 演示
2 q5 ?  F, c5 s+ W1 [
1 收藏 17 评论75 发布时间:2015-1-6 13:21

举报

75个回答
党国特派员 回答时间:2015-1-6 13:22:04
I2C.C' ^5 N7 k0 e: j, l# T# y* Z) k
#include "i2c.h"
% w( N4 I& @7 S3 g" m0 A2 m/ Q
" D: U" M+ g5 m4 {2 l0 K- Q5 Y#include "gpio.h"$ F6 h0 d" w9 h' M
* J1 H" q; {; E' c0 l/ |
/* USER CODE BEGIN 0 */. y' i' z! J; ]/ t

" w) W1 a/ C4 J, \/* USER CODE END 0 */! k+ k7 ~5 W" |2 w) ~
4 d) W6 r% F$ m% [* U
I2C_HandleTypeDef hi2cx;- }, c$ z# o3 r6 T% S2 x
+ w$ B9 ]' o  _# x
/* I2C1 init function */
7 w5 B* t9 |% C& X; X0 i" |% q6 tvoid MX_I2C1_Init(void); w" K! J+ |5 E& l1 h7 u# ]
{
7 d. x5 F2 R, I5 m' ^& l- ?+ _3 g2 v5 P( j% X9 s$ j: ]- e
  hi2cx.Instance = I2C1;
9 Q2 O) N; T- R5 m8 ]& C% ^  hi2cx.Init.Timing = 0x20D22930;% L) v0 Z; `6 Y: x5 j) M. A
  hi2cx.Init.OwnAddress1 = 0;, L" l2 M: r! B2 L( [7 K! Y9 X
  hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;  m. h; n6 |% _2 I; f
  hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;$ P6 l( V5 d0 m, D- D  g
  hi2cx.Init.OwnAddress2 = 0;
7 v0 p+ w4 z  c# y0 x$ p7 S  hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;- B& U. l" [( _( ~" L$ N
  hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;0 J4 |$ C/ _$ k8 h
  hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;% C/ X. o# R* S! Y
  HAL_I2C_Init(&hi2cx);
& Y* O7 V) F( ^6 X, f
6 e. T" ^: T1 @9 f9 y    /**Configure Analogue filter
5 o6 _" K& {, Y7 T    */' [8 F# q: s0 y- L% W: \4 k# E
  HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
+ r5 b3 l$ z" e! ^$ H
; {/ ~) b6 Q7 G}
/ ?! _5 U% k6 L8 O% N9 w7 U+ _. P  S9 V/ t. u4 G) l
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)/ y2 i, d! P$ r/ Z, s
{: q8 l( q1 o" R* k0 c

0 a! x  D, v( M- M1 O# X  GPIO_InitTypeDef GPIO_InitStruct;3 Y- Q7 C) u1 \" o6 n% F5 s
  if(hi2c->Instance==I2C1); b" _* d0 J) w
  {
: I' S6 t4 X% U5 M    /* Peripheral clock enable */
+ w/ U0 \* B$ @" p    __I2C1_CLK_ENABLE();
2 W' h; N$ \3 d" z3 b  
) B9 I% j5 \  [) m6 }3 p    /**I2C1 GPIO Configuration   7 P8 q. ], k% B0 i7 i; p
    PB6     ------> I2C1_SCL' o+ m1 c: _! r: H! W
    PB7     ------> I2C1_SDA. M$ f" x  N; @% ]& P
    */
; N8 }+ n) W; T    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
* }- A) `( {# m& s- X% x    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;/ b' `3 Q# q, i- u" C. i6 w
    GPIO_InitStruct.Pull = GPIO_NOPULL;
( q9 d5 _6 B1 O8 L$ i2 e    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
3 `( S$ W( A7 p& H% D, T    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;6 i$ J( e4 V5 V( M8 K+ S( L  \6 }
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
$ V" T% Q. V/ B3 M2 T* T) A- ?' F' G( J3 P( K. x
  }) i3 \- n. ^% c. I5 R: b; m% U7 L
}
1 W! L" ]4 c0 m; I; T! v0 m, M3 o, V5 D  T( T+ M" W& b  h% B2 x# A
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
6 R  B& S$ M) ^& J: F{8 z7 s9 O3 N3 K& _

# ^3 X$ K7 N! I( ?, A( i  if(hi2c->Instance==I2C1)  Y, \8 S" m& }# @0 \% ]2 K, D
  {  w$ P& L1 J1 T' h
    /* Peripheral clock disable */, n  w* h7 Z0 X) ?; ]( ?6 H0 y( |
    __I2C1_CLK_DISABLE();
+ I7 g$ x3 h$ C, t4 }8 ^  
; `1 a5 T; I+ X  v! j    /**I2C1 GPIO Configuration   
7 H) x0 f$ n4 Y% F+ a. `( ]  h: n    PB6     ------> I2C1_SCL
+ l/ ^! @  S% f0 P' S' \( q6 T1 ~    PB7     ------> I2C1_SDA6 \4 j& N& x, C* ^. o" X5 j
    */
1 o! z, d# j5 x9 F* w) }0 ~  t    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
# V9 F+ p- ?) ^5 I0 l( i3 N& t% x
% F4 g, z; F" w  }9 J- [+ h! }0 G5 E4 W
}4 T7 U2 t# v2 w% M
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
/ X1 [8 p3 ]7 e* d. L2 e& s3 fusart.c
+ Y; h1 j7 e' p' L7 m3 l5 @: @#include "usart.h"& |% v5 q- {" x: g  h. m- b7 O
0 |: k7 T5 E( `4 j, I! \+ D- e
#include "gpio.h"  z: N: q) D# S- p
#include "dma.h"
" Z0 M5 B# L& m# N6 H3 q
3 O# W9 C' ?# z( }/* USER CODE BEGIN 0 */
9 `, r' }3 N4 P- q; V1 N3 N) B
! L/ C4 n5 i0 B/ O$ a/* USER CODE END 0 */
( o7 J- _5 K4 I! U. S
+ \- h) @0 C/ s5 _% JUART_HandleTypeDef huart2;+ b* q2 E2 V$ E% j/ ]  H
DMA_HandleTypeDef hdma_usart2_rx;
! B- b. m% h2 m: [: a7 uDMA_HandleTypeDef hdma_usart2_tx;0 w" p3 |) c4 X; H
  Q; Y4 X: I( Q7 p
/* USART2 init function */# o: l; Y) Q$ c: C5 f

) h" i. l; [% h( s3 }3 Rvoid MX_USART2_UART_Init(void)/ D% d. p5 V6 }6 d9 S3 h9 ^/ ]
{; a: X6 Y- U$ D+ B3 T8 Z0 G. a

5 s5 r# u7 _9 {1 _+ m' ?  huart2.Instance = USART2;
: q1 q) a6 j% `5 V: r. ]% k  huart2.Init.BaudRate = 9600;
- U( K3 d& W: O) G1 o' c& `  huart2.Init.WordLength = UART_WORDLENGTH_8B;
4 I/ e3 r0 C. s! Y3 f8 y  S  huart2.Init.StopBits = UART_STOPBITS_1;5 s- V" ^. X. r: A: p& U
  huart2.Init.Parity = UART_PARITY_NONE;9 X* S) z# ~& I0 F
  huart2.Init.Mode = UART_MODE_TX_RX;; y0 K  S( R% F) H5 t
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
# J6 N- W) a7 R; H) g, }+ Y! w9 I5 E) k+ C  huart2.Init.OverSampling = UART_OVERSAMPLING_16;  a# Y" ]. _1 b# q* U
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;% n* P0 k. j/ V! T: k
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;) \. z6 V1 H* Z! ]. k5 x
  HAL_UART_Init(&huart2);& `2 z( v, |9 y3 m
! w0 p  Q6 H8 A8 P+ T7 V' o# t' G
}
2 |' q, `% Y5 t6 I
; K) `/ n* u8 Z1 o) Q1 z3 Kvoid HAL_UART_MspInit(UART_HandleTypeDef* huart)7 b" K5 f9 f. f
{, @* `1 B# j( k7 s2 |

1 `& h5 J# i6 v9 T: S: E  GPIO_InitTypeDef GPIO_InitStruct;: t$ a) f* v  O; c
  if(huart->Instance==USART2)
( f& W* t/ v$ S% V; T  {
; N0 ^1 l! ?- V$ u- a, k5 l    /* Peripheral clock enable */8 i3 h$ t  D/ Q2 q3 {' T( h
    __USART2_CLK_ENABLE();
1 n7 \: R! R* @- F5 X% b  
7 F6 o- f7 c$ i8 M) Y+ \9 J    /**USART2 GPIO Configuration   4 U5 |! _3 Q2 q7 _% p4 h
    PA2     ------> USART2_TX
9 u& _$ D' b" c* h: v* M    PA3     ------> USART2_RX
( \+ u9 U3 _( E- i& D/ Q    */( ~; G" p0 L( \" S1 {; V
    GPIO_InitStruct.Pin = GPIO_PIN_2;
( P3 V! d% f  k& m0 p0 B# R( W    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;. `( y/ X/ B- u2 l$ T- Y
    GPIO_InitStruct.Pull = GPIO_NOPULL;
& b$ e4 ^& e$ x" j    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
* G- ~% x" L( t8 ]" `    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
! y" I( x7 V5 p) R+ O5 o% q    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2 |- }4 E  C5 G/ k" B3 }! M- I& w8 S1 d0 `/ y4 H( L9 r
    GPIO_InitStruct.Pin = GPIO_PIN_3;9 |' `( y& x+ q' e9 D4 \
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  Z0 p; h+ G. d/ [& h+ r3 [
    GPIO_InitStruct.Pull = GPIO_NOPULL;* ^! E7 @  `+ N* o) T
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;# r! \. F  X$ d# r7 p2 G
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
& D4 u0 X) ]6 V; h$ O2 Q0 ~) @" G$ \    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 T# L! O) Z# }" F2 h, T' [0 {9 S

0 q* Q6 _9 M. T: x' @    /* Peripheral DMA init*/
$ x- F% q' a9 Q# f  
+ x0 E0 ]; Q+ o, Z* T! n  }    hdma_usart2_rx.Instance = DMA1_Channel5;% P% U0 G" |' o4 A
    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;. f* V" I% }+ e1 M; S5 i) _0 j
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;5 u  H1 T% y: L& C" e1 O" W0 z7 O
    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;6 j  u- R& O/ l0 n: T4 P: t
    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
6 v- m1 N4 m- u1 E& l, a. Z' [2 \) ?    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;, O3 W) J5 k1 K3 f0 g
    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
. [. F3 ]; o1 G$ R3 I( o    hdma_usart2_rx.Init.Mode = DMA_NORMAL;  O8 l( O8 ^5 {0 M/ i7 Y
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
6 a" L3 d9 E' v1 G8 a    HAL_DMA_Init(&hdma_usart2_rx);: H/ [% ]8 a* _( L# W, T
9 T" |8 u, T/ ^# [. ?
    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);% X2 H* q" k8 A  o
2 ]8 o# u/ c3 u" {6 P% |, u
    hdma_usart2_tx.Instance = DMA1_Channel4;. v; x+ H% e. o, X% |
    hdma_usart2_tx.Init.Request = DMA_REQUEST_4;
# m" I* ~4 X+ ~! u! f    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  U0 @# L, d/ N, g; K& ]: Q. ^    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;5 n* |8 j6 X: Z3 _% ~% a8 R
    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
! @6 G; n* r- h2 _" P    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;/ a, d, \" M' R2 X
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;2 X0 S, O* }4 n% Z; T2 d) F( E) B
    hdma_usart2_tx.Init.Mode = DMA_NORMAL;1 i+ O$ o5 B1 q& \4 j# k0 a% H
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;5 R' R) f& p; S: l2 |
    HAL_DMA_Init(&hdma_usart2_tx);$ q, X2 {% R! D6 I+ A

$ m; p: O# V6 ^7 j5 C6 |    __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
) o/ x9 ^, S/ z1 J6 A; M; Y* l$ G, d2 J* X9 r3 y; r) r
  }
& k/ t6 X+ a* c& P8 }/ i+ q; M% v}& u7 ]1 g- {  N' x! C, p3 {

8 _; z, V' y$ ~! X  j1 ?void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)3 y5 ?  {2 f. x( n& m2 N
{
# Q" I  r1 K. M. l7 p$ O8 W! g* Y4 U" N/ _5 k4 v
  if(huart->Instance==USART2)
& K$ q/ H' l8 H' o& P+ @$ K4 @; t/ @  {. t8 |4 o9 [; k
    /* Peripheral clock disable */0 N- w( M; H+ ]5 ?
    __USART2_CLK_DISABLE();
# C1 i/ y- m) |  . D. V' `/ F7 m  w
    /**USART2 GPIO Configuration   
/ r- p0 ?* L4 ]( `7 m- D" C! M    PA2     ------> USART2_TX
$ h/ G1 n5 u0 l. w, y5 Z. t    PA3     ------> USART2_RX
2 a) y, d$ @* e& p/ i: L- _    */
- ?+ I! b9 Y8 W3 T4 ]) v5 c9 q0 i    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);0 k5 G  y! i% i( R& Z
2 w- d: _: d9 i3 q$ ?$ v! ~/ t
    /* Peripheral DMA DeInit*/, h% Z" f5 Y" {
    HAL_DMA_DeInit(huart->hdmarx);
0 q) E7 X! A! c1 O+ m    HAL_DMA_DeInit(huart->hdmatx);
; A) k: _  Y6 F4 ?# E7 q  }
2 `0 ^) [; d1 M/ R2 v}! }7 o8 U6 V2 D4 I7 K9 b! ]
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
: t6 e" J* c1 c- Qmpu6050.c
0 e# u; ]8 D4 l6 _# X#include "stm32l0xx_hal.h"
: w& u1 D  \. W2 e#include "MPU6050.h"
  U' {; h: }2 b3 W7 l
6 a! z2 p9 R  r, @& D1 e5 g; r//各坐标轴上静止偏差(重力,角速度)
: U; a; t2 s9 c, A# ^/ [: X* [int16_t offsetAccelX = -195;" `3 r( `. H! ~' X7 }8 y
int16_t offsetAccelY = 560;
" N7 D$ w( m3 ]& g- {int16_t offsetAccelZ = -169;
& a) y  J: W& ^  u3 x
/ I$ \6 H( V% M' \int16_t offsetGyroX = 12;( j7 s5 Q# t9 B5 {
int16_t offsetGyroY = 33;! C  j) M: a+ l9 L, E' N: ]1 i, i7 K' A8 |
int16_t offsetGyroZ = 4;% B, ~8 f! a) u2 w
! X3 o$ {5 s* P2 e! A
extern I2C_HandleTypeDef hi2cx;  t# G& n5 J' `0 u. s3 F, F

- N  l, Q; T; u) a9 \2 J//**************************************
1 l# }4 `" X) w( Y# ]! h3 J* ?//向I2C设备写入一个字节数据4 ]! N6 e( @6 ^- ?3 v/ s
//**************************************2 Q; D4 x- V4 W. L$ x6 o, d+ t- r
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)8 q2 A, a* A: u7 ^
{" {) g) ~/ a5 L$ |* J
    uint8_t rxData[2] = {REG_Address,REG_data};
2 E  _  ?. A/ {- r    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)
5 L, {) N; j9 ~. o    {' s1 i: X# X! z$ }7 q
        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)( V$ u( |8 Q( u7 C$ U
        {}
- J# O( X# o% l* Y+ Y    }
5 i! ]1 N$ g  s1 ?" c- H9 [}
, {8 O* d* Q% o- [" O//**************************************1 J3 ^2 ?  @( W0 ]4 }
//从I2C设备读取一个字节数据1 O' W* d) X9 B9 z
//**************************************
2 V$ U2 I6 i0 b. [9 x, _% Nuint8_t Single_ReadI2C(uint8_t REG_Address)
% H3 X8 l* c( \8 {: P+ X{
0 y0 U: V7 o7 ]9 d$ a" {- w    uint8_t REG_data;; [3 _; o5 `* j# H( }
    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)
9 R$ M- G9 Z6 Z1 P    {
; V' L+ G; j- }        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)+ E! I2 l* A2 D' R
        {}
- X; r$ p& N/ M% [0 d5 r' [    }$ O& c* v/ m; X1 a
   
9 f8 A% m( v5 l2 U6 r  T4 M    if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)4 ~# S2 E8 e1 @8 j% [
    {
1 q; f' x  c" u8 v3 P        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)2 ]: l/ c- M! L1 N3 T
        {}4 L0 D( s  Y. z' v3 U7 w
    }
. h! ]8 U! O) R( U, b% R    return REG_data;/ u/ ^9 @* R! f' ]3 O
}' y* x4 K  I' _% @
//**************************************0 u# B" N8 [2 U/ _5 P, w3 F
//初始化MPU6050: S  E6 ?/ h+ L/ c4 {( i* b3 s3 r$ \
//**************************************
) V' E7 A0 H4 h0 @, x- M" v  lvoid InitMPU6050()
. y9 ~' l& c9 ]1 N, p{- |. l5 K7 ^& X' L: h1 B# Y6 D& s
    Single_WriteI2C(PWR_MGMT_1, 0x00);    //解除休眠状态
' b5 z7 x/ G7 C+ X7 G+ C1 a9 t) t( C2 i$ o* n9 C, O- [
    Single_WriteI2C(SMPLRT_DIV, 0x07);" F7 q  I2 l+ ~9 x% s
% k% x% d. W* {+ m3 y
    Single_WriteI2C(CONFIG, 0x06);
5 x: U4 }' {1 b) ?8 e# a! Y, Q$ ^9 h
    Single_WriteI2C(GYRO_CONFIG, 0x18);7 C1 Y) }5 V  a9 _5 j

; {8 j+ Q( q/ q1 t) q" _    Single_WriteI2C(ACCEL_CONFIG, 0x01);
: D5 W$ t! F( A+ \: a$ ]2 Z}/ t& S% F# N& `2 f9 x# H  V
//**************************************
2 V, B. Y6 u8 O& e& l//合成数据. s5 ^: Q! P" ^( w: e# b8 s- H' H
//**************************************
+ O3 A" i; o) j! o' Y. h4 oint16_t GetMPUOutValue(uint8_t REG_Address)
* m2 G9 F' s6 j# y+ f( v{
" `  Q# K7 {0 _& J& ~  N    int16_t result;
& [7 ]5 w0 Y. Q) a  L    uint8_t H,L;
: z  u" e- O) [& R# B. z( |    H=Single_ReadI2C(REG_Address);5 @$ f7 O2 G8 t7 d$ Z# X: D
    L=Single_ReadI2C(REG_Address+1);9 ]- H) r4 V! G" G- t, [) t3 K
    result = (H<<8)+L;- N  @- p5 F1 f4 e8 p4 i& k
    return result;   //合成数据3 I: }, t$ Z8 }+ W1 d  P% ~- \
}" ^/ v2 U8 y" E3 u5 U
7 X& P2 r! l; W/ b
//**************************************
9 p* s% J) _2 |: k, V//取某一轴上的加速度数据# y4 G, l; u% ^) D- L
//**************************************9 Y% P9 e& f& F
int16_t GetAccelValue(char axis)' s5 l9 N; v. U; R0 U
{
( V6 P; T3 t# o    int16_t result = 0;
! Z% k! o( W( e5 U! t    switch(axis)9 Q! _# [& l8 [# b* q9 [0 {
    {
, K/ A4 C& x# U; K) ~! [5 i- s; a! ]        case 'x':9 g" Z9 Q! a" `; ]+ A
        case 'X':3 g& P4 E8 \/ N
        {! V) z8 t: F% \
            result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;; z% q1 O8 Q, K; A  y9 P
        }
" |: O" A5 I# D' }0 ^        break;
& U( `; ]0 V- s) S        case 'y':/ t+ {1 U* @. `$ N- T! k  V) d  c
        case 'Y':* L5 O9 W% Q) d0 o) v, f) d5 v
        {
6 r$ }: C8 b2 _" ~! \' k& H9 n            result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;
2 w+ P, a8 X8 t6 ]% n$ D) Z        }
' n! U& E+ b5 L, }$ n. r        break;
( |: T! A9 ?* w* I0 k        case 'z':" b4 N) B4 g( Q! K- {9 ~: J( E* f
        case 'Z':
8 V% a; {" j" H7 W        {! N# M. ?/ K9 g5 [. M
            result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;0 m) o$ j/ ^3 Z8 e( l: i
        }( g5 y# ^' ^$ @5 U; z
        break;
# d1 k- \) Z$ c6 H7 }& a" x    }: Z/ |& [) w5 |) Y* A! e
    return result;
8 ]" g8 l$ k/ a" m$ f4 A}0 r+ m7 ?, E7 d* r- h7 p  R/ C* X

) ?6 R! M' W* X% }+ [; Y//**************************************2 D& H! L7 }8 G2 K1 M
//取某一轴上的角速度数据& |. k7 P: K) @- T8 ]6 k* k
//**************************************3 A$ Q! ~1 l/ @" ?( W
int16_t GetGyroValue(char axis)/ C0 F( }" V2 S5 \
{6 K8 ]/ R7 X; U. Y1 i
    int16_t result = 0;) c8 K# D  N+ e4 Z3 c
    switch(axis)  e1 ]2 n$ r. S/ e; O
    {1 A0 t( [# P" O2 p4 W1 c3 _6 ]9 ~
        case 'x':+ [; R0 L# q4 Y$ f& t) r# P$ e
        case 'X':4 L6 f7 O2 A2 }
        {
& F: n- o, k- R. }8 o            result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;3 y3 H) x- y6 P4 Y/ w8 Q, H; e
        }
$ u/ w5 u% _0 T: g0 P, u* g& x        break;* t; U6 P* O- u( _8 J& s4 z
        case 'y':
0 }9 l, T6 [' ?: x# g0 W        case 'Y':
' _8 Q8 ?0 X" T# B6 ~        {
/ D5 v9 Q/ h) v6 d% e+ C            result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
& f( P6 A* r- o1 X        }
8 A6 b- \1 i: F" }; w2 I; U        break;5 C; O  y" z' h3 r# d8 X
        case 'z':% V7 S1 ?+ F* K" w5 O8 y
        case 'Z':
3 W4 S! m# r' y* S5 ]        {
9 d) c* u& a* V            result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
0 u) w* p  X7 V: I& l! y        }& i: [0 `* `& y& q3 `- Y
        break;& t4 |- N0 K3 B
    }
" v* A" o$ Q" ]3 f, h$ r    return result;
) G5 s- D( A. B% M% U}

评分

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

查看全部评分

党国特派员 回答时间:2015-1-6 13:21:49
int main(void)9 J* G! ^$ _+ m$ {2 i) i# @
{
, Z* h* x1 [+ J% w" X! Y! E2 @9 Z5 T6 {3 g
  /* USER CODE BEGIN 1 */0 I0 p7 c/ }1 g' p
$ W7 r( w9 K: D+ V) S- m! B' M
  /* USER CODE END 1 */
) r, L6 T) B" O5 t, T' B3 h& r! x/ C% Y  h
  /* MCU Configuration----------------------------------------------------------*/
" l2 s# w" y) c4 V2 M9 D1 g2 r5 k* T3 N6 ]( ?# n' Q
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */: Q$ y# T! N/ K  L! [
  HAL_Init();" Q* r# G1 z7 ?& ?" R2 O. @

* L2 g% G' f/ H  /* Configure the system clock */+ S, |) @* J+ f1 G/ `% ~
  SystemClock_Config();
5 F4 M& @6 G* I; M% Z; i) B( x; A9 D$ R) d  Q9 X& |
  /* System interrupt init*/
8 O( ~: S) R6 j  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
! [: P; x3 ?' P, T. e' `
8 C& ^* v: ?, `6 C# ]  /* Initialize all configured peripherals */3 g& C4 F3 o5 ?) d: C  I1 \' c! i
  MX_GPIO_Init();9 D; [' n# v& }8 p9 V! F. R
  MX_DMA_Init();
; S# }/ D' w3 q# s7 W1 I    MX_I2C1_Init();8 H- {5 I+ [: O8 G9 G0 p) @, u0 ?
    MX_TIM2_Init();
' d6 m3 F8 h" l/ q, [. t3 f  MX_USART2_UART_Init();2 l+ ]; n5 |9 L  J  @
    InitMPU6050();
) t7 N/ D  b. ^& P
2 _  `8 r5 b9 }1 C. V+ U  /* USER CODE BEGIN 2 */+ X+ {/ A4 {( U
    HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);; f9 p4 |9 A( X& V6 Y1 F# u
    HAL_TIM_Base_Start_IT(&htim2);
3 t8 }' ]- d5 }7 U9 R  {  /* USER CODE END 2 */
/ k* r6 J& r0 c6 o* R
, s' P5 f6 S" W0 x) ]  /* USER CODE BEGIN 3 */
% v+ M5 R4 q7 [4 B. j: d  /* Infinite loop */( ~6 f- j4 P% k- C+ C. V( ?- U. C
  while (1)* a1 }' F7 }  J# Y- D
  {  ^" i# a) C5 j
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
' r8 ?* i( R( D* v5 K# G1 m5 k6 G        VisualScopeAngleOutput();
9 J9 L# d) R* z- E2 a        HAL_Delay(100);! c6 @5 b9 }( w5 o" j
  }
- A2 k" k" a$ L+ I1 Z# A  /* USER CODE END 3 */
, s2 _6 O) \% _- j/ h! V9 u6 @# i/ {; G9 j
}- q$ J# P2 Z( j1 w0 p' l
6 P% j2 B3 v  x3 n9 |
/** System Clock Configuration' d4 @* c( F  k6 |
*/
0 t" L6 t, X& q2 R) Y. bvoid SystemClock_Config(void)# ~+ T, A" Q3 n, Y5 n: N( w$ ]3 @% t
{
9 ]* E( Y1 G/ [# J2 Q
: r4 O/ d$ x( C* Z2 F( l  RCC_ClkInitTypeDef RCC_ClkInitStruct;) ?! z) _! Q) f2 Y" A) g
  RCC_PeriphCLKInitTypeDef PeriphClkInit;
" R* G! X; A& C! U7 o  RCC_OscInitTypeDef RCC_OscInitStruct;
% B$ J* l, i$ q: p! ?6 \5 `0 P/ M) z' }9 Y5 b" U
  __PWR_CLK_ENABLE();* T; l3 h; X7 U# p

1 v# B/ i1 u+ X1 c+ N! v  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);" y" O4 V3 s2 p  R/ U- a7 o

6 R6 n) k% i8 l5 ?1 P  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;& _% ~  g  v% m0 b; {2 B
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;8 ~! V+ Z4 j5 b4 A) L
  RCC_OscInitStruct.HSICalibrationValue = 16;% X& B7 v; Z: S# b  z7 Y. f
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
% ~) }: t* @& `  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
& ?# W! `: @5 K; \2 @# _2 B8 I7 |  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;+ C8 V+ X/ L% N1 h( H
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;; d& [* F/ ], G7 ~$ Q. }6 N
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
. v0 d4 x/ \, G1 F  ~6 ^
6 P$ E6 h" r. a2 e8 [1 b  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;' X- a8 @, C+ T* B1 L7 M( c
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;6 ^: U" N0 B" S8 e- \" S
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
5 Z8 p  N4 }' ]! I+ m/ A1 \% ^  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
2 v7 z( r5 s. a$ z  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;4 b% @  p+ |1 i$ q8 n! ]5 t$ Y
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
. B  N& Z* k  M6 o7 K5 I: ]3 S( `( j8 F( O5 M/ ]& E0 h
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
, a0 Q& K  g. T2 W) g  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
0 T( p3 e: I# k8 e/ i' a3 P  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
5 _# u. p4 G, T* \$ W9 M8 l$ E+ y
  __SYSCFG_CLK_ENABLE();
9 a! T# V& E2 T8 I
6 e3 k/ S3 Z6 y8 u& |}* c& r# t9 O9 H5 w6 a
) n1 b# |8 Q- S7 V% t5 N: F
/* USER CODE BEGIN 4 */
4 j; X0 u4 [  ?9 zvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
: }% h2 ]% C& s1 H" G: L{. ]1 _( R( f% t( p* t* T
    if(huart->Instance == USART2)8 ]6 m% s" o5 [) x. O: C9 s4 @
    {
1 k" E) S2 S# \' l+ y# ]        memcpy(txBuffer,rxBuffer,RXSIZE);0 i1 z; P& b3 c2 B( Q
        HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
% m% k* R0 ]2 G3 }0 n. R. f        HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
$ T! v9 q" ]3 d    }6 i( |7 t4 v+ R- t2 c
}" @" b: p5 J* Y- _. i0 i; |

& V: M: I" {! Cvoid HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
" E! ~* z& A* ^4 ?% b{  \# B# o' f) N* v& D% {' y9 H. a
   - K3 V5 T& m: J" ]$ r9 A# C1 c
}
  }! Q$ H3 H. U0 {9 T# x5 l' |
& F, Y' x* W9 Rvoid HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
" D# a( q% |5 q! z9 g8 S$ W( A{
  ~* {1 k: L2 [3 t    int32_t GyroValue;
4 x5 }" q, s3 ?- {   
4 m* ^5 p7 r4 B: y( ]$ j5 C    Calc_AngleAccel();
, v# \# h/ x* L" ^! d$ _# N    GyroValue = Calc_AngleGyro();- B- ~: h/ ]5 d
    ComplementFilter(GyroValue);
" w# S0 S. A6 p- U9 c" }$ o}
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
0 \( C+ Q) }3 e$ F楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...

& V6 Y+ Z# E7 i  t) u/ t/ E4 I使用DMA方式,接收发送数据必须是个固定长度。
党国特派员 回答时间:2015-2-17 09:21:31
星辰一方 发表于 2015-2-16 19:00
4 g" d! T1 w5 j8 Q- w3 K+ t楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...

# c9 U( \2 s/ ?如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
我夏了夏天 回答时间: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
! j4 K" F3 V$ m- x/ k4 t如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
. p+ c" }/ d) s" c1 m
好的,多谢指点!
rogerkun 回答时间:2015-4-3 22:08:29
楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?
  n7 P2 v7 q4 V# L- @  b& H1 x请问应该注意什么地方
nocoyou 回答时间:2015-4-4 09:12:05
顶顶顶顶
党国特派员 回答时间:2015-4-4 21:33:35
rogerkun 发表于 2015-4-3 22:08
' r" y4 `9 V  u- v7 b; F楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?+ k! g# X/ y8 h2 o( u
请问应该注意什么地 ...
  D# k# L* L6 B! M/ D
我使用是没有问题的呀。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版