拿到开发板有一段时间,看了下资料,使用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 #include "stm32l0xx_hal.h" #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" #include "gpio.h" #include "mpu6050.h" #include "visualscope.h" #include <string.h> #include <math.h> /* Private variables ---------------------------------------------------------*/2 K9 W; G: ?2 c4 j7 G$ Z #define RXSIZE 8 #define TXSIZE 8. S4 u/ ~% A1 R2 i3 c) z uint8_t rxBuffer[RXSIZE]; uint8_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; float Angle_comp = 0;9 h# w" W( N0 n& m7 y) M uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */ - Z! |; l T' c, y- h- L/ f: D /*---------------------------------------------------------------------------------------------------------*/! @! I$ T6 ]( A: M' N' {1 s7 r /* 重力加速度算出的角度 */ /*---------------------------------------------------------------------------------------------------------*/( q: J1 Y1 K* Y int32_t Calc_AngleAccel() {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 Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);% y s1 h# H/ d: I# D return value;9 l6 E- j' G( t6 \; ]0 d } /*---------------------------------------------------------------------------------------------------------*/0 }* k1 y3 G' E& j7 H /* 角速度算出来的角度(积分) *// z7 h: r$ O$ r! _3 |* M$ ^; Q% M /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleGyro()2 H+ ^. K5 V5 c! B {* m: `/ t- Q4 r( x9 ~ int32_t value = 0; 0 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 return value;) y8 }5 w8 s* ~- C) @2 z. D& n }6 S) w/ p7 y& A$ f! F) N: y /*---------------------------------------------------------------------------------------------------------*/ /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/ float 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 return Angle_comp; }! v& M9 r- j* }- S3 l9 ?+ h /*---------------------------------------------------------------------------------------------------------*/4 R/ F1 h2 F* v" } {; D /* 输出角度至上位机 */7 \9 j3 c7 Y4 F D5 X. m7 P" O7 K8 ?7 H$ l /*---------------------------------------------------------------------------------------------------------*/ void VisualScopeAngleOutput() { int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp; uint16_t crcValue; AngleValue_Accel = ceil(Angle_accel * 10 -0.5); AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5); AngleValue_Comp = ceil(Angle_comp * 10 - 0.5); 4 M) N n6 U* \4 P! ~7 | outAngleData[0] = AngleValue_Accel & 0xFF; outAngleData[1] = AngleValue_Accel >> 8;7 d& K6 M( [4 H! o! c7 h a outAngleData[2] = AngleValue_Gyro & 0xFF; outAngleData[3] = AngleValue_Gyro >> 8; outAngleData[4] = AngleValue_Comp & 0xFF;: {# M% q: V1 d- ]& _ outAngleData[5] = AngleValue_Comp >> 8; //计算CRC crcValue = CRC_CHECK(outAngleData,8); outAngleData[8] = crcValue & 0xFF; outAngleData[9] = crcValue >> 8;0 W, R$ f; m- `1 C; e' s //发送至上位机 HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData));! {; w/ l, K+ J. G# Z* n } /* USER CODE END 0 */ 6 Y2 ^- [8 m& M# |8 x1 @ X /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void);- a$ e. a9 z- e/ `! @ - q% I' B' a' P5 v" O* d 硬件连接图:3 x) p. @; t( j9 W 波形图: 最后加一个视频:5 Q7 w8 u! m& f* t. [: D* H STM32L053 演示 |
【STM32MP135-DK】裸机移植shell
【STM32MP13DK】 在Linux主机上交叉编译一个Hello Word应用
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体在意大利建SiC整合制造厂
轻松地实现ClassB在STM32CubeIDE上的移植
ST历史小知识(6)- 与世界共同塑造美好明天
ST历史小知识(5)- SiC衬底进一步发展
ST历史小知识(4)- 投资未来
ST历史小知识(3) - 布局新兴半导体工艺
ST历史小知识(2)-多重应用,走出低谷
#include "i2c.h"
#include "gpio.h"$ F6 h0 d" w9 h' M
* J1 H" q; {; E' c0 l/ |
/* USER CODE BEGIN 0 */. y' i' z! J; ]/ t
/* 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 */
void MX_I2C1_Init(void); w" K! J+ |5 E& l1 h7 u# ]
{
- ?+ _3 g2 v5 P( j% X9 s$ j: ]- e
hi2cx.Instance = I2C1;
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;
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);
/**Configure Analogue filter
*/' [8 F# q: s0 y- L% W: \4 k# E
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
}
. 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
GPIO_InitTypeDef GPIO_InitStruct;3 Y- Q7 C) u1 \" o6 n% F5 s
if(hi2c->Instance==I2C1); b" _* d0 J) w
{
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
/**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
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;/ b' `3 Q# q, i- u" C. i6 w
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;6 i$ J( e4 V5 V( M8 K+ S( L \6 }
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
) A- ?' F' G( J3 P( K. x
}) i3 \- n. ^% c. I5 R: b; m% U7 L
}
3 o, V5 D T( T+ M" W& b h% B2 x# A
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{8 z7 s9 O3 N3 K& _
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();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA6 \4 j& N& x, C* ^. o" X5 j
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
}9 J- [+ h! }0 G5 E4 W
}4 T7 U2 t# v2 w% M
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
usart.c
#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"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
UART_HandleTypeDef huart2;+ b* q2 E2 V$ E% j/ ] H
DMA_HandleTypeDef hdma_usart2_rx;
DMA_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
void MX_USART2_UART_Init(void)/ D% d. p5 V6 }6 d9 S3 h9 ^/ ]
{; a: X6 Y- U$ D+ B3 T8 Z0 G. a
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
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;
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
}
void HAL_UART_MspInit(UART_HandleTypeDef* huart)7 b" K5 f9 f. f
{, @* `1 B# j( k7 s2 |
GPIO_InitTypeDef GPIO_InitStruct;: t$ a) f* v O; c
if(huart->Instance==USART2)
{
/* Peripheral clock enable */8 i3 h$ t D/ Q2 q3 {' T( h
__USART2_CLK_ENABLE();
/**USART2 GPIO Configuration 4 U5 |! _3 Q2 q7 _% p4 h
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/( ~; G" p0 L( \" S1 {; V
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;. `( y/ X/ B- u2 l$ T- Y
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- 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;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 T# L! O) Z# }" F2 h, T' [0 {9 S
/* Peripheral DMA init*/
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;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;, O3 W) J5 k1 K3 f0 g
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL; O8 l( O8 ^5 {0 M/ i7 Y
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
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;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;5 n* |8 j6 X: Z3 _% ~% a8 R
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
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
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
; M; Y* l$ G, d2 J* X9 r3 y; r) r
}
}& u7 ]1 g- { N' x! C, p3 {
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)3 y5 ? {2 f. x( n& m2 N
{
8 W! g* Y4 U" N/ _5 k4 v
if(huart->Instance==USART2)
{. t8 |4 o9 [; k
/* Peripheral clock disable */0 N- w( M; H+ ]5 ?
__USART2_CLK_DISABLE();
. D. V' `/ F7 m w
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
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);
HAL_DMA_DeInit(huart->hdmatx);
}
}! }7 o8 U6 V2 D4 I7 K9 b! ]
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
mpu6050.c
#include "stm32l0xx_hal.h"
#include "MPU6050.h"
//各坐标轴上静止偏差(重力,角速度)
int16_t offsetAccelX = -195;" `3 r( `. H! ~' X7 }8 y
int16_t offsetAccelY = 560;
int16_t offsetAccelZ = -169;
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
//**************************************
//向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};
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)
{' s1 i: X# X! z$ }7 q
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)( V$ u( |8 Q( u7 C$ U
{}
}
}
//**************************************1 J3 ^2 ? @( W0 ]4 }
//从I2C设备读取一个字节数据1 O' W* d) X9 B9 z
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)
{
uint8_t REG_data;; [3 _; o5 `* j# H( }
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)+ E! I2 l* A2 D' R
{}
}$ O& c* v/ m; X1 a
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)4 ~# S2 E8 e1 @8 j% [
{
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
}
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$ \
//**************************************
void InitMPU6050()
{- |. l5 K7 ^& X' L: h1 B# Y6 D& s
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
( 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);
) ?8 e# a! Y, Q$ ^9 h
Single_WriteI2C(GYRO_CONFIG, 0x18);7 C1 Y) }5 V a9 _5 j
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}/ t& S% F# N& `2 f9 x# H V
//**************************************
//合成数据. s5 ^: Q! P" ^( w: e# b8 s- H' H
//**************************************
int16_t GetMPUOutValue(uint8_t REG_Address)
{
int16_t result;
uint8_t H,L;
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
//**************************************
//取某一轴上的加速度数据# y4 G, l; u% ^) D- L
//**************************************9 Y% P9 e& f& F
int16_t GetAccelValue(char axis)' s5 l9 N; v. U; R0 U
{
int16_t result = 0;
switch(axis)9 Q! _# [& l8 [# b* q9 [0 {
{
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
}
break;
case 'y':/ t+ {1 U* @. `$ N- T! k V) d c
case 'Y':* L5 O9 W% Q) d0 o) v, f) d5 v
{
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;
}
break;
case 'z':" b4 N) B4 g( Q! K- {9 ~: J( E* f
case 'Z':
{! 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;
}: Z/ |& [) w5 |) Y* A! e
return result;
}0 r+ m7 ?, E7 d* r- h7 p R/ C* X
//**************************************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 }
{
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;3 y3 H) x- y6 P4 Y/ w8 Q, H; e
}
break;* t; U6 P* O- u( _8 J& s4 z
case 'y':
case 'Y':
{
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
}
break;5 C; O y" z' h3 r# d8 X
case 'z':% V7 S1 ?+ F* K" w5 O8 y
case 'Z':
{
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
}& i: [0 `* `& y& q3 `- Y
break;& t4 |- N0 K3 B
}
return result;
}
评分
查看全部评分
{
! 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 */
, T' B3 h& r! x/ C% Y h
/* MCU Configuration----------------------------------------------------------*/
2 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. @
/* Configure the system clock */+ S, |) @* J+ f1 G/ `% ~
SystemClock_Config();
( x; A9 D$ R) d Q9 X& |
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* 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();
MX_I2C1_Init();8 H- {5 I+ [: O8 G9 G0 p) @, u0 ?
MX_TIM2_Init();
MX_USART2_UART_Init();2 l+ ]; n5 |9 L J @
InitMPU6050();
/* 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);
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
/* 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);
VisualScopeAngleOutput();
HAL_Delay(100);! c6 @5 b9 }( w5 o" j
}
/* USER CODE END 3 */
/ 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 |
*/
void SystemClock_Config(void)# ~+ T, A" Q3 n, Y5 n: N( w$ ]3 @% t
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;) ?! z) _! Q) f2 Y" A) g
RCC_PeriphCLKInitTypeDef PeriphClkInit;
RCC_OscInitTypeDef RCC_OscInitStruct;
6 \5 `0 P/ M) z' }9 Y5 b" U
__PWR_CLK_ENABLE();* T; l3 h; X7 U# p
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);" y" O4 V3 s2 p R/ U- a7 o
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;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
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);
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;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;4 b% @ p+ |1 i$ q8 n! ]5 t$ Y
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
5 I: ]3 S( `( j8 F( O5 M/ ]& E0 h
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
* \$ W9 M8 l$ E+ y
__SYSCFG_CLK_ENABLE();
}* c& r# t9 O9 H5 w6 a
) n1 b# |8 Q- S7 V% t5 N: F
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{. ]1 _( R( f% t( p* t* T
if(huart->Instance == USART2)8 ]6 m% s" o5 [) x. O: C9 s4 @
{
memcpy(txBuffer,rxBuffer,RXSIZE);0 i1 z; P& b3 c2 B( Q
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}6 i( |7 t4 v+ R- t2 c
}" @" b: p5 J* Y- _. i0 i; |
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{ \# B# o' f) N* v& D% {' y9 H. a
- K3 V5 T& m: J" ]$ r9 A# C1 c
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
int32_t GyroValue;
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();- B- ~: h/ ]5 d
ComplementFilter(GyroValue);
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。