拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:5 p- O$ h( Y. G -------------------------------------------------------------------------------传说中的分界线---------------------------------------------------------------------------- main.c. F% [) \' W4 {6 h! J3 V #include "stm32l0xx_hal.h"! t6 o& b) Z9 X( r0 }: n #include "dma.h" #include "i2c.h" #include "tim.h"- P& V4 m+ c$ H* p8 B4 h #include "usart.h" #include "gpio.h" #include "mpu6050.h"; S. D0 S0 b* S9 Q" e( V a #include "visualscope.h"$ _7 J" \! z" l+ F+ Q" k) W #include <string.h> #include <math.h>6 v4 U/ s2 _6 t2 V) \/ f+ C& { , D! r8 Z6 q7 z$ f9 `9 P /* Private variables ---------------------------------------------------------*/0 [) R- a1 v3 ^% g. J #define RXSIZE 88 C3 W7 c1 ]$ l7 N3 L7 b& j #define TXSIZE 8" p$ W; J3 \" l8 ~3 I3 l4 c0 k uint8_t rxBuffer[RXSIZE]; uint8_t txBuffer[TXSIZE];7 f4 ?, c' G0 h* s6 J* o) u) a float Angle_accel = 0; float Angle_gyro = 0;4 h7 p# J N0 s7 I float Angle_comp = 0; uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */ t3 r. |6 v* K# ^! A& P- L3 j7 k 3 b. r9 g% _: [8 ]0 z /*---------------------------------------------------------------------------------------------------------*/ /* 重力加速度算出的角度 */$ {8 c" y* V% C; U9 w /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleAccel()! w! y8 Y8 k$ H' i { int32_t value = 0;! \8 N8 v5 T4 O8 _% J+ w # Y3 ] c3 _: l% e, \8 z7 U value = GetAccelValue('x'); if(value > 16384) Angle_accel = -(asin(1) * 180 / 3.1415296);1 C T: S7 ~4 v0 m$ K; X$ O/ z else. m- O5 w. D+ x; H d9 t Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296); return value;2 {; _: r5 ^" N0 Y. Q } /*---------------------------------------------------------------------------------------------------------*/7 s/ I/ x( }2 N" k /* 角速度算出来的角度(积分) */8 k5 r v# a% M1 ~, v( g /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleGyro() {& w1 P( J) E( O4 o& ?* @' C int32_t value = 0; 7 V! d1 Q- w7 Q6 a value = GetGyroValue('y');2 O" K+ _& R+ Z8 {4 L# _ Angle_gyro += (value / 16.384 * 0.01);( L4 t$ X$ `/ ?+ n5 c & d4 G" k# o3 [2 l# a( t return value; }6 H1 D: @" u' I$ V/ Q7 ^6 _9 h 8 D6 Y# M' D: \$ B! ^ /*---------------------------------------------------------------------------------------------------------*/ /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/! U# N, ], S) {) O float ComplementFilter(int32_t simpleGyro) { Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; 9 I. m) N Y$ e+ [ return Angle_comp;$ Z, R3 `. E7 q+ K }2 \; U8 `4 Y; i* @5 i /*---------------------------------------------------------------------------------------------------------*/ /* 输出角度至上位机 */, {! x; z" }3 P3 e$ w; u" B# ~1 z /*---------------------------------------------------------------------------------------------------------*/ void VisualScopeAngleOutput(). g9 e( L# C9 z {- A; v+ @$ t. t- u3 ]5 v$ P% V int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;5 |3 w2 N! k- j uint16_t crcValue; AngleValue_Accel = ceil(Angle_accel * 10 -0.5); AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);- U6 j) ~% J% j; \ AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);8 q* x" ?8 A& O5 f% I outAngleData[0] = AngleValue_Accel & 0xFF;1 |* _5 B* F1 ~0 ^ outAngleData[1] = AngleValue_Accel >> 8; outAngleData[2] = AngleValue_Gyro & 0xFF;! ]; ^) [9 v) O2 \ outAngleData[3] = AngleValue_Gyro >> 8;# k U6 [0 z* O0 h* V$ q7 e outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8; //计算CRC; T) F# w6 ^, r/ l: W4 f- P crcValue = CRC_CHECK(outAngleData,8);) s% Z- ^: @4 ]6 U4 q; [ outAngleData[8] = crcValue & 0xFF;5 C+ \2 J/ b7 t3 g) { f& V outAngleData[9] = crcValue >> 8;4 X+ s' G9 F' a, J* i //发送至上位机/ n% P# w( A2 \ ^3 _1 a HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData)); }$ F& y; _/ z" X /* USER CODE END 0 */* n4 u7 Y& i# |) u& {* u7 _ ) Z$ L$ y# @8 X+ I2 y /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void);+ w6 k9 k' x' [4 |% h9 t& ~2 V 5 ^; Y- N; R5 O# m 硬件连接图: 波形图: 最后加一个视频:; u! {# F+ H; ? x STM32L053 演示6 ]( @, T7 M4 T2 d/ [7 A |
意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS
【STM32MP135-DK】裸机移植shell
【STM32MP13DK】 在Linux主机上交叉编译一个Hello Word应用
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体在意大利建SiC整合制造厂
轻松地实现ClassB在STM32CubeIDE上的移植
ST历史小知识(6)- 与世界共同塑造美好明天
ST历史小知识(5)- SiC衬底进一步发展
ST历史小知识(4)- 投资未来
ST历史小知识(3) - 布局新兴半导体工艺
#include "i2c.h"
$ X" W5 p( u# o6 t4 t! k3 d
#include "gpio.h"# o2 T5 Q; z% j7 A
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
( P8 k/ T, Y7 o) W
I2C_HandleTypeDef hi2cx;
2 M& G. @4 _) Y5 R
/* I2C1 init function */
void MX_I2C1_Init(void)4 E+ P" _- n& [$ R7 Q8 e" E0 z: o! D
{2 `& N; k9 m1 Q# \
hi2cx.Instance = I2C1;' s. V2 E/ K) _8 a6 ?" x L) o
hi2cx.Init.Timing = 0x20D22930;/ W; X9 z& k. u5 X) y- c- \( Z
hi2cx.Init.OwnAddress1 = 0;
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;9 ^; c& M7 H0 b& k, L2 ]. g0 }
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
hi2cx.Init.OwnAddress2 = 0;! f' F8 [/ q( M2 a. a
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;. w2 w( f! V" A
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;2 q+ c) V' |, |8 t/ u
HAL_I2C_Init(&hi2cx);
: m) Q9 h% F" Y8 Q; Y2 I: D9 R
/**Configure Analogue filter6 c6 M/ U" K7 }( ]" M
*/3 t( ?2 [' E6 v# ?$ N
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);( A+ w) p. h, M, ^1 m( ^: O
}% t% r2 E. u3 u4 j* a# o
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)' p7 p5 J! |3 m4 `7 y" M- b1 I
{5 H+ V6 F; v6 x
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)% K0 c5 c- \4 @: S5 g
{
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL1 w# I1 t8 U: s
PB7 ------> I2C1_SDA) @4 U. w6 Q' H7 S1 d) R
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;$ n" {! }" k3 \9 o" k' |
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;$ r! C/ E9 @& l2 B
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;3 y, L; Q: t6 B) ]+ I; w0 G, [( [* l7 V
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;( M! d) e# I6 k; D( q9 G6 y3 H0 J
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}8 m i J4 R0 a4 Z7 o
}' K& [+ w7 K+ p m5 p/ v
- P2 w( v* g6 f& r- W( v1 n
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)5 f) u& E, x& Y# U* U k
{# l$ N6 F2 ~0 L1 D7 J" N# J6 m
9 w9 ~: z) x1 ? a- r: q0 R
if(hi2c->Instance==I2C1)
{+ |8 k+ c# k. \: Z9 i7 j
/* Peripheral clock disable */
__I2C1_CLK_DISABLE();: T9 H9 [& J' G, j" r
/**I2C1 GPIO Configuration 4 {1 x& r/ p5 F1 i6 c
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/2 J" J) }% \. m& N
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
}
}
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
usart.c
#include "usart.h"
( J. X4 I2 @) z- O
#include "gpio.h"! {# h. K& ?+ r
#include "dma.h"
/* USER CODE BEGIN 0 */: h. J5 k- ]$ @0 ~& F9 {. K6 M+ N
( E& b) |6 I1 C+ s G
/* USER CODE END 0 */$ s6 ]* W: q* _
UART_HandleTypeDef huart2;4 P! |( Z2 @9 D0 Q* t
DMA_HandleTypeDef hdma_usart2_rx;4 z( M1 w; p) J7 y1 P
DMA_HandleTypeDef hdma_usart2_tx;
- W/ a `' j! S4 Z _. V
/* USART2 init function */! J1 O' n7 N* {9 k
) {6 f: C+ E5 [9 y
void MX_USART2_UART_Init(void)
{+ y, S! w- }5 [; P. _3 _
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;- c' E: w, ^9 _ N- J/ n
huart2.Init.StopBits = UART_STOPBITS_1;& p5 I0 `6 I$ P5 v0 `
huart2.Init.Parity = UART_PARITY_NONE;7 L& w9 N9 C/ L3 N d# J8 L
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;. C! Z' N5 ]" q ]6 h, w
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; ~9 ~, g% B7 ]" E. w( V5 Q
HAL_UART_Init(&huart2);7 t! x" `$ Q G2 ~& _( W" \, v
}7 u+ d1 B7 G9 O. e
void HAL_UART_MspInit(UART_HandleTypeDef* huart)* b. h* b* I$ d: W" }# r
{
# _: e9 x, w8 E% L% z% q( B
GPIO_InitTypeDef GPIO_InitStruct;' t( f8 S# |" D9 h0 i' v
if(huart->Instance==USART2)) z: Y' D- R2 @. V* U- l
{
/* Peripheral clock enable */
__USART2_CLK_ENABLE();
& N: H2 K- A. ~5 h; [6 i" z
/**USART2 GPIO Configuration ; g4 w1 H; ^# {" Z
PA2 ------> USART2_TX/ y# K7 N1 s5 y. l2 H# g$ h) e
PA3 ------> USART2_RX$ N7 Y6 Y f! d9 l* g# \
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);& z4 {+ k% z0 R7 Z1 K) Z
4 M, K$ K$ ?) j2 U5 p
GPIO_InitStruct.Pin = GPIO_PIN_3;. q% P& L+ g% y" D/ v) Q2 q
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;3 ?3 b/ |1 b w0 w5 K
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Peripheral DMA init*/
8 L% u- e- V( t+ L' O
hdma_usart2_rx.Instance = DMA1_Channel5;
hdma_usart2_rx.Init.Request = DMA_REQUEST_4;0 W' x: g* t- x5 d
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;; i7 y( l* X& \+ y
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;- a0 s r9 x6 C* Q& {2 O S. m1 m
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_rx);+ |2 ], c, J4 s/ m4 P# {0 i
! X1 ?# e, ~" x, i
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
! n+ {6 l: N5 ~3 M
hdma_usart2_tx.Instance = DMA1_Channel4; @7 q) O! s' |+ w/ b
hdma_usart2_tx.Init.Request = DMA_REQUEST_4;* N6 K/ h1 N& _) @
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE; u/ b+ S8 x4 i% `9 W
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;1 h5 ~( W6 B8 f! W6 X" x/ e) V
hdma_usart2_tx.Init.Mode = DMA_NORMAL;7 i, G' M Z% N
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_tx);3 [' y. j" W% B: f2 O5 }
3 ?: j2 p! n1 ] U: c
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);+ D" S! l+ y9 s* M
2 D* |! w) U y$ P
}5 E# x5 y, X' G$ m8 g3 h
}
} m. v0 w% t' J" x" q5 @. h
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{8 S, n3 s. E! a
if(huart->Instance==USART2)* H* M$ `0 o! w- b
{
/* Peripheral clock disable */
__USART2_CLK_DISABLE();) X' X, N6 `% ?" x, P5 Q V. N! H
/ b: _) l0 _+ i# b# C& p F) B1 I: ]
/**USART2 GPIO Configuration ; f# A. I, _1 T- l/ e7 K% B% x
PA2 ------> USART2_TX, c. G4 B$ T% D5 h( }) N2 r
PA3 ------> USART2_RX
*/1 o6 F V: R6 k4 `% P
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
3 c R; W4 T9 I1 F, j: Z
/* Peripheral DMA DeInit*/5 a* I# e/ J' a. ~# w/ i5 `
HAL_DMA_DeInit(huart->hdmarx);
HAL_DMA_DeInit(huart->hdmatx);
}. M# |- n2 w+ j) A: J
}/ q- q6 M1 s# ~7 Q
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------- Q: Z1 w, \* }, f1 @
mpu6050.c" I: }( I% f! d* M* G" o
#include "stm32l0xx_hal.h"' @, V8 P- U* s' l; U3 }5 J! d- f
#include "MPU6050.h"
& Y( Z7 L( x% `1 a
//各坐标轴上静止偏差(重力,角速度): b7 Q! b& X" [
int16_t offsetAccelX = -195;0 L# A, L# l; Q' `; Q
int16_t offsetAccelY = 560;" _8 I2 Q+ Z" R' q# b4 ~# b, s
int16_t offsetAccelZ = -169;9 }3 K c( o& X A# W
int16_t offsetGyroX = 12;$ H: j6 m& t' U, i4 _: g* v
int16_t offsetGyroY = 33;# \+ r3 f( X# Y3 x' I4 l
int16_t offsetGyroZ = 4;8 z3 X: w, w! ~3 ~: g
extern I2C_HandleTypeDef hi2cx;
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
{+ r/ c6 p M6 _
uint8_t rxData[2] = {REG_Address,REG_data};* k9 B0 C$ k) Z3 @# J* x# D
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)/ @ s4 S0 G* H) g4 K; {) [ s
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}9 j5 ]* H3 o9 O- A' f: Z
}
}
//**************************************
//从I2C设备读取一个字节数据8 S& b3 {1 ^7 J1 V# X1 n5 p* m
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)
{7 L; T B$ p8 A5 k/ N
uint8_t REG_data;
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)3 U, O% v& z6 N9 [1 W. I( L
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}; ^% q. X5 b1 I$ |0 z1 u
) A& r6 ]: n* t7 a- `
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)6 X6 X% C, N# }
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}0 P- @* l5 l# l0 z- f8 D
}
return REG_data;& P; ~( N. S5 O
}! E; f* G2 }& }" m0 V7 o
//**************************************1 E( U8 P4 b( u! h4 E; x
//初始化MPU6050
//**************************************& q1 P8 a$ s% ]0 u
void InitMPU6050()
{9 h0 t4 \* g/ k8 M" c6 f1 L# R
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
$ C: S* t# v2 z5 R7 K! j6 U
Single_WriteI2C(SMPLRT_DIV, 0x07);
+ ?1 n1 @" O8 ]3 P* {) d" v/ `
Single_WriteI2C(CONFIG, 0x06);
1 l+ n% o4 p6 H2 X) Y# h, K
Single_WriteI2C(GYRO_CONFIG, 0x18);
Single_WriteI2C(ACCEL_CONFIG, 0x01);1 r/ W* _. D7 e; _. h
}
//**************************************9 k0 Y6 e/ C% r7 B/ {1 t
//合成数据
//**************************************' S4 n/ `! G' D& c1 P: C& [
int16_t GetMPUOutValue(uint8_t REG_Address)& z" {9 e# U' S7 `8 t. n
{* C8 h$ d9 h) E3 s5 h: B
int16_t result;) v) Z3 Q0 M u5 j* Z5 l6 I, L! E
uint8_t H,L;2 b7 N8 Q" ~1 f' a! e1 g
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
result = (H<<8)+L;6 E% J0 E* \4 d
return result; //合成数据7 A" N3 D' S/ D0 V" b% M1 U
} @( w- b& ]4 {, R/ ~7 V
) o4 U. v" K# h/ r
//**************************************
//取某一轴上的加速度数据
//**************************************
int16_t GetAccelValue(char axis); X8 B# P* v+ N
{
int16_t result = 0;. h4 @: R! {$ G* O# c
switch(axis)
{
case 'x':
case 'X':3 h. O4 T2 U$ m0 i- q8 P9 D7 h
{+ o2 `1 b+ s# R$ ~% c
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;9 x/ `$ ^" p8 [7 n) V+ v
}
break;: e) P8 E5 U9 Z* R5 Y2 I, T* X
case 'y':
case 'Y':! u- Z7 N# \& m
{
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;: s- V( B0 E7 e" P0 A% u) Z0 J
}
break;
case 'z':
case 'Z':
{
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;
}! \9 L6 I6 ^ L4 j2 I* r, L
break;% B0 x, a2 ?) T w% }
}7 E: @. Q% S0 [% [2 j2 G
return result;
}# c5 }/ @) d6 n9 T$ y+ T* S' X Z
//**************************************7 ?8 S! ?, e$ X& [( e9 D
//取某一轴上的角速度数据& X- ] i# {8 \3 O2 s
//**************************************" X5 I6 I6 @" W6 S: I4 h6 |$ O
int16_t GetGyroValue(char axis)% n1 ~. \2 W7 I6 q5 N1 l
{5 I+ Z. ], A& W9 g1 t+ m$ r- z+ I
int16_t result = 0;$ K8 \5 G' |# O4 ]! P7 V
switch(axis)3 G% `. U8 g3 o. t8 ^
{
case 'x':
case 'X':1 y v a& Q# O5 z0 u6 F( T) b
{$ ?" d, b2 n9 V4 U2 i0 `. }. E3 f& t9 Z3 X
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;
}
break;, u. p! S l: o! e
case 'y':& y% G0 {8 |% F" |
case 'Y':- B0 P% ?7 F7 A
{9 h+ J1 @ R4 V4 O) P
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;$ L. z, I& B9 x( ~: f
}
break;
case 'z':
case 'Z':. B: o0 S* H( v% B( A
{
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;# n% S/ k7 A" y6 `
}5 {: F. F0 n* l& n3 d1 m
break;
}
return result;
}
评分
查看全部评分
{3 g" i. l- s3 ~+ i
/* USER CODE BEGIN 1 */6 ^. b# q" S5 `* u
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/9 U3 C, j$ k" Q# m2 n
0 N& r- V: y" |
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
9 S: u" P U0 ~ Z) k
/* Configure the system clock */1 t7 m! ?" g& D5 D, ?5 z# b! v. R
SystemClock_Config();
" a0 d! `6 \, f/ Q# a! q
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);# i% Z/ g4 A Y% Q4 n7 Y
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();8 Z) \% F0 M* J! {. y
MX_I2C1_Init();% ]5 g+ x% i0 I( c
MX_TIM2_Init();0 B' p- }4 E1 b4 G( I
MX_USART2_UART_Init();
InitMPU6050();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
HAL_TIM_Base_Start_IT(&htim2);5 o1 i% ]7 R h. P5 {; d
/* USER CODE END 2 */
, C I) Y; c; {" s4 U( j+ I
/* USER CODE BEGIN 3 */
/* Infinite loop */8 ^: c4 o% H8 M
while (1)1 m0 l; o4 ^4 l+ z R- F
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);5 f) D! D6 ~) m
VisualScopeAngleOutput();4 b" d& t- w, K
HAL_Delay(100);
}- x( O6 w9 w0 N: J
/* USER CODE END 3 */) J. ?9 ?! P' a2 O$ b; }
* `$ V6 l8 g) }; e- |
}
1 F: }+ Z- q: {' k5 @- }
/** System Clock Configuration
*/5 ]9 c; c1 ^4 u9 U/ E; Q m* [
void SystemClock_Config(void); q$ p6 E( `9 o- M
{
4 H+ b* Z7 B8 j7 f+ N: ~ W
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;2 s, v7 @4 ^$ t/ Y2 J5 [; U& A* K
RCC_OscInitTypeDef RCC_OscInitStruct;
__PWR_CLK_ENABLE();% r7 o/ ]4 M7 K
- w! }9 j3 n3 Q1 V% ^, i7 S* ~; a7 C9 h
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;5 O7 t0 U7 l0 y$ R
RCC_OscInitStruct.HSICalibrationValue = 16;/ k! m _$ P- {- p o
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
HAL_RCC_OscConfig(&RCC_OscInitStruct);; p2 U1 i2 a5 ~9 [: i3 `4 M
0 l, M. y+ L- N# g1 E7 x
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;9 P$ \" Y8 ~, A0 D8 S/ J
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);+ h$ Z- M. z! |- P! c& x
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; p R! D3 O0 c; I0 t3 X
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
__SYSCFG_CLK_ENABLE();6 y" j* n9 U" M! E, m. t
0 g; t$ N# h/ n+ x5 Z1 v i
}8 X# j1 A! o, R2 v
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{ h: y" n6 ~# v! o7 A# z1 G0 o
if(huart->Instance == USART2): P0 F9 U6 o* C' B, e. S- G0 U
{
memcpy(txBuffer,rxBuffer,RXSIZE);1 X! [2 p% X; h! D# `+ h
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}
}4 M' @ S; X% ] J6 a$ u* @8 Y
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)9 }. N3 t0 f2 r* v8 p
{
}/ Q7 x/ z+ C* M c( l( V! _- T2 h5 ~
( O, D6 a- } @5 h
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" S* s8 _; o( R" a5 E" I0 e K; M
{
int32_t GyroValue; f% J3 E/ s% K& H
2 D! T1 U; t, [
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();
ComplementFilter(GyroValue);$ A# L9 X7 u: g7 j
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。