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

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

[复制链接]
党国特派员 发布时间:2015-1-6 13:21
拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:4 M% s2 q( f, A! t  B
-------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------
) c) E1 J2 Z/ n! h8 K* L' \main.c$ l8 W  z2 \) T8 F% m' J6 P
#include "stm32l0xx_hal.h"2 M( D9 I$ ?' E6 M. z* F# o
#include "dma.h", S7 J' U; Y- Q4 q; v
#include "i2c.h", g4 G! `3 |0 h4 T, k0 s1 s3 f
#include "tim.h"
6 ^$ H0 y& _$ T* X4 `#include "usart.h"$ {; e/ n! Q3 i0 u5 L; q
#include "gpio.h"
" X$ g7 a7 }* n6 ]6 c#include "mpu6050.h"
/ D8 |1 Y; x! D1 O0 H" F# T#include "visualscope.h"4 r2 _( s+ e3 N4 s6 p. {3 G* x

0 t6 y1 f/ z) b#include <string.h>
) z% V8 W$ I" p! [5 ^4 o* N#include <math.h>
1 v* j. j: }# q' e4 W
6 U5 ~3 W8 v' S6 H7 E# [; N5 a, E8 l/* Private variables ---------------------------------------------------------*/. L9 m4 q7 u) R3 M- m' [' e- E4 i
#define RXSIZE 8
4 l' `$ a5 P, P! p% h- K#define TXSIZE 8
* B9 a! F( v# Z/ M0 L: ~- y' b! xuint8_t rxBuffer[RXSIZE];  y( I6 p: C" v2 i, x( X* S
uint8_t txBuffer[TXSIZE];; c4 g6 I5 S5 T* s+ I
& O) j1 B# _+ P* Q/ g: B3 o6 Z4 R
float Angle_accel = 0;
: {# I! ?# W& S8 D& Sfloat Angle_gyro = 0;
$ O& H9 p4 D# m+ h; j2 ^  Q' A7 kfloat Angle_comp = 0;
: a( b- _! t% c( E( P) k8 Cuint8_t outAngleData[10];
/ a% z% y+ k. _3 [/* USER CODE BEGIN 0 */
1 A8 i5 f0 P, I3 N, {  a1 F
( \, P1 b& \) }/*---------------------------------------------------------------------------------------------------------*/3 Q" _9 M6 L: b+ i! r
/*  重力加速度算出的角度                                                                                       */
0 \3 [1 r) O7 K& m/*---------------------------------------------------------------------------------------------------------*/
9 l4 Q# Q- {5 q; g( |" o, oint32_t Calc_AngleAccel()
1 _  {# n' L7 P. G4 _5 i{6 c4 I8 {5 s( _" f, X
    int32_t value = 0;
" ^5 T2 o  p$ l% B    * Z5 y+ O( z. S) ^: y  V3 r
    value = GetAccelValue('x');3 N0 t' E8 x, x3 _4 C+ V. L
    if(value > 16384)
4 Q* B) w+ S- `        Angle_accel = -(asin(1) * 180 / 3.1415296);. u6 D) M% h" c1 m4 a/ y: M
    else4 O. a2 q! o; @9 v& a! @
        Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);
" i+ Y6 L* C5 ~' z. ^: p' p    ; W6 E) u3 h7 I* \5 b
    return value;# W  r1 _+ R# U, F, D5 w& Q0 s5 X
}
0 r) M4 H8 x' K6 r6 J8 e. m: b  a/ J) W& P; a* ?3 i+ c
/*---------------------------------------------------------------------------------------------------------*/
+ d) \; Q' s9 q/*   角速度算出来的角度(积分)                                                                                     */0 V0 e% o4 Z5 K1 V6 Y
/*---------------------------------------------------------------------------------------------------------*/. C# c% [' e0 C% ^3 p# ?1 S6 F
int32_t Calc_AngleGyro()8 U. [  G# E* h& W3 c
{
# }4 R8 p  x( D: \$ G    int32_t value = 0;2 F! D% n0 w5 p  Z- ]

0 D+ ]/ a5 E' ~1 p    value = GetGyroValue('y');
" N) a+ O. @0 l( g    Angle_gyro += (value / 16.384 * 0.01);2 C0 _4 r% s( F2 r7 Y; l* M- V
   
0 R& n+ V& M  c0 T    return value;2 M9 F+ v( \5 P7 X& f: ^
}
3 C% a( a: o7 b8 Q
5 y- w! `+ Y! o. S* c$ ?) s/*---------------------------------------------------------------------------------------------------------*/
. B+ j: e7 @2 t" o4 e/*   互补滤波求角度                                                                                     */7 K* ?. u) H  Z1 f  y2 H
/*---------------------------------------------------------------------------------------------------------*/
! |: ]& O6 r4 X3 j: M: R( Yfloat ComplementFilter(int32_t simpleGyro)
, Y7 i5 O/ W8 w3 G: q0 a2 Q5 j6 Y{, q( B+ p) i& X3 m3 E! }3 ?
    Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel;8 t; b9 n6 s1 ~$ c* F+ e
   
  c* B3 i; w' W    return Angle_comp;2 {! @2 O1 W( `& X0 ^/ {6 I. ^, o) D
}
0 [" ^/ Z2 l) F0 G8 q+ n: `. R+ e4 }6 K
/*---------------------------------------------------------------------------------------------------------*/
, ^' b  T! o( [- m1 H# b5 [/*   输出角度至上位机                                                                                     */% e" D8 M- [& E6 p( f1 B" w& h
/*---------------------------------------------------------------------------------------------------------*/
0 F- g  b8 @, C8 `0 L# avoid VisualScopeAngleOutput()# z( D( w& [; f! {8 \; |
{5 p6 Q/ b, Y% y) X" b
    int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;4 I: D3 e" F3 x) S
    uint16_t crcValue;
9 P6 j& H1 T6 E( p# t   
. p  Y# d# c( E% @9 u' W    AngleValue_Accel = ceil(Angle_accel * 10 -0.5);
$ [# i$ \  |' c; O' r2 ^4 B    AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);$ P: R5 J1 M1 k
    AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);
2 R9 b5 g, e6 ]    / I, u- |0 C; i/ o; }6 `1 X
    outAngleData[0] = AngleValue_Accel & 0xFF;. h4 ?/ h4 |4 d6 V; V9 T1 h( D. `
    outAngleData[1] = AngleValue_Accel >> 8;/ m2 q8 Q5 E- U' U5 e
    outAngleData[2] = AngleValue_Gyro & 0xFF;1 G9 t/ k' Z1 i! M
    outAngleData[3] = AngleValue_Gyro >> 8;' D; |" E* P6 L# Q  E# r- _
    outAngleData[4] = AngleValue_Comp & 0xFF;' g3 V; J5 |; N3 k8 h
    outAngleData[5] = AngleValue_Comp >> 8;
. H0 y' @( D  B! J    //计算CRC: X, {) Q' N* P9 Q, ^
    crcValue =  CRC_CHECK(outAngleData,8);
8 |& |. Q2 p* I3 f% H    outAngleData[8] = crcValue & 0xFF;" x& r5 _7 t% B: t
    outAngleData[9] = crcValue >> 8;6 ]# v& \2 r, _& V: F4 a6 P1 C
    //发送至上位机( x! Y' }8 Z1 J1 E& i: {' ?3 V% z
    HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));
' h' D% a% L7 T& X6 N}% x7 [6 I2 T( r5 M3 ]! y/ H# O0 ]2 ?( x+ Q
/* USER CODE END 0 */
" n6 s( S' d4 y0 ]6 I$ L* A' T
: s0 l; H" M; U/ k/* Private function prototypes -----------------------------------------------*// [7 \, ~, D, C# ~* S/ I: _0 S, r
void SystemClock_Config(void);
3 `3 h( q- L- V7 B/ X8 G8 v4 L3 X- T) f- M$ G' ^

6 m7 F( A" Z; s; J9 I7 N硬件连接图:
  \0 H5 e; W& c8 X7 L( A 1.jpg + v' \1 E1 _5 c9 x7 G8 Y( f
波形图:
3 |9 T. O& {4 P) y+ C$ {- Z! U3 D 2.jpg + H% d1 t8 p, _$ H1 q8 S% P" a
最后加一个视频:
# M  p6 ^8 g% v1 G5 s. N# lSTM32L053 演示3 ]8 X* D( X. c- C/ x2 s) j
1 收藏 17 评论75 发布时间:2015-1-6 13:21

举报

75个回答
党国特派员 回答时间:2015-1-6 13:22:04
I2C.C1 s" \# v) C, `) o( [
#include "i2c.h") e6 w. c; L& `) ]4 {7 [

% Q* B3 Q& v" Q% C$ g#include "gpio.h") D9 Z# w; g1 B6 g, g
, Z( S3 w# U  k
/* USER CODE BEGIN 0 */: {4 _. V5 m4 `! e4 R3 `& j  i/ {
/ e8 b' {1 M# l) z8 ~1 [
/* USER CODE END 0 */" i* u1 s' B1 k7 F5 _& i& r

4 X& Y1 b0 v7 F5 |0 e9 x* j# u: P% Q2 zI2C_HandleTypeDef hi2cx;  J8 g' A. s  N  M& i
2 `# `/ v+ s1 }* b/ n; u
/* I2C1 init function */8 N' B. A/ V* ]! C! y8 v
void MX_I2C1_Init(void)
) Y  X0 A8 n) g7 l: d{5 i8 i% V. F* p, C& L

7 ^) i. k. I; j* w- y  S% _$ ^  hi2cx.Instance = I2C1;- ?% A0 v& }" w8 ]) W: f' K! r, N
  hi2cx.Init.Timing = 0x20D22930;) `! i1 }5 q% @) C3 A
  hi2cx.Init.OwnAddress1 = 0;1 s9 a# D) l5 d# j# c
  hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;" t& b2 `+ D) r$ J  |7 d
  hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;& @6 ?& c3 X; l0 ?. R1 y
  hi2cx.Init.OwnAddress2 = 0;
: G# ~0 ^3 H+ U" B0 ~: H  hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
9 ^1 y% Z( `1 K# N  hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;4 v1 u& W% ]. o$ h/ }1 L6 @" O8 \0 r
  hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;' C, P5 J; Z5 X' i0 L
  HAL_I2C_Init(&hi2cx);
/ V! y7 q0 p) F% g( {  O- U
% }$ C3 q0 `! B6 V& c' `# G4 E- }    /**Configure Analogue filter6 k; \% q* |6 t! o- O( [
    */
' ~5 j* O$ ?: M  HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);, o7 H/ I# U, r5 U+ i
3 _$ b* `, D+ S; w) G
}
& `" k& d5 i, S, l$ z8 i6 P1 E# N# k% y) q0 L
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
. |% E" c( X' Q% [& C{
+ h* p% K/ @1 r/ @7 @, c* q  M
( `: w+ p" K( k0 W( V, X  GPIO_InitTypeDef GPIO_InitStruct;
9 e. z9 d4 ~" |7 l/ y  if(hi2c->Instance==I2C1)8 f9 r/ w/ o6 m% R+ Z$ m$ a5 T
  {
+ k5 T1 c0 l" j3 @4 j. T6 V/ F$ B    /* Peripheral clock enable */, y# E" o. \* j1 z
    __I2C1_CLK_ENABLE();
' N6 f) w. Y9 w& @8 ]8 w$ ?. {  1 c) G5 z& z, n8 u+ v
    /**I2C1 GPIO Configuration   
! O0 G1 T- r9 F6 w( C$ t    PB6     ------> I2C1_SCL) m7 a  Z3 S* @9 D+ b0 M4 U2 M
    PB7     ------> I2C1_SDA, b$ l  |; C2 w9 I* B3 N
    */* h( V# W: G2 K1 a. A9 v
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
7 u9 N0 U; D& e: ^# b    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
% b8 V$ S% f  |4 k0 y" ~    GPIO_InitStruct.Pull = GPIO_NOPULL;" _4 @' R  j. [
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;7 w6 w8 P, o) e4 Q/ P4 F
    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
( `7 O7 v- q+ e, }    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);; w' |. c! [4 ]- j1 ~( o% N

3 `2 ^4 I8 L6 R+ r  }
) i7 L' ?8 g- u* J8 l}
! q# k( T7 D, j3 R0 |+ n3 _$ c9 i5 J' d) H4 O7 e
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
8 `8 P$ |0 n  J) ~4 Z8 ?( @. A0 L{
& B1 [1 @" }' A  S2 c
1 V& C, a. R( ?  if(hi2c->Instance==I2C1), i4 D: n* `3 B3 N! J: |
  {. A" x+ }8 c# l/ M( ^( C6 i2 X; M
    /* Peripheral clock disable */
+ _8 ^, A5 G: c    __I2C1_CLK_DISABLE();
( S- }( _* g) j9 V5 c/ }* G. w  + L5 A# l& [" n; Y$ Q
    /**I2C1 GPIO Configuration   $ i6 e9 D+ G( i& S
    PB6     ------> I2C1_SCL$ X) F% ?3 q+ l7 y5 V. Z
    PB7     ------> I2C1_SDA
4 C( Z& P2 V- w* ^' P9 n8 S) K    */: \5 z- {) A$ Y9 }  F5 O; [+ l# N
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
( U8 ~5 d  P6 ?; L( \* J
9 [9 U1 i/ J2 W8 o% k  }- `; h" v( X! w9 b  r
}& w) s2 @' e) q: q2 t' ^4 X
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------. |6 L0 t; L" y7 z* _# X$ ~
usart.c
) S$ o' G* G6 `7 t+ A* L#include "usart.h"
9 e0 _6 p& U- b, O% _
/ N: T5 f6 G+ O- p* T0 x#include "gpio.h"
- V6 s/ T. n" I( |7 G) u4 r#include "dma.h"1 d$ J# C8 \( T1 I+ C4 z* h
4 y3 @  A+ @; `# D/ j7 i: D0 k' ]
/* USER CODE BEGIN 0 */
/ S! \) J' k+ Y: O: c" h0 n3 n7 L1 Y7 E/ V' ~+ Y
/* USER CODE END 0 */
: v# A" a+ x: U6 c  b; J: }
6 }- y+ J0 r9 `$ }  RUART_HandleTypeDef huart2;
8 i0 W6 a. U" T* f+ ?5 s5 e9 RDMA_HandleTypeDef hdma_usart2_rx;# r0 K. m/ O  O- @
DMA_HandleTypeDef hdma_usart2_tx;
, L2 [/ Q& Y4 l1 p* c: v
& U1 M- q" o8 r  S/* USART2 init function */! \0 D* z0 s" p' O5 K3 |4 D3 S

8 \* p9 U' d2 K# d& Kvoid MX_USART2_UART_Init(void)
) f& G: a, G) j: _# v{
3 ], V+ m* o5 x8 `. m# \9 {1 A0 z: |9 q( ], b
  huart2.Instance = USART2;5 z4 e) t, `$ l# k' ]4 D
  huart2.Init.BaudRate = 9600;" F# A/ j" W; m% }
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
# h! y) H, m+ v+ D  huart2.Init.StopBits = UART_STOPBITS_1;. @5 [0 v  B8 _0 e% c
  huart2.Init.Parity = UART_PARITY_NONE;
9 q6 ?8 Z4 j6 W$ d0 i2 W  huart2.Init.Mode = UART_MODE_TX_RX;
3 z6 O4 [& A! ^  x: M' r! S) i0 p) H  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;; y$ p7 \, t1 V
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
- Z0 K2 m" S! d' C$ z+ |2 i+ s  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
( o# j/ X% z: }, l# Z  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;; z) c& E" Q! x; `4 p6 I
  HAL_UART_Init(&huart2);
# u4 z; f5 J! y* m; F2 d: o2 B
- U; w4 o# x7 y, n; z6 h! s}  f. L3 i& [) Z- T+ B% v

  @" l- S3 w: O' ?( Dvoid HAL_UART_MspInit(UART_HandleTypeDef* huart)4 w* g2 e9 @3 F# T
{
; r1 {1 G/ G+ M9 c  C
+ u( @% R3 t# _  X1 U; \5 N  GPIO_InitTypeDef GPIO_InitStruct;* X4 f- \: M9 B
  if(huart->Instance==USART2)
. E+ C+ t! A% f# Q0 U8 m9 s  {5 F3 K2 `  P6 g: A7 A8 E# i
    /* Peripheral clock enable */
. h+ f) Z$ v3 z, s    __USART2_CLK_ENABLE();' i0 m( U4 m0 P
  
" S$ Z; b. V0 E+ e$ i* h    /**USART2 GPIO Configuration   # _% B! q, q$ x, _5 K4 x$ t! y
    PA2     ------> USART2_TX
( l# h) F$ Y6 p* Y) R. _( k" u    PA3     ------> USART2_RX
, w1 B( v4 W% X, N" Y9 G1 S    */
2 U3 o3 d6 q8 f  X" e    GPIO_InitStruct.Pin = GPIO_PIN_2;
! h" ?2 }$ F' g( ]- k    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
8 S$ {' t! d6 Q( ^  F    GPIO_InitStruct.Pull = GPIO_NOPULL;
: E  {& z; N* N" b  s. k+ H    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;' b# Q' s+ b& _& x* e* N/ ^$ `6 f
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;. G7 y9 W8 D4 J% F9 Q
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);& f/ X! p; q4 t) ~' ~9 w

0 P- I) Z9 W5 m1 w, t# ^4 ~    GPIO_InitStruct.Pin = GPIO_PIN_3;
1 X  c% F6 x7 N/ r# X* @, D    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;5 m  R8 y& R, ]( E
    GPIO_InitStruct.Pull = GPIO_NOPULL;
" M+ c( v" v7 w0 ^    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;3 `4 p" _8 `7 N8 k8 }: M
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;! G, I. i6 W, i
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);6 \% s( v8 V) @) `& w) x

( @/ u4 o* _9 @7 g8 R5 C" G/ `: C    /* Peripheral DMA init*/3 I% Y6 r3 i) ]2 ]* n
  
2 ~, j' ]+ I& L8 X5 T$ i1 b    hdma_usart2_rx.Instance = DMA1_Channel5;5 g- L! w. I3 M  Y' k% O5 [$ {8 ~
    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;5 _2 z& ^$ f7 D! o
    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;% f* |0 r7 u# D
    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
0 G' q. {  A" M  F2 L$ t    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
0 c' [. h; f$ N. `; w' O  K% O& p    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
/ w5 S2 a8 G$ r" {& I: C" V6 _" f- t    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;5 y, _. w3 a4 W+ d6 ?9 L# Z
    hdma_usart2_rx.Init.Mode = DMA_NORMAL;' H. R. Q* j+ V$ l+ Z* E/ i7 A
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;- B  J! W8 `, C$ u9 n/ ]
    HAL_DMA_Init(&hdma_usart2_rx);
6 P( c: k2 i7 w- w
5 x  y7 c* z1 ^' s9 M5 C( Z    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);& X0 v& e8 m9 F. U4 l* `0 z& \9 {6 ~+ H
2 }  Q0 r. V8 P3 d9 U' U* t
    hdma_usart2_tx.Instance = DMA1_Channel4;/ b9 i: h6 u! K, @2 M
    hdma_usart2_tx.Init.Request = DMA_REQUEST_4;
8 V+ O* L( K5 c. m$ \! n    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
; s9 R, _- k. |& Q5 X0 F    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
3 ]( d# l) X) }& {0 ^  e5 k# {& w    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;" _" ]& f7 G* S' m& y1 f$ _; F
    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;( J4 t; J- E( @( Z+ G1 ~
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
/ E9 C; M  ]. j, d0 t2 Z+ @+ Q    hdma_usart2_tx.Init.Mode = DMA_NORMAL;& g" u! r& t8 K6 a2 @$ Y4 o
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
; m. g) R3 N+ q& `9 N3 N    HAL_DMA_Init(&hdma_usart2_tx);" _6 Z7 r6 {  j8 ^5 D) j
! Q- n9 Z7 A$ n2 f) {6 Y+ ^! O
    __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
& H  ~  n4 k, x0 V- W0 s: B& |  z- D0 [$ K0 J( J
  }" ^2 O$ f2 W1 k3 ^
}. z: t3 L: X  S7 N- N; X! V

0 D/ b2 y% E, b3 z% ^% jvoid HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
! c* c% ~( U% ]* h{% z" |: M7 T! k& w+ b# u1 j+ f

# ^) C7 |% y2 [' _9 n  if(huart->Instance==USART2)$ j5 v( ^& M7 d! L  o0 n% K, \
  {
% M8 S" R; J2 a: t0 k    /* Peripheral clock disable */) B* C; q6 u' Z
    __USART2_CLK_DISABLE();( Q' c% ]' V+ R1 P8 M0 \( A# W# g+ Q% @  O
    J0 @6 }2 w, b- C( Y7 z/ F
    /**USART2 GPIO Configuration   
5 N/ R: @* ]) e$ v$ H  c& _4 Q  h  [    PA2     ------> USART2_TX
9 b5 M$ m7 t' |1 E! Z1 J& l    PA3     ------> USART2_RX
& Q" L& t$ j% P    */
/ a3 l! U' V2 M* i2 H    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);# b- k2 x: G" d% M

# [9 S, p% @& e$ r6 h    /* Peripheral DMA DeInit*// U! U0 n' s; P! R+ I9 ]
    HAL_DMA_DeInit(huart->hdmarx);5 ~) G/ `( a- }4 _
    HAL_DMA_DeInit(huart->hdmatx);3 M0 F" H) ?, Q4 l
  }' p3 E0 `8 p0 L& D" q8 Q
}2 e/ n* h2 t, w) B" q3 M
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------0 h! V* ]1 m; W8 K1 T" E
mpu6050.c
9 }- V( p. @9 G* X#include "stm32l0xx_hal.h"/ U; Q  z9 y9 c+ q  S3 d
#include "MPU6050.h"
/ V5 @( n6 R! e0 z1 v
, {, I; K, Z3 K3 C5 ^  W//各坐标轴上静止偏差(重力,角速度)3 [, p+ g2 N) s" _5 u
int16_t offsetAccelX = -195;
6 J" [4 }4 P2 Lint16_t offsetAccelY = 560;
5 W$ l! }0 P( o# jint16_t offsetAccelZ = -169;8 g; J1 v2 L7 w. C* x5 c$ r

1 w3 ]) A" U+ ^; U9 Gint16_t offsetGyroX = 12;& t+ B) W3 V8 v0 |  `
int16_t offsetGyroY = 33;% O5 [4 R, N# c. {2 o' _# j+ C
int16_t offsetGyroZ = 4;
, }8 w( G1 a/ ?& ?, ?; E9 a6 k0 ^' G2 r% A" i6 X' |
extern I2C_HandleTypeDef hi2cx;
1 I& Y; B: H: e# v/ w4 D- |: V& v) t1 x. |
//**************************************5 L. [6 R) P8 c3 ~- u% K
//向I2C设备写入一个字节数据3 E* V( g- y! E, W" r2 l# p
//**************************************
: ~% |5 N( R9 a  |void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
2 i/ H2 l# E) B  {  a8 C5 I. q1 k$ Z9 V# W{
) P0 p% s# Y( h$ N    uint8_t rxData[2] = {REG_Address,REG_data};: K" y) f4 B1 t
    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)2 t: ^2 H" u  l' B
    {5 C4 @% P7 [& {$ c: w/ }
        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
% j$ R* H. R. [0 d        {}! M# `: x1 G! v0 r) h& s
    }
4 d9 W& B4 U' M2 z2 p3 x7 d}- \. }7 p  E  _" @1 U5 u
//**************************************
9 }4 W0 T. G5 _2 U- d//从I2C设备读取一个字节数据9 Z" R! k# L6 u" }
//**************************************
  Y* y" ]  v5 i2 J: B7 O6 zuint8_t Single_ReadI2C(uint8_t REG_Address)
4 s' U: }& p4 _$ i{
5 W( w9 X# I9 G* j1 v, z/ h    uint8_t REG_data;
9 k: {" k  ]! p/ Z; I0 `8 U    while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK): b9 b$ l, p( K& J- W# C9 i9 ~
    {
" @! l* }9 W( T9 ]        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
6 D' s3 y/ ^, u        {}, i; g* }* ?# M* Y9 l
    }
! C) D+ W, Z) ^8 e: Q# [; S  E4 X   " \8 f" j, e1 q. G
    if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)
2 w# ]- m# a6 R" |# j    {+ L; U' s8 v5 T# n- }. K) D0 i
        if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
7 C3 O# o" w2 Z$ {  r$ [; L$ }        {}
3 g9 u$ V$ H) R% {& @    }
; F& E5 q; b9 E$ w    return REG_data;
; C3 t3 [, D5 c4 ]- a0 |7 O}% w; g/ T5 Z+ D
//**************************************
5 ^# ]; C8 y) v$ C& |) c+ M0 g2 @; u* R//初始化MPU6050
& `5 h6 w) R, b3 |% Y5 j: c//**************************************
3 V$ ^% P4 m' K2 \7 q6 i. lvoid InitMPU6050()
2 g$ g5 s- _: Y( k" X{9 D. o( _" K" l
    Single_WriteI2C(PWR_MGMT_1, 0x00);    //解除休眠状态7 U$ l4 o/ \4 F1 P3 o

( h1 R# y7 I3 K0 ~4 D6 g* C    Single_WriteI2C(SMPLRT_DIV, 0x07);
; C( ~4 c6 L/ B( M+ Q. B7 b2 r( e4 x" x5 k
    Single_WriteI2C(CONFIG, 0x06);
5 I# S* w! i# t# U5 U* e' @: D
) I4 {' _. y  f/ g" e: U    Single_WriteI2C(GYRO_CONFIG, 0x18);
' [' \3 M/ \% W: F( Z; q4 f( X5 _# M7 l& B3 I& w! V$ S& ?
    Single_WriteI2C(ACCEL_CONFIG, 0x01);
0 V3 ?* p% s. R/ H: P}
4 @/ s4 f8 M5 C, a4 p2 s//**************************************- s8 Z1 r. j4 I* g. {7 ~
//合成数据
" s% C% ^; ^+ g- z//**************************************$ K1 P7 d0 S* l+ Z
int16_t GetMPUOutValue(uint8_t REG_Address)
5 O2 ?  P- a9 {7 h/ A1 W{* z( h, v3 W, k1 y5 P7 @
    int16_t result;# w+ h% \. A* Y7 w+ ]7 h
    uint8_t H,L;5 f5 r' |* @: X8 R. @/ D) P
    H=Single_ReadI2C(REG_Address);+ j: Q0 M# @/ Y3 z6 y) R
    L=Single_ReadI2C(REG_Address+1);
2 c. [. l0 G: n/ a0 E    result = (H<<8)+L;
' h% z$ |1 w+ B! A, r    return result;   //合成数据
& d& H1 {0 ]% }}
. `* {; b7 o( p; T  k' u5 H. y
# w4 F: |  I' A+ [; j3 {//**************************************( }" _$ n1 Z( |. ^& M/ R
//取某一轴上的加速度数据
8 V: t/ i3 Z+ F6 F& X//**************************************0 z  B5 Z! z4 V% e+ n
int16_t GetAccelValue(char axis)6 ?( f. U9 o2 `2 F# v
{% i& d# Y; B' X% p
    int16_t result = 0;
3 J4 s" G* @# m( _, f+ t% `    switch(axis)
1 G4 e9 M" _' h9 E$ j9 {' p    {; v, _& g3 L; |0 r/ w' C
        case 'x':; q( }1 b& y4 h3 I1 Z
        case 'X':
* C% z1 p6 @0 x- m" N! X% |        {
" {* D( O2 k$ k            result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;
8 A- r4 _7 Y2 W  X5 h        }* P9 o" I) O6 \5 i
        break;; e# h  W) O" U8 G- v3 u' {7 h
        case 'y':
; p8 H5 W; n9 W& F5 s$ a        case 'Y':- x, @' V) V. I  `$ Z3 K  d
        {
$ e* N+ G8 _: l( h- u            result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;
* `$ A  k3 G/ p$ E        }- ~: r* ~( l: D4 q' s- R
        break;3 E! D2 m( `9 S: E4 g4 C
        case 'z':  @. F( p  z& E( p1 ]
        case 'Z':
% p9 N6 _* _1 B9 [        {
* H4 O. q8 h' [+ \1 N8 `3 f/ O            result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;
8 V8 R9 T6 j. J& x  u        }" \  K( r! @: u. d1 ~7 v
        break;
3 |) H6 l" o/ _. X1 @7 Z    }
+ [9 N# T+ T0 R  g2 t3 L* A$ O# k    return result;; _1 y/ f5 q$ c
}: `# m' n" m7 V5 l4 L$ |4 y8 A
& t# M( Y+ Q; P# w
//**************************************9 F8 I8 N' I, p, G
//取某一轴上的角速度数据8 F% S' Q) T/ L3 h
//**************************************" T9 O& B3 s0 F/ m3 G
int16_t GetGyroValue(char axis)
- k+ |2 F1 W8 Q% F- Q{
4 |; Z5 @; l9 G' G    int16_t result = 0;
. ^# I9 M8 x- J2 n    switch(axis)5 ~7 D# j# w+ b! A
    {. O2 O8 _/ h5 h" w8 U$ {
        case 'x':
2 |( A4 T4 K3 `# B5 k5 X7 t        case 'X':) Y9 X$ [% E  }- |- H5 e" e
        {
! J' o* T$ O  \$ _5 k' X            result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;6 F7 L4 C) M6 Y9 s: X5 f2 z# \* w
        }4 `3 \9 ]2 h# [& v" d' z/ b; e
        break;
, U% [5 M/ y4 C) P, ]! @' R        case 'y':+ k, `2 s/ w$ r/ x+ P( @
        case 'Y':  [# E. {7 C# O' b/ s! G1 ~
        {
3 T+ |" A( q8 l8 ?; n8 R            result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
5 a" {$ x1 _+ U/ E( f2 |        }
! p1 j) @  B9 f# x% M( f- ^        break;
7 f; s2 _2 W" h  G5 P0 F' O! \, Q) y        case 'z':
* n, |! W8 T$ f4 t) d' a; q6 H        case 'Z':
- ^" Z2 x% _  T: I" k# c. p        {3 \  S( _  k; J
            result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;0 @- W) h! A) k4 t
        }: Q8 n4 ^7 T  f  c+ t
        break;/ A  b. P  V1 Z* x5 u* _
    }
( c8 y+ n! Q) V6 K3 Z$ o$ k# ?    return result;: b# r" z& q( J( v, _
}

评分

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

查看全部评分

党国特派员 回答时间:2015-1-6 13:21:49
int main(void)$ F. x" a0 u; ?9 i
{# K# T* t  e7 C- ^, c+ L

* ^* H# M$ M: [0 T  /* USER CODE BEGIN 1 */
: P6 l4 {' T$ D9 @/ @
: s5 G7 Z6 T& }7 D8 v  /* USER CODE END 1 */$ B7 ~. }& C' w0 l* Z4 ^5 f5 O
& o; G6 h+ f6 `( `/ s" z+ t) M% \( T( C0 k1 ~
  /* MCU Configuration----------------------------------------------------------*/5 q$ M, L  G* \( o* I

, s+ [: P7 I! q8 W; f  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */7 i" X% d  f) e
  HAL_Init();$ j2 `+ W3 M8 g
; L  N0 U4 `* g$ [, y4 u; u7 A
  /* Configure the system clock */5 q( G3 ]4 w7 ?1 `
  SystemClock_Config();6 t# W& z# t7 _1 e# w, h- K: q

7 J$ g5 r$ y+ M' a" j. J  /* System interrupt init*/
! Q3 B0 r5 n) p$ G1 c8 H  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
1 B+ I3 H! ~/ N0 M+ c2 N  ^/ s- k1 x# |5 B7 C0 |/ h. R  d% r
  /* Initialize all configured peripherals */# J  @$ D5 h9 F* M) ^1 k0 p3 R
  MX_GPIO_Init();; D- w/ I' ]$ a2 N5 g% a
  MX_DMA_Init();1 [0 y; a5 P8 k/ i, j' y9 S
    MX_I2C1_Init();
' k  U& s* y- b* `    MX_TIM2_Init();. f! \( [7 M; {  z) d7 p2 `, N
  MX_USART2_UART_Init();3 S- i# z2 C* R* I
    InitMPU6050();, N& W. w* g2 W( }5 ?# @7 N

3 Z$ H8 B( g/ x7 [  /* USER CODE BEGIN 2 */6 }+ U% A9 d" p* M8 v7 h5 J
    HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
6 }7 {3 C. l7 N' `( b/ C    HAL_TIM_Base_Start_IT(&htim2);
( `4 y! F. p1 c, |# n. [. L  /* USER CODE END 2 */
! F+ V1 Y7 G% r- r8 J9 ^( m; L5 ]; `2 m  p5 c9 z+ [2 B% a! i
  /* USER CODE BEGIN 3 */
% ?0 C  K, t8 }; @! R- a  /* Infinite loop */
/ y4 z& |# M7 |, U  while (1)
: b* \' t" s4 a; s& E: C2 k- G- }  {2 |( T9 R8 `( C4 g# @! d& G3 |' K
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);8 w3 S! x/ q/ X; ]# Z
        VisualScopeAngleOutput();% o7 E( I9 }2 J; z  H! Q
        HAL_Delay(100);/ i7 z7 ?3 F' O3 D2 u7 c; z
  }
5 V. L# v: `4 M8 @1 ^  /* USER CODE END 3 */9 t: r4 c1 w0 Z  m. n0 f! w8 Z) |1 ?

1 e6 ]( N+ s7 T}! v3 [+ e! m4 ^2 q5 n1 _% E% W2 A/ W' X& u
% d0 ~* R1 ]2 g6 Q& J% \
/** System Clock Configuration& z  n$ U9 `+ J$ r$ y3 A! e
*/
" x4 i7 b/ g9 O( X# K* @: Zvoid SystemClock_Config(void)
* U; {* @( k  B6 R! t{8 _% J* U$ j* I/ w9 D

- R/ @; z+ L) w0 `$ q9 p# A  RCC_ClkInitTypeDef RCC_ClkInitStruct;
5 P2 b5 T6 M5 s5 J  RCC_PeriphCLKInitTypeDef PeriphClkInit;
& t4 I* F3 R. z* P  RCC_OscInitTypeDef RCC_OscInitStruct;
4 S, r+ }# y/ Y0 R# I  t; v6 ~# v: l: ^7 {3 j2 \
  __PWR_CLK_ENABLE();
0 k( [5 z/ x8 [1 R* ~3 r& e) w8 s
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
0 H" x$ N0 e! ^
5 ~) z6 ]8 b3 C! t0 R7 e& c% ]  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;9 U( N+ |6 H) ~6 b" S! f
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
4 V/ v" n9 e' q; u. U  RCC_OscInitStruct.HSICalibrationValue = 16;" F; _3 H; [( p7 N, D8 t1 F
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ e" V6 I' u3 d# a  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;& _: O; i( u, D/ L! z1 E) r
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;9 l' k$ m9 k! H' G0 `
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
- l$ t* y' N' |( O; C1 T. {) E7 Z  HAL_RCC_OscConfig(&RCC_OscInitStruct);
! I, K1 [( R  L: x+ Z% B5 V- F+ l2 N: ]% s( u# m  q. _
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;. q9 m* @0 ^8 q- h3 Y6 @) ~
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;! {+ T5 I2 k$ T
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;1 N8 b3 s  ], ]7 D# D1 k
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;5 [- [( p% H1 b
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;$ a0 [0 u. V6 i' r3 W
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);/ H/ a" d- G& Y" ?
4 B$ t2 t  y9 A1 G2 F
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
3 X0 g! g! l3 q: B' D: Q7 t" m, A  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;+ ^5 D' k; R( h: g; W/ L/ r
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
  v$ [- F0 o0 G0 x) t/ h! s  e  D  W
  __SYSCFG_CLK_ENABLE();9 r; ]: S4 C* b) u5 R
: P8 O6 u2 D/ j( ?9 u* F
}
# v- o7 D0 l( b0 u/ P) I5 w, P9 o/ q4 B* {5 }
/* USER CODE BEGIN 4 */* ~+ A$ S& g: v+ x( u+ N
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
. a9 C% c; N2 h  ^. x: u3 W+ Q{, e# W% X9 q0 Z3 Z* I: N( }) {) }4 K
    if(huart->Instance == USART2)
3 P& |. J6 k: O' n6 ?$ L" `7 m    {
$ d5 J9 D; X& S$ X) r  ]" w% B7 D0 A        memcpy(txBuffer,rxBuffer,RXSIZE);
, V" a, ^, s0 }  I$ u; m        HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);4 }5 ], Q4 }3 M2 p) p
        HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
) m, H# R1 s) H& m  p    }
/ [$ n9 V5 P- f* |}- X* X  a% V5 `. y' G

& }* |- ?* d' A* l5 ?! Avoid HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)3 |0 ^( F- O& W6 F1 ]
{" B  w6 d! m9 C6 v. y! u* ^5 `
   
2 D8 \  R/ B6 D7 l6 V/ ^8 m}
, S% k( f. H. q" [- T% e) W* l) R6 W4 ~
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
, u6 Q, v& h/ @  Z5 c2 f/ ?{
+ E, H, s& S( a1 ~. Z    int32_t GyroValue;# V8 T! u8 _: Q9 P
   
( }% I& \# C3 p4 D    Calc_AngleAccel();
6 k; V% ]! @/ R( M8 y    GyroValue = Calc_AngleGyro();
5 B7 m5 L) k6 y% A( `- I( m; o) s    ComplementFilter(GyroValue);
5 g9 u9 V5 K5 a5 ^}
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
, z; q" W2 \6 n8 B4 d楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...

  f' B6 z0 y9 D1 j) p' ^8 t2 R使用DMA方式,接收发送数据必须是个固定长度。
党国特派员 回答时间:2015-2-17 09:21:31
星辰一方 发表于 2015-2-16 19:00
& \7 J/ l, Q4 `2 ?6 t% @& ]3 p2 N楼主,请教一个使用HAL库UART中断方式接收数据的问题:接收数据时候必须在程序中设定接收长度吗?如数据长 ...
+ L% n; T0 _! J- \9 U! u- 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! S2 Z. \+ C5 x) Y  }
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
% v9 l! t2 p) x
好的,多谢指点!
rogerkun 回答时间:2015-4-3 22:08:29
楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?* h: B8 b! y3 S. q' J: f
请问应该注意什么地方
nocoyou 回答时间:2015-4-4 09:12:05
顶顶顶顶
党国特派员 回答时间:2015-4-4 21:33:35
rogerkun 发表于 2015-4-3 22:08: P5 ?" O+ C! E9 Q
楼主,这个工程确认正确吗?问什么 我使用 UART DMA怎么也没办法连续输出和接收数据?$ P5 ~: O# P4 _% ?! J5 h6 W
请问应该注意什么地 ...
7 `4 b: q4 M! A7 B+ d6 W8 G4 }
我使用是没有问题的呀。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版