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

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

[复制链接]
党国特派员 发布时间:2015-1-6 13:21
拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:
' s6 \0 Y+ L+ @+ p& _-------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------  A9 C9 {$ y- `5 X/ G8 z
main.c) J! b$ y' y9 q- ^" @4 k
#include "stm32l0xx_hal.h", v; D$ b* ?! `4 M. K- u! q
#include "dma.h"
' x) {+ n- ~& `  m, a& d) {#include "i2c.h"+ n6 M0 s. ~$ o( S4 o
#include "tim.h"$ f9 \( O4 K  J( @: V' w
#include "usart.h"
' c+ X3 g( n; @6 j% A#include "gpio.h"
) R& B+ w- [6 w9 j#include "mpu6050.h"0 {- ^1 q' w) `; |) I
#include "visualscope.h"
4 v+ X4 c. S) z( X: t+ E' J$ \/ {" [% f5 _& j, m; K
#include <string.h>" `& h( O  p& m& q
#include <math.h>
2 ]8 a4 \/ ^" s# \" U! B1 S+ E+ N( e4 H8 P: Z3 k9 `
/* Private variables ---------------------------------------------------------*/
  Q8 |% Z2 x0 Z1 @) X& \$ k#define RXSIZE 8: r8 g. |3 D& y# Z) q1 t5 }6 a
#define TXSIZE 82 |# O- J- N7 }( a7 G8 a
uint8_t rxBuffer[RXSIZE];
  |4 ^4 ]  y; k, T  l1 v. M/ nuint8_t txBuffer[TXSIZE];0 I7 |  ~- l  E! X# Z

6 G$ \0 o5 C; y/ i. k- efloat Angle_accel = 0;
/ p6 s5 H; U# Z) ]* ^" M& P3 b: tfloat Angle_gyro = 0;1 e9 y, J0 C' }  v- r" U
float Angle_comp = 0;) R! g# J8 U) G  J" B/ W$ G1 b6 @
uint8_t outAngleData[10];. g6 p( o! q- e$ X, e# H! Y& h: N
/* USER CODE BEGIN 0 */
( q$ m7 d' L* s4 l* ?6 X% Z0 Y0 n- d: p) c+ Z& K) ]8 W' N+ _1 n
/*---------------------------------------------------------------------------------------------------------*/
) b' g4 X$ G) X4 W4 ?6 b/*  重力加速度算出的角度                                                                                       */2 S, Z7 y7 H. z' ]- }0 m$ M
/*---------------------------------------------------------------------------------------------------------*/
5 {8 F# S* c8 n) @/ K8 x, zint32_t Calc_AngleAccel()
4 C$ _# ]+ O3 J' s; i5 s' E9 ]( I1 n" `{' @- q* a* a9 {7 Z
    int32_t value = 0;0 u. V3 K6 L  ^0 B: {! F
    ( p5 S2 H* C  j) A5 z# B+ U
    value = GetAccelValue('x');( |0 ?. ~; f% G
    if(value > 16384)
) N! S5 B9 k9 y8 A5 ?        Angle_accel = -(asin(1) * 180 / 3.1415296);
6 x% x% K; N$ ^+ i: @( O6 D    else% r% w6 d$ j! l% |) w
        Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);
. ~3 ?/ _. I9 O* U1 j$ K2 C   
5 J) l& d  q. o7 b9 m* l$ ?    return value;
4 f' k: r8 P* e# Y}/ a7 F1 q* L3 H5 g7 `1 d

6 _7 B4 v$ ~5 {" e/*---------------------------------------------------------------------------------------------------------*/- g9 n) T' q! z0 A4 J" Z5 x5 M5 K
/*   角速度算出来的角度(积分)                                                                                     */2 u7 Q# j' |( m! V
/*---------------------------------------------------------------------------------------------------------*/, a5 m0 c  \1 h( i$ G
int32_t Calc_AngleGyro()0 ?# s3 R# J( |3 h, N' ]
{
( T, r! E  N- h4 B% x  d. s    int32_t value = 0;  c; [, ?& t% ?0 o/ G9 U

# j; S& V, @# w. S+ Y2 k! J    value = GetGyroValue('y');
7 U$ Z9 v) d  _7 [" ~, F" h; d    Angle_gyro += (value / 16.384 * 0.01);
/ K2 C4 I0 `  T0 v   
4 z( W# c+ J( a    return value;
4 }+ v  R) e5 i}# X/ Y* K$ z: i# y, [* g
6 p7 U1 e- |. v- @4 J6 g5 h
/*---------------------------------------------------------------------------------------------------------*/
9 G6 }: [) h2 Z. y8 m2 ~- k8 }3 j8 b/*   互补滤波求角度                                                                                     */% V2 Q& p1 ]% y4 L
/*---------------------------------------------------------------------------------------------------------*/
' T# }4 E" X4 A6 c' x0 J6 W0 bfloat ComplementFilter(int32_t simpleGyro)3 h; p  ?9 D0 Y! I* j' @. Y6 m
{) \) |8 G6 m8 M8 [' J
    Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel;% g# P$ U3 [3 l6 U0 b& B( M$ r$ C
    8 I+ \7 a# A1 M5 p6 L4 \4 e
    return Angle_comp;) z% J/ R5 j7 C- i) b  |1 Q- e( i" h+ b
}; F% u; X* [; N; a/ _3 |8 @
, l, C8 c2 R5 Y! m! a) W( A+ h
/*---------------------------------------------------------------------------------------------------------*/
2 H+ h/ e3 @8 K6 s6 f4 K/*   输出角度至上位机                                                                                     */
! X6 l* v7 O3 b* W7 q. G- T. o/*---------------------------------------------------------------------------------------------------------*// l! e/ y! R& Y
void VisualScopeAngleOutput()
' A8 ~% K5 d+ s7 F, P; D{4 o  ~( m: {; s7 l! ?0 W
    int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;4 P7 `# {5 D( V/ E: g) O. {+ C
    uint16_t crcValue;
7 f! {" T* v$ Y6 Z  u' L* R8 L# D   
8 z- z! {' O' k4 B  M    AngleValue_Accel = ceil(Angle_accel * 10 -0.5);7 l( W; s5 Z& G9 ~6 k: U
    AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);; i0 }. @: I, y# j( o* p
    AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);1 h2 N) K6 g( a% _6 H6 T
   
$ h, F6 i2 g- D  S    outAngleData[0] = AngleValue_Accel & 0xFF;$ b0 ~* Z! D3 v% e7 t, [- a& |
    outAngleData[1] = AngleValue_Accel >> 8;: r* [* V9 d, K+ @$ g* g0 N- @
    outAngleData[2] = AngleValue_Gyro & 0xFF;% V9 \: |0 w, a- Q, F
    outAngleData[3] = AngleValue_Gyro >> 8;7 b4 t" }8 p% K
    outAngleData[4] = AngleValue_Comp & 0xFF;
; ?0 H) O$ s$ H7 G# N& t/ E3 B5 a8 U    outAngleData[5] = AngleValue_Comp >> 8;
& j# g% {2 M' i: `2 y    //计算CRC
6 n. ?- ?5 M$ o4 a% g- U2 v8 N" |    crcValue =  CRC_CHECK(outAngleData,8);- n- U1 u, M- V) w- v
    outAngleData[8] = crcValue & 0xFF;
$ P3 H, I' Q, k8 C9 @; |    outAngleData[9] = crcValue >> 8;
' ~" j5 ?" A* U9 j3 _) F0 D, `    //发送至上位机
2 Y6 t3 b& @! ?# F6 O8 V: L    HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));
  d6 O; R; U( e) ~% d& J" z/ h}
+ |: N6 o8 f% l- H  ?* k/* USER CODE END 0 */
; b& Y7 J8 M" _! s" p' {
: |! T* r( @7 I- w/* Private function prototypes -----------------------------------------------*/
) J  s2 s% r. P6 W  t# Evoid SystemClock_Config(void);
1 `( h* Z' _* d, t) I- I- I1 S3 r6 {0 h) r

& |3 ^/ t+ `6 m4 T  a, v硬件连接图:7 |% I8 @) T8 r8 J4 [  f1 B
1.jpg
7 _- t$ w- |' k& l2 O5 O波形图:
2 K4 Q: K% @# c) K" q/ G! b 2.jpg   E/ G) n6 v! X& y! S
最后加一个视频:
5 J: l+ p2 U6 g. U7 G  ^" iSTM32L053 演示& \: T, i9 ?2 ]8 [: T+ o) }& ?3 h
1 收藏 17 评论75 发布时间:2015-1-6 13:21

举报

75个回答
党国特派员 回答时间:2015-1-6 13:22:04
I2C.C4 A  }9 c' ?7 O% ^
#include "i2c.h"
9 ~% K" |! W+ w( ?( Z3 Y0 X0 u" z1 J  d
#include "gpio.h"8 s4 I( h+ Z# [( \4 M
0 _2 }, e. D5 {* p# d2 \. i, X
/* USER CODE BEGIN 0 */
5 Q8 o1 n' b; s2 B4 z$ q) h* j4 P- P0 i; |- U5 Z
/* USER CODE END 0 */2 V# s: [9 U, |3 U1 W  L
; y3 |" |; C! `' _* w- z. e
I2C_HandleTypeDef hi2cx;$ w. j0 l% ^  b* }, z

. Y1 U% w( l5 N9 G, m/* I2C1 init function */% a& @9 w# b( Q5 Y! M+ [9 R- @8 k6 X, }
void MX_I2C1_Init(void)! f4 S# m5 T& s8 z
{6 ]0 @; I; t) C1 C( `: P; Z

1 B( _& B8 T7 s9 f; y% b1 b; x  hi2cx.Instance = I2C1;; \( P1 U( ~" m
  hi2cx.Init.Timing = 0x20D22930;
4 \3 h0 o7 r/ u  q. H/ D  M, K  hi2cx.Init.OwnAddress1 = 0;" S: N# Z% Z; i
  hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;+ P) I2 _# y- b* _" r
  hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
# H2 D: t- F/ |" ]  hi2cx.Init.OwnAddress2 = 0;
: u! y. c, ?. ~* k; F$ H  M  hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
8 V6 `6 C$ f: P  k8 [/ N" W  hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;2 x) n% c2 O' p6 C/ X
  hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
, H' k7 G  b( y1 ~) \7 L: U  HAL_I2C_Init(&hi2cx);
+ H' l" ~( Q1 w, i. N' n
5 u. x4 X* }+ q8 V4 J7 N, e( V    /**Configure Analogue filter  w- F$ e7 a7 v1 N& A
    */
  f6 Z) d1 J* v' U, ]  HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
3 U& p8 u( q% S$ J  w  a; @9 n( Y! s8 W% v& @' a9 r
}7 O' n0 j8 J) G  q. [% ?  G

& ?' }6 {2 i# S9 T8 Vvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)3 Q" D9 m" G% z' D- F* B
{2 _  x. I4 N. x6 M: j. j5 i7 B

' w- G$ q! N5 x9 i1 s  GPIO_InitTypeDef GPIO_InitStruct;5 T* {4 B* o9 F% D4 Y
  if(hi2c->Instance==I2C1)
' S8 f) J. v6 c" U  {
+ L! K6 c9 F* j% [. ^    /* Peripheral clock enable */
7 E# q9 w0 x' A8 m    __I2C1_CLK_ENABLE();$ o/ h: ^! Y1 ^
  2 ?! r7 v+ j/ w: ?6 W, S
    /**I2C1 GPIO Configuration   
+ J, \9 A, O* v$ J5 L+ \# |    PB6     ------> I2C1_SCL
- ]( a: Q4 d( g    PB7     ------> I2C1_SDA
% V) a3 o: z, y" ^1 |    */5 |" I3 p( Q0 i6 G' S; n8 o
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;; N* I. O0 k3 a% y4 j
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
. i! n9 W1 B$ \- {7 k) o$ C    GPIO_InitStruct.Pull = GPIO_NOPULL;4 ?9 g. }" W, a( F
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
: G! o: Z& y; i1 k8 _    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;  [9 U* c) y& K% O$ [& h: M4 `
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);4 m- }5 ?% m% R. L7 [

& u2 m1 s( k2 h# F- _  }
; |1 ?6 D  l* s; F9 r% _0 A. T9 h}& Y3 p0 m3 @/ Z1 Q/ x- J5 q
# K, H7 ~, w3 S& t0 Y0 ], _# S
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)) x3 _9 J  a6 P4 l
{
6 D! q) m7 q1 U, g1 A( X. F
+ N3 T3 ~! n+ B1 p6 Q7 w0 p0 z: ~  if(hi2c->Instance==I2C1)/ q* N9 f4 K4 ^& P; Y
  {" E- n0 F' _3 q/ w+ o8 G- T
    /* Peripheral clock disable */2 q; k& `( r5 P' X7 G' y8 C( n
    __I2C1_CLK_DISABLE();
, }. M0 P, |; X8 R  
. }7 e6 d: |( v7 X    /**I2C1 GPIO Configuration   
% M: n3 P5 q" _  z' w# {    PB6     ------> I2C1_SCL
! u1 y/ M! j: D    PB7     ------> I2C1_SDA
. H7 k( t! ]7 O5 L% F    */+ X7 c' t2 B5 @9 }
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);$ m* B  ^# b8 Y/ D3 i

0 _3 y9 I. ?) }- Q8 l: g  }2 M: y3 c5 U" W6 K6 \& I1 }
}
' z  Q: i+ ^& u% @: A. W8 ?------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
& x9 X+ T6 v/ R8 F- v0 A) _usart.c
# T3 C- t7 |+ l: p7 F# q8 F#include "usart.h"
" K: _8 Z% L' f7 t
. m& T  ]( ~6 l, S, e& L6 b4 C# q#include "gpio.h"$ K1 c6 C9 _, V$ Z
#include "dma.h"5 _: ]# p( s8 U) R1 C% B
2 R4 J" G' Y$ w) k
/* USER CODE BEGIN 0 */
: z+ y2 l/ t; r; u( ^- E* B, U) d" E# P  H% u. c
/* USER CODE END 0 */" T3 P: m3 l% s5 j" B" y

! s5 z2 `9 L# t, Q- B6 {UART_HandleTypeDef huart2;
% Q7 H% N9 k1 T  K0 RDMA_HandleTypeDef hdma_usart2_rx;1 F; B) t# H8 E# x7 z7 K4 U
DMA_HandleTypeDef hdma_usart2_tx;8 G# P" s* f6 I0 B: G
  e8 h; d8 {! g
/* USART2 init function */
3 F* {. S( w5 {$ i( g9 T. a6 S8 u! w+ `1 t5 f4 K
void MX_USART2_UART_Init(void). b! i0 n4 X' \% S" ^1 C
{
6 p1 q+ B0 V  @: j1 g3 `- `1 _" f9 ^" w; ~7 C; h
  huart2.Instance = USART2;' j9 Y" H5 |: p3 v0 g4 X/ }* L) O
  huart2.Init.BaudRate = 9600;- D& Y; d$ {. {0 X9 O
  huart2.Init.WordLength = UART_WORDLENGTH_8B;* C" k; N# S: n! O3 X
  huart2.Init.StopBits = UART_STOPBITS_1;
0 h( E) r7 p; j  huart2.Init.Parity = UART_PARITY_NONE;1 L5 W: ~4 s- i( P
  huart2.Init.Mode = UART_MODE_TX_RX;4 a& [2 N9 ?) n+ u5 K4 e
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;( ?( o; T, w! {0 c/ B
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;4 i! c7 B2 b# z+ B+ c
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;: S/ _: G" A8 d
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;2 v+ q: ^8 E, q4 O2 Z" s
  HAL_UART_Init(&huart2);! Q" h. u$ [- O: o9 Y

% i1 ]1 l2 I$ d" O# l! ]0 O}5 E+ b1 F$ g2 N: t) {3 D  @$ B
- D/ L4 u- t3 B& ?$ f
void HAL_UART_MspInit(UART_HandleTypeDef* huart)) c! c8 B" D- m: x4 Z% h3 s; O
{& |" V2 P2 b, D  a  [7 l

) o* J- B/ b/ U/ U  GPIO_InitTypeDef GPIO_InitStruct;
, R& a' y. R4 C% b$ a! |- n8 N" D  if(huart->Instance==USART2)- `* G4 ?# o& r
  {7 t' b: y9 T; T7 C8 X. Z0 H
    /* Peripheral clock enable */' ^8 V2 N7 L* `" @2 ~
    __USART2_CLK_ENABLE();; M% g3 \1 G: N! m& c4 q/ h) V
  
, ^: A+ }$ y& k, R+ k9 b    /**USART2 GPIO Configuration   
" N. _% _4 E* e    PA2     ------> USART2_TX
  T7 g6 ?1 S9 y# e! N    PA3     ------> USART2_RX# v7 J2 I8 i+ U% t8 R
    */
2 {9 r6 E  b$ c/ q* c. ?    GPIO_InitStruct.Pin = GPIO_PIN_2;7 C+ w3 u3 z! K: p
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;6 u9 i/ R. L: ^  {$ ^, k4 H) R
    GPIO_InitStruct.Pull = GPIO_NOPULL;
. r% s% ?: n% E0 i    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
3 ^, |) b4 f1 r7 I( o, j% |    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
/ E2 V! d0 F3 z6 I    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);2 t! |) \$ ?! ^+ e; _
" g5 H# e" J8 o# Q# I  h# i
    GPIO_InitStruct.Pin = GPIO_PIN_3;4 R" ^" r: G. H$ ~2 I) U' f
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
. p. u, f4 y/ L: g- N1 o3 Q! q$ v    GPIO_InitStruct.Pull = GPIO_NOPULL;
6 y" e2 S: d% ?3 Q2 V  f    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
: [1 H$ k& F, ?7 S) H    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
8 `) J9 q/ h% T8 {; y  h0 @    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 {, j9 W4 h8 A+ `8 y& ?% P

, G( K) G( u8 I8 {( E# `    /* Peripheral DMA init*/: x5 ?4 v4 S) ~' Z7 D2 K
  
% M* C3 v* Y, Q- [2 f1 h( a# }    hdma_usart2_rx.Instance = DMA1_Channel5;  I; p' c3 K# ?0 {
    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;2 s$ r  ]; G1 n2 Y- p5 z
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;' r2 ~  {: d; w8 o
    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;3 t9 H! ~2 }2 y% Q9 _$ h! n
    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
+ [7 I( ?% @3 q    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;; Q% y) F: Y$ Z
    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;7 f3 c$ D( i1 T$ x5 z( D
    hdma_usart2_rx.Init.Mode = DMA_NORMAL;. r& Q8 v& n) d3 G% A& O
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;+ |8 i8 ]! n7 l& S2 E
    HAL_DMA_Init(&hdma_usart2_rx);# W( l. }1 o* X2 `2 n

% g. M8 _7 [4 J3 U' ~    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);; t- y# a; g2 _3 r+ u

# l' Q- I5 x# w( b    hdma_usart2_tx.Instance = DMA1_Channel4;
; o* ]: o) f1 L. k    hdma_usart2_tx.Init.Request = DMA_REQUEST_4;
' D; t. n/ @7 l: r! |1 `- W    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;0 u$ s- C- l' o
    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
& X2 S% T7 K" P    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;1 A& W1 ^9 L1 [6 Q* N6 i
    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;6 I) I$ `5 R, P% @
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
& k4 j0 o6 H, @/ p; n    hdma_usart2_tx.Init.Mode = DMA_NORMAL;
: F; a/ Y" P/ N, W8 W    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
1 ]* ^7 t3 ?3 R: n: f    HAL_DMA_Init(&hdma_usart2_tx);/ _% a. y4 T% b+ }6 a3 s
% o( {5 v8 {3 E  _. I6 E
    __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
' V/ G; F% f, J1 K* c
1 x6 d& {% O: Z* `# C5 O5 O  }
8 f: k# D* m) U}
  z% L+ g0 S) x- N7 A8 F+ h7 B
) P& e0 g' S& g# evoid HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
- c) }% d5 x8 V4 z{6 {$ B+ ^3 K' B3 r* t
) W6 J# a0 m8 I  c' a& d9 A
  if(huart->Instance==USART2)
, Y' [/ m9 ~1 A4 Z) x  {( d' @% P3 P  w2 h
    /* Peripheral clock disable */; ~1 }. V" f1 W* j+ w) v" V) G
    __USART2_CLK_DISABLE();. ]/ h) M# J1 i. l; O( j8 J$ A
  ) k4 \# A% J# X$ Y2 |9 S4 i" e
    /**USART2 GPIO Configuration   ) M! D$ A( F- p' R* M9 s. |
    PA2     ------> USART2_TX
' `9 @- M) r9 c1 q7 b  l    PA3     ------> USART2_RX" G2 Z) Y) o* }$ J9 d
    */
% u; \; T0 N0 ~+ j# i    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);- }( @/ v  w, C1 B% I1 B

% r0 ]/ r" @* z% }, N% i    /* Peripheral DMA DeInit*/7 ~( v5 A! U8 ^/ p$ ]9 u/ r
    HAL_DMA_DeInit(huart->hdmarx);, |, R1 y& B) S. j* s7 p
    HAL_DMA_DeInit(huart->hdmatx);
6 F* h6 d& V6 T0 Q8 p  }$ S- J; ^! E3 x( d# n, @
}5 @2 m& C. G/ [# d& o. l% M- }
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------/ q' z8 o2 e7 \4 h
mpu6050.c
+ q0 o9 ^( q, D3 M#include "stm32l0xx_hal.h". e1 U/ P- l) i
#include "MPU6050.h"
: \% `- X; O$ T" Z2 _
- U7 w/ B% J; l: U7 _+ I0 d//各坐标轴上静止偏差(重力,角速度)
9 u# y' b! z) z9 Q: X& r% |1 Bint16_t offsetAccelX = -195;
8 d: ^0 {: O/ C% Zint16_t offsetAccelY = 560;5 c: L: y' D9 A7 ^' T
int16_t offsetAccelZ = -169;7 F4 k0 Q0 ?9 {( _9 l/ Y5 D5 j
* ?; U& U- S* l, ^5 P5 K% T" ]
int16_t offsetGyroX = 12;
/ w- E0 c2 x; e/ Lint16_t offsetGyroY = 33;( u: K* O/ q8 ~" ]) e2 R
int16_t offsetGyroZ = 4;
$ {' I4 _! D1 k6 ~
1 @+ y* \2 H$ z( [) Kextern I2C_HandleTypeDef hi2cx;
! u+ q# I9 {% G/ I' A0 m
9 X" v+ n( h# _) R! Y//**************************************6 [* w) w' }/ o4 H# a& N. f4 c7 L
//向I2C设备写入一个字节数据
- S. b: J$ t# f* d- _4 c3 g$ y( }//**************************************" n. Z8 N! X( U1 S- h8 I
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
1 x! ^, E. N" e3 W5 s8 G0 ]{3 F/ ^) j$ W0 o; H: F$ {* V4 s2 t
    uint8_t rxData[2] = {REG_Address,REG_data};
* A+ B$ j4 c% {/ I) {" \    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)
! D0 ]9 f: ~* F. s) {7 m    {
1 x% N' P# n& C! S3 g, P0 K        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)% x8 A/ N' E/ D& [
        {}& T$ z) ~' c6 f
    }  ?9 K4 n  S0 w: a$ w: y
}; \! y8 C5 N8 T; ~- o, b
//**************************************0 Q& c; k+ I, B
//从I2C设备读取一个字节数据6 |$ g4 X2 b+ q. }& a2 Z+ _
//**************************************
7 z9 @5 f6 @/ h( h8 G  D2 muint8_t Single_ReadI2C(uint8_t REG_Address)6 V+ j+ H6 b4 Q, ]& V
{2 F8 o4 J, K) y7 l0 y
    uint8_t REG_data;
: A4 G! ]( Q% Q; k. g* e    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)2 e, u" y! p% p1 f
    {% S% }4 h) t+ a+ C0 f( B
        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)- k" V3 R+ k5 _* g' J2 g
        {}- G) p! D1 Q' q/ j' G8 Y+ \% _" t
    }6 U. ?; H  v) F9 R' O+ E
   - x. ]5 ^0 M1 e' ~" B
    if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)* ^7 a0 l# T1 ^) C( L4 ]6 H) N
    {
  r' o( I' H$ B0 O8 v; f7 ?7 e2 N        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF): I3 H! @" W) _% G
        {}
0 F5 [4 w2 o  y2 w0 J! }    }+ R) F; O7 M6 y( o& C- x: N
    return REG_data;- o8 ]- ^' v. u- M* h
}/ y- g% C, Q. U7 a* d. U3 j( Y
//**************************************4 Q- W7 m. H! ?1 I! X
//初始化MPU60502 \" \0 P. c  L- e8 ~
//**************************************
+ Q! q- k6 R0 U9 N/ V3 V6 Yvoid InitMPU6050()
& N$ E; ^0 F! H2 F{0 F! V3 n* N+ j3 C: x
    Single_WriteI2C(PWR_MGMT_1, 0x00);    //解除休眠状态1 m; @; z+ S" |  ^) F

( |* K5 m7 Q- d1 {, v3 q    Single_WriteI2C(SMPLRT_DIV, 0x07);3 B) ?: S" U/ N* B: x

& }  `, w- T5 Q5 ?9 w& R" {" B; H    Single_WriteI2C(CONFIG, 0x06);0 o( G1 G0 `, P) h+ U2 O
6 b) P" \& Y- `* _- B' z3 ]
    Single_WriteI2C(GYRO_CONFIG, 0x18);
8 ?$ F3 \8 b6 [/ ^# [* L4 I$ Y. h! m; n  r7 B6 B: k
    Single_WriteI2C(ACCEL_CONFIG, 0x01);# g3 F4 L2 B& G$ s+ w1 m
}
$ R( f* Z) G/ F) W% c# w/ b9 T//**************************************' C( F9 C( L" w
//合成数据& ^7 m( Z% J0 A; I
//**************************************3 k( p" g3 h" q, v7 p% |- y
int16_t GetMPUOutValue(uint8_t REG_Address)
* V3 `9 \3 B" {{
0 g$ ~' k+ b' o  F# |- {1 r    int16_t result;% ~- r0 F% l9 Z4 Q3 l
    uint8_t H,L;* O1 y  \4 ]* m+ }. ]
    H=Single_ReadI2C(REG_Address);
9 e% [* [  e% q! V2 ~5 N    L=Single_ReadI2C(REG_Address+1);
% B3 w" i% O) r% S    result = (H<<8)+L;
; O, ^: R4 o$ l6 S4 h    return result;   //合成数据/ u1 {- W- w4 [1 L, C, q% T  ]2 e
}" M3 M" A7 a- [( E0 D: p
( z' O/ X5 D1 B+ i6 q- P, ]  ~
//**************************************: h* X9 F2 X* B
//取某一轴上的加速度数据3 a* ~8 [- g  H, R2 N( `' Z5 f3 y
//*************************************** r, r- r  s, z/ X! b7 M* u
int16_t GetAccelValue(char axis)
) i" l' C) j- ~{
% n2 `/ \- I1 j. E% r& R2 }    int16_t result = 0;
4 V& f9 L( E4 D' X    switch(axis)4 D2 x4 ~9 c1 M/ g- u! L% |( I* p
    {
, }3 J' f& t* Q- g4 R! Y, Y+ b        case 'x':
% e  U4 ^" S2 g2 D6 y1 [        case 'X':
: Q; V% S5 v" L" b- T* i0 V        {7 f" F, C7 @: k* O. I5 F& k5 S
            result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;: x3 E# s: l: S( h; d. t
        }
% @" m; _! _0 [0 b5 q        break;
( D" F, ~4 z- Q. J( J0 h        case 'y':
1 a. p+ J* ~2 @) {5 @! r" }3 L        case 'Y':
5 I! H; p$ r. U! o: K8 r        {
6 t3 e6 B& v/ ^            result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;5 B4 e9 B( X+ V' v! C4 g$ ^
        }$ i/ u  `/ b+ M. i+ ~
        break;
7 M: A) l; N8 Q; ^! y( R( t+ i        case 'z':
2 b' g/ y' I) }2 q, L9 G        case 'Z':
  @  h. W5 q! ~  d( c        {/ N2 u+ P. u9 T( L! {7 B
            result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;
3 _+ r! H0 j( P% d        }5 h3 G) r5 r. b. V
        break;# M. A1 t/ ^& o8 r) Q" F
    }) j# K4 G9 h# `; z- H
    return result;) g% M* _  y  o1 I
}) ?% a% }/ I' X7 s0 Z. A
( ~  [2 g) d  O1 ^0 j
//**************************************# y1 W5 b$ L0 B' h( \
//取某一轴上的角速度数据. G4 d# h! @5 s* g3 v
//**************************************- ]0 R" w" g/ s: f# T
int16_t GetGyroValue(char axis)
. b0 e) t5 h) I{
& n6 M9 X7 k  Z- Z6 o' U2 G    int16_t result = 0;2 h, X& E+ M. {% e* w! B: m
    switch(axis)
0 [1 @2 Y# N  n) u% ]    {
6 }. E! C. U- e9 Q% r9 l        case 'x':' _1 z* D1 l  M2 X7 I# a
        case 'X':
- {% d: V9 X$ X# `        {- T, [& S! T# e8 E$ }
            result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;) ?/ y) T6 V6 I& S" t$ {
        }' v! H5 N- F2 s7 `0 J2 l2 Y
        break;
( g* D9 j0 I" X) U8 w, l* l        case 'y':
4 }6 ]* q' }: M3 S9 x1 p/ K, g        case 'Y':  k4 g' K9 S* |" {. H0 J
        {
% t2 C* X1 r# G: U6 W, q6 ?            result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;* V2 P! z& ]5 l- C2 a
        }$ q& V$ z! Q# Z, M
        break;
3 w6 ~- G6 Q. y# e2 }3 z        case 'z':+ L1 ?; c2 I2 n: r( V# N
        case 'Z':
  {+ A* S) O$ H$ b, H8 u        {
3 Q. |6 R# i0 j, ~            result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;" J& L% H  U0 {) F: n7 I1 S
        }' f% D2 {2 `) ^
        break;
8 H# w/ g' B. b$ L( I; P% v$ n    }8 @& r; y1 o9 ^1 f9 m
    return result;
, n0 g) W/ q, r+ b}

评分

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

查看全部评分

党国特派员 回答时间:2015-1-6 13:21:49
int main(void)
' l; G1 l& C! k{4 [4 }8 v, h' z3 f
3 C5 _( R5 @  A. e9 C$ ^
  /* USER CODE BEGIN 1 */
  R- h8 {9 d. H3 _/ o) N$ }  Y# G7 Z; k' X/ _
  /* USER CODE END 1 */" N3 `1 |9 Z' O8 Y8 o( B/ U2 d
3 j! l% d2 d1 I
  /* MCU Configuration----------------------------------------------------------*/1 @3 V' w7 [$ {# }
8 ~5 H5 q- V- W9 s1 b4 z$ o
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
" [! x& H# R0 G  HAL_Init();3 Q0 o% u' G7 D7 l$ V& `
! M* q2 R$ [' E# t' V% v8 K$ w5 W: K
  /* Configure the system clock */
: k  l% U7 b; V2 L) v! k  SystemClock_Config();, _, G2 x8 A0 o* f

  v$ k" x  w/ Z$ v2 b0 z, M! z( P  /* System interrupt init*/
) t8 l  Z3 p. _; h. H2 R2 M% ^, d4 i& r  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
) v1 y4 o. G5 o2 P1 x( w! S0 f( F$ n! t3 ^3 l" Q, c
  /* Initialize all configured peripherals */
( D# Q; k0 y5 {9 _  k) ?+ |' B  MX_GPIO_Init();' A; A; F6 J- h2 Z/ c1 s4 Y
  MX_DMA_Init();
: _, I  [" G, W% D7 U9 ?4 ~0 f    MX_I2C1_Init();! Z7 K4 e9 _8 r' V8 ^* H; e7 M
    MX_TIM2_Init();
, i, _" J. C& ^, ~8 f  MX_USART2_UART_Init();' z- I" I  i$ I1 Y( t: z8 H
    InitMPU6050();
; I: _: g! i, K6 t  F' a. n3 S3 p+ ^1 ?
  /* USER CODE BEGIN 2 */
9 y3 p6 p9 Y3 u" y2 C7 Y    HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
# ]1 _4 P2 N) J3 [6 O) m: N- D# m$ [* `    HAL_TIM_Base_Start_IT(&htim2);( G% D0 B# u, a0 L
  /* USER CODE END 2 */
9 m5 p) `9 X9 p2 b$ F$ P' ^+ T7 `( h, F, B' w4 v7 F! ^* U! E/ d" ~
  /* USER CODE BEGIN 3 */
! ~9 C- H$ B3 b1 I  /* Infinite loop */7 x# ]& J. h) y. P& S4 ?9 x
  while (1)
# a4 Q$ ~; P/ T2 m$ J  {, c" f  T4 W: W
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);; m. G- X3 q8 H+ ^. K7 V7 l( y
        VisualScopeAngleOutput();
' \1 p, j+ m: \5 k9 @) D" A# m        HAL_Delay(100);
7 \% k8 o7 d; A$ r+ E* t8 z  }
# e3 L& j, C" W# z, l  /* USER CODE END 3 */# u: [$ B7 P' }; y  g

; y# S) w: a' K9 w9 l}
9 X1 @" y- T7 _5 s( F/ \% N! e; b4 ~  U2 C) r- h% I4 p. n
/** System Clock Configuration
, h. }8 [: D0 C; L" N$ d; P*/6 F# _6 }& W1 M# h8 t
void SystemClock_Config(void)
5 p' T' _" W" X" c1 i{' a0 k% \' C0 V2 `( S

" m5 R( c8 `! Q& ^/ _( x  RCC_ClkInitTypeDef RCC_ClkInitStruct;/ {' @6 N- o- A# i; s5 W. Q
  RCC_PeriphCLKInitTypeDef PeriphClkInit;9 U" Q( }! i8 x
  RCC_OscInitTypeDef RCC_OscInitStruct;
( R* q0 a0 m# |; p( D$ y" Q( T0 B0 V, v
  __PWR_CLK_ENABLE();* b8 M% ~9 X' }; ]( j! g1 z/ v
! R3 U* \3 o+ k- c% n2 a3 M, i
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
5 p; y; e4 o2 q: ~
3 z$ F8 ~3 [* N. O8 x) N2 I  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;% Q* X8 s" B& l# q. A) P3 b% I
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;+ s1 o, e% u# o
  RCC_OscInitStruct.HSICalibrationValue = 16;
  ]2 H& e- T7 m9 W% e7 z+ M5 h1 E  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
3 [8 f+ M$ e( d7 Y, j5 y: n) i( Z  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
& K- U. b  q! l9 R( |, S% }  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
2 U* _0 B8 n5 B* |! y  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
* J7 y- h( {4 T1 f  HAL_RCC_OscConfig(&RCC_OscInitStruct);
# x1 h; |3 F, D" m8 V: v2 _' M3 w+ P9 b
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;6 c0 A7 K6 M# l% O
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;. n+ i+ x8 ?% H6 @
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;. K, ]9 z, X" T
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
) s' s. S0 \8 N9 _0 \" ?  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
" h( v, ^3 T8 f& C; _& o  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
" D) R! I; [, p
) E% ^. Q( }) g( A  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
: E9 i) {; m+ N) ~  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
0 |$ M* f8 `) e% b  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
* q! O, {8 U: |4 y( q7 I  W) {" X) m0 p+ a1 P. t, l4 c
  __SYSCFG_CLK_ENABLE();
7 `8 m0 d+ N. H& S
+ q& G4 b" C: i8 h}; `3 D: V  J" }. u( D/ ^; I3 O& O
/ t1 R. c( O+ p3 k3 p4 l; Y) P1 i
/* USER CODE BEGIN 4 */9 Q7 ?) e$ m0 P' L8 g
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)! M0 D, S$ P0 f7 s6 L' ^& O
{( N  H  ^3 c- P  s; g
    if(huart->Instance == USART2)
9 F2 y! i3 \. {2 o$ O$ m    {
6 {" L# [( ~9 U3 y! T( n! f2 I        memcpy(txBuffer,rxBuffer,RXSIZE);) B( Z6 J1 V0 L* k# d+ i
        HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
9 G& t1 t3 U6 @- Q; K        HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
1 ^8 C6 L# g2 J: ^    }0 |7 M% [% E* t* u
}3 ]: r8 R% \6 M
5 r# z8 j; W- x! p4 |# _
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)( ^& _7 v. U1 u/ t. D( i: h
{
( `; R8 _1 }' C/ p   " _6 ?2 z& L3 _5 d' h! F8 i- Y
}
8 W  E  _) u$ K0 J7 Z* P
$ U, d( L( `5 ?/ A" D3 ^" i0 @) L( O" hvoid HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
6 W  E: a3 ]2 k* h  Z{5 D  _# F6 F) h2 j2 _
    int32_t GyroValue;1 [8 }8 x' q9 `. d3 N" |
   4 v+ L$ n: G$ X; q
    Calc_AngleAccel();  E. J3 h" I9 w3 M7 s# j% V% @
    GyroValue = Calc_AngleGyro();7 o; A1 a* T) }% S
    ComplementFilter(GyroValue);
% o! |" h9 e" r0 ~  l}
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
  J, {5 Y* D9 f4 ^9 |6 t9 N楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...

1 \4 n6 h" c$ \$ y  v, y使用DMA方式,接收发送数据必须是个固定长度。
党国特派员 回答时间:2015-2-17 09:21:31
星辰一方 发表于 2015-2-16 19:00
% b& u0 z& m; {4 g3 F. c楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...
2 V& _7 V' u* J' \3 v
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
我夏了夏天 回答时间: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:219 {% v. D  H! g+ l
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
$ i; Y0 v, l  T4 m# ]
好的,多谢指点!
rogerkun 回答时间:2015-4-3 22:08:29
楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?
0 e# n: L5 [3 h请问应该注意什么地方
nocoyou 回答时间:2015-4-4 09:12:05
顶顶顶顶
党国特派员 回答时间:2015-4-4 21:33:35
rogerkun 发表于 2015-4-3 22:08
+ H- B& E! z4 w& e0 N楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?
! E2 n% x: J9 o2 s5 |请问应该注意什么地 ...

1 H+ q* E( w( i我使用是没有问题的呀。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版