拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码: -------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------8 }: K3 O0 d) f0 U main.c S$ I4 h- i0 ~& ~) j: e #include "stm32l0xx_hal.h" #include "dma.h" #include "i2c.h" #include "tim.h"# A4 P: \6 R/ K #include "usart.h"& N# ~* r! a7 {( d- R: }* V, P7 p #include "gpio.h". _* i( U6 n# f0 B #include "mpu6050.h" #include "visualscope.h" & s& G# T! e5 V #include <string.h> #include <math.h>1 s& E3 P# b- B/ G# v( D /* Private variables ---------------------------------------------------------*/ #define RXSIZE 80 }! K& K2 B* h0 m! ] #define TXSIZE 8' w# |0 h% V4 x uint8_t rxBuffer[RXSIZE];+ c# | x2 v# |6 R; }$ j" i$ X2 e uint8_t txBuffer[TXSIZE];6 V- O" D b; ` & V: G# O" T0 u float Angle_accel = 0;7 A- c" O' y1 p" e& L float Angle_gyro = 0;/ d) X& Y/ Y1 [/ j+ ~ float Angle_comp = 0; uint8_t outAngleData[10];# |% m' q$ {# v, h. P" T" n /* USER CODE BEGIN 0 */6 q( f: h* s% U$ k( b/ H /*---------------------------------------------------------------------------------------------------------*/ /* 重力加速度算出的角度 */; u9 C4 ~4 t9 ?5 I( w /*---------------------------------------------------------------------------------------------------------*/1 w* w1 [, F& z4 X4 z3 X8 v int32_t Calc_AngleAccel(): ]0 D r; J9 n) S { int32_t value = 0; value = GetAccelValue('x'); if(value > 16384)+ ~# h! v% f, z Angle_accel = -(asin(1) * 180 / 3.1415296);& S' m1 T( l$ W* [ else# a- {! {4 Y% P4 e/ C4 ? Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296); return value;" H- l' P& m9 l8 Z) F } 9 T9 M- {3 H+ r% P" b; p; O f /*---------------------------------------------------------------------------------------------------------*/ /* 角速度算出来的角度(积分) */5 n q6 [/ q1 B" y# Q& t /*---------------------------------------------------------------------------------------------------------*/9 M% z6 p3 y/ I0 M8 E int32_t Calc_AngleGyro() { int32_t value = 0;% P ^0 l- V7 k/ ?: u' P5 o 4 y2 ^. u0 F2 o3 W3 Q2 X$ V4 F1 L. P value = GetGyroValue('y');5 b2 `- F9 y6 Z7 ]7 V' A) Y Angle_gyro += (value / 16.384 * 0.01); return value; }/ F4 `4 l Y" ^5 k /*---------------------------------------------------------------------------------------------------------*/; H7 ?) H7 q$ V" r /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/ float ComplementFilter(int32_t simpleGyro); {) D% S" u. t4 |/ n3 C9 S {# @% X9 S$ B. T Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; return Angle_comp;3 S, L! x& {/ c1 p, \! x% k }4 Q4 I k0 p8 v: m2 j! ]9 A 6 q# f" N+ A4 \1 W; O7 a0 h /*---------------------------------------------------------------------------------------------------------*/ /* 输出角度至上位机 */ /*---------------------------------------------------------------------------------------------------------*/ void VisualScopeAngleOutput()3 S6 H2 F* Z/ I1 z8 v, w d0 v {7 H0 E& _! p- W# f* s' j, M int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;, l/ q. O9 p, c, W8 ]" O5 q) u uint16_t crcValue;, D6 s3 J4 O- S; P l) N. ? AngleValue_Accel = ceil(Angle_accel * 10 -0.5); _, Z( y+ H1 Y5 a AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);. z& ^- h! p+ P AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);1 J M* |" A6 U5 b outAngleData[0] = AngleValue_Accel & 0xFF; outAngleData[1] = AngleValue_Accel >> 8; outAngleData[2] = AngleValue_Gyro & 0xFF;9 V. o2 T1 X) o! z% X outAngleData[3] = AngleValue_Gyro >> 8; outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8;2 i3 I- l7 O2 w' Z+ V* h3 z3 k+ b //计算CRC v$ z( p3 |" }6 \5 Y) D crcValue = CRC_CHECK(outAngleData,8); outAngleData[8] = crcValue & 0xFF; outAngleData[9] = crcValue >> 8;7 m9 I5 a: Z3 O+ { //发送至上位机% `6 T$ y3 j, \& j# M- i/ | HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData)); } /* USER CODE END 0 */ 7 D) `! Y/ S0 p; ` /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void);! M' d$ ]/ s* r8 M. ] , h) z/ S. O& T& O1 h! x . J% @2 X; Z3 l 硬件连接图:; @) Y3 Q# P' W- i/ g 波形图: 最后加一个视频: STM32L053 演示 |
意法半导体最具性价比、速度最快的单核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": V" Z5 v3 H6 D I
#include "gpio.h"
) m' j, n: n0 r
/* USER CODE BEGIN 0 */# x$ ?& u, w! d; A
+ v+ h4 @: S' p
/* USER CODE END 0 */
I2C_HandleTypeDef hi2cx;
/* I2C1 init function */
void MX_I2C1_Init(void)' w3 o+ y* y, [$ x/ y0 I. J; }
{
hi2cx.Instance = I2C1;
hi2cx.Init.Timing = 0x20D22930;' r* ~( F* a8 H% O# n
hi2cx.Init.OwnAddress1 = 0;
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
hi2cx.Init.OwnAddress2 = 0; k1 O% L) ?8 j! Z0 P
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;; D6 V& a: ^5 F _4 U
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
HAL_I2C_Init(&hi2cx);) T# x5 Q, \( Q1 ]3 s
/**Configure Analogue filter
*/5 L8 n. o& R# b) o$ ^
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);. N$ ^7 e5 ~3 o S! X6 b7 \& o
3 v$ I, m. M1 d3 k$ K. u, N/ S# d" z
}
; X) i' r# t; F) N2 t6 \
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)% y+ |3 h; D5 w; l* n9 P
{
5 h j% [$ G$ o$ ^( _9 M# [
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)
{; g3 P- I7 V3 ]5 U; H% w6 |
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();; |' p8 p% Z, b6 O# g$ `( f
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA( \% }+ V8 T' V( n! i' b
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;) h: r5 k, y- m0 W9 \7 n0 B! z
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;) H6 |( g5 v0 ^ q) t$ ~- f- ?
GPIO_InitStruct.Pull = GPIO_NOPULL;! x: T/ B/ R8 S" }/ x
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;* \+ B( Y5 N- m3 q3 I
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}& p" Y6 W; A0 s& e- e' ]9 C
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)2 q# _% t( d8 [% K, j% X% _
{, X" z. |/ {4 i( d2 I
if(hi2c->Instance==I2C1)
{
/* Peripheral clock disable */: w& U5 v' K0 x5 X7 r
__I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
}: u- S; N1 F/ L5 x# p0 \
}
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------& F$ _$ r8 ~" G7 U
usart.c' H+ w" Q3 C' h) ~/ }
#include "usart.h"3 y- [) b8 U3 q. k' Z3 i
#include "gpio.h"
#include "dma.h"9 S; E! C2 }& W4 I; L" O2 f
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;' h, O+ s* F7 H; e8 d& j+ v! Y
0 v! _% Z x' Q( m P" j
/* USART2 init function */" p7 R! J" H; `
void MX_USART2_UART_Init(void)
{
& K0 _6 J- q+ M' O/ ~! a: s
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
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;7 r& W! @8 p" w$ b
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart2);* q3 ]7 k) G% o# q; {
}
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct;: \ J* _" F& F$ e# Q/ ~' n
if(huart->Instance==USART2)
{
/* Peripheral clock enable */3 ~0 x8 L2 ~& \9 ]7 f' t9 T0 d; c# R
__USART2_CLK_ENABLE();
5 d! ?# p9 k3 ?2 A9 X, H1 p
/**USART2 GPIO Configuration ( e: Z$ ]0 Y3 s6 U% p. U. ~
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/- a, T' x5 c! @3 D! _1 d, w1 }
GPIO_InitStruct.Pin = GPIO_PIN_2;& @) o, ?- k/ }. w; d; x& P$ e3 H
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;* M- G0 h! f4 Y
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;' N2 E9 y2 E8 _7 O& N3 o
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;/ `) I1 P1 R. w, |
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;/ i ]1 j: U+ J: x6 G j5 O6 e
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;& F/ P1 w3 c3 m0 b7 Q
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);6 K8 ]5 q$ x" ~8 e
/* Peripheral DMA init*/) V; H: J! @8 N5 r$ [" z- n" N+ H
( B6 T1 q$ ?" ]& z. E
hdma_usart2_rx.Instance = DMA1_Channel5;: N' ]' d' l; \
hdma_usart2_rx.Init.Request = DMA_REQUEST_4;
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;/ d2 H Z$ c N4 w5 {. l
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;" Y+ i. E7 k4 E& c
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_rx);
, ^6 [, l9 R" M9 j- ^, o/ X
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
( D2 e8 F7 s: G/ n7 k: j
hdma_usart2_tx.Instance = DMA1_Channel4;$ e( x! H* w7 K$ g, |/ S# B. Q
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;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;, I! L3 E; v S
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;4 C( A+ I& D7 e7 R. j
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_tx);7 W( Y- l9 ~" g: I- A
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);9 d( k$ G* {. `7 L& R' b: j
9 s+ o, Z) M% J' t
}
}
) {- R8 d; J: G, |
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)/ B3 [" u S+ `# Q3 A3 R3 T+ s
{
0 }. t7 w/ I3 Z
if(huart->Instance==USART2)
{
/* Peripheral clock disable */" k6 e5 Z% M9 A7 N# Y
__USART2_CLK_DISABLE();
% A9 ^' ~5 {3 u Q
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*// y/ X, ?. ~! f
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
/* Peripheral DMA DeInit*/
HAL_DMA_DeInit(huart->hdmarx);
HAL_DMA_DeInit(huart->hdmatx);# F1 G! I U9 [- ?5 L1 M
}
}/ r% e: }+ D( j0 E, [. ^: j
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
mpu6050.c1 C9 N/ q: p) h F
#include "stm32l0xx_hal.h"
#include "MPU6050.h"/ `2 H: F- F8 k' D" E6 N$ S
& T" D7 K. |$ O; X! h! F s# q3 L% V
//各坐标轴上静止偏差(重力,角速度)% h8 L+ E. E( z; Y u& p
int16_t offsetAccelX = -195; p; j$ L4 ?, y2 \& h7 A
int16_t offsetAccelY = 560;2 P( Y1 w9 l: a. A8 d/ n3 W* o
int16_t offsetAccelZ = -169;
& v D) u3 X8 T2 d
int16_t offsetGyroX = 12;4 K' x) J1 t2 N! a9 Z
int16_t offsetGyroY = 33;& Y; n' D# _0 ~ `' {. D
int16_t offsetGyroZ = 4;
: J2 p, v9 B. J
extern I2C_HandleTypeDef hi2cx;
+ i8 W# [$ e/ _9 ]- J$ j( D3 l
//**************************************+ B0 F- w. ?' i& C( G3 m2 @
//向I2C设备写入一个字节数据
//**************************************/ O4 u' a7 b4 }+ P
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)4 V3 X% H; P* @
{
uint8_t rxData[2] = {REG_Address,REG_data};" I7 o1 K9 E" f3 I/ L; e |
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}8 l8 |2 }1 Z; G+ P$ O
}* E" C: x l5 k
}
//************************************** }& B, N2 I0 N+ ~
//从I2C设备读取一个字节数据7 v O! s _8 }0 f
//**************************************6 w9 M- ~5 T6 |- e& G
uint8_t Single_ReadI2C(uint8_t REG_Address)6 x, i- A s0 W& `1 G, C
{& C! p& p) t* u# F6 ]0 _0 B j
uint8_t REG_data;( z# T% _* J! x* U D7 B
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)/ d) b" \7 \, H4 P, P) n
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)/ Y) X1 F& i# e7 J
{}
}# `& e1 k6 \8 R- y9 i3 X" b
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)' y7 J( b E2 n' {, n
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}- q$ \& o0 n0 E& C
return REG_data;% _( z3 l7 R. |" ?, s% X
}! ^; p1 J0 g x( J4 e+ z
//**************************************% D( Z- C ?7 ]
//初始化MPU6050 O4 ]+ S4 L# g6 s7 A$ s
//**************************************
void InitMPU6050()8 L& @$ R7 U6 `3 J2 |! `
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
4 g# K# X& m0 t
Single_WriteI2C(SMPLRT_DIV, 0x07);
. N9 k( |) g0 ]" H# P: F `* |
Single_WriteI2C(CONFIG, 0x06);6 d6 ]/ R- r. c1 c
Single_WriteI2C(GYRO_CONFIG, 0x18);) [& Z% J6 C5 _- t! a/ L9 s5 J, u; m
4 W* S* a3 G1 q+ v) b ^
Single_WriteI2C(ACCEL_CONFIG, 0x01);. [" P: Z( f: u$ q
}
//**************************************, r6 z! i7 [9 i) t. D3 U
//合成数据2 ~1 r: X. J; W3 g) C k) V7 d' |
//**************************************- F9 K8 t, B5 J8 P' u
int16_t GetMPUOutValue(uint8_t REG_Address)
{
int16_t result;1 J/ a6 f* z% G Q" [* \5 K! \6 b
uint8_t H,L;
H=Single_ReadI2C(REG_Address);4 F6 o: X( @/ ~7 h1 g' J
L=Single_ReadI2C(REG_Address+1);
result = (H<<8)+L;1 u- J0 |0 [1 {5 d. d) v5 q
return result; //合成数据+ ^ t) c0 C! `3 u
}2 X: u$ R! h# K
/ a, V4 J7 z8 M3 Q% ^
//**************************************
//取某一轴上的加速度数据
//**************************************
int16_t GetAccelValue(char axis): K& P9 | W. Z4 t
{% N; _! t+ s' n
int16_t result = 0;
switch(axis)7 T3 R" d- O* O7 E2 M) j) Z
{- c. O1 Y( k$ H
case 'x':
case 'X':
{$ ]1 P( f* ~! F' Z
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;
}* D7 E3 Q5 w# y
break;
case 'y':
case 'Y':
{ z& C* \8 v; ]5 ?3 c: x
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;2 o4 {7 Y8 E. O' q
}" W) |% E* {- C" z4 }0 u$ F
break;, y% @5 x$ j4 K9 q: P
case 'z':, Z! C! w0 z$ Z2 u8 R
case 'Z':
{5 ^3 ` S/ H! {3 H
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;2 m* g, O8 y6 S& @ A f; v, W. G
}
break;; R4 @6 A5 h4 K8 }3 r `9 |
}% \3 C0 m; y6 b. F1 m# D+ d7 s
return result;
}; f$ }- P$ b3 {3 b) ~
$ a! ]; N. K) D% N& ~3 a% q
//**************************************2 M6 e% Q M0 d
//取某一轴上的角速度数据9 a& u& ]# q `) C. Y4 N
//**************************************
int16_t GetGyroValue(char axis) E2 O1 ` a8 X' j+ B
{; o- b' `( |& T2 T3 A, m
int16_t result = 0;- M O; r8 f" r/ ~4 l, q
switch(axis)
{
case 'x':
case 'X':
{8 p/ U/ i* M$ t. P1 j
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;6 H4 U9 H6 T) z+ q" S
}2 k" a4 J b: x2 R8 w( N+ _1 K
break;
case 'y':
case 'Y':
{. N# b; q, V% R1 j4 c: M
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;' o7 _% ^' R( Z& I
}
break;0 Q. ?# v3 i! g. p3 Z6 M
case 'z':$ A" T: F1 u( d+ Q
case 'Z':
{
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;: P% \3 S, A3 V; ~0 |4 j. ]
}
break;
} H6 l& K j7 J6 e9 o
return result;
}
评分
查看全部评分
{" y) I2 r4 @0 w8 f5 l" F/ ^
/* USER CODE BEGIN 1 */
; k1 g6 Y; ]; l1 O Z% \( I2 [
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/8 d9 O) v3 }! E5 s9 r4 n5 a
7 |& B& I: g. N9 V/ P2 [. y! A. h
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */4 ]# V8 e. z6 `) @* @- P1 A
HAL_Init();7 o ?$ {- P' Q8 a2 p$ |
/* Configure the system clock */
SystemClock_Config();
4 S) P4 W4 |) u7 |6 ~
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* Initialize all configured peripherals */
MX_GPIO_Init();4 A; q. S* s! n. r2 }
MX_DMA_Init();: e. C i/ L2 L5 m& y# Z' a* E9 D
MX_I2C1_Init();
MX_TIM2_Init();
MX_USART2_UART_Init();+ @$ t. Q' ` m& E; t% N
InitMPU6050();
/* USER CODE BEGIN 2 */0 h1 ]" [3 ?* h6 W2 c
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */3 n9 [- T, B$ W/ v% L8 p1 U' M/ Q
/ e8 i- H: m/ p m3 ?5 v
/* USER CODE BEGIN 3 */
/* Infinite loop */, }2 r9 }& j6 C7 `1 w* q U9 b
while (1)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
VisualScopeAngleOutput();
HAL_Delay(100);
}
/* USER CODE END 3 */8 E( j; w5 f. Z X( J% p& ]
}
/** System Clock Configuration. E" k$ G7 \* x e
*/; j5 X; I# o/ Z' @0 G* E* s- J9 h- C
void SystemClock_Config(void)
{ s: Q* h% }& T9 k- D' _
3 r. D) ]5 J, ^+ g, h9 l, D
RCC_ClkInitTypeDef RCC_ClkInitStruct;. B1 c: G* f2 J8 G6 H
RCC_PeriphCLKInitTypeDef PeriphClkInit;5 A- T7 F. {9 S* u7 _' z
RCC_OscInitTypeDef RCC_OscInitStruct;7 U, g* E- |7 i5 [
3 |+ _* Q! r& X# }2 b9 P" ~
__PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
( Y7 G/ f" {0 C3 \
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;0 p6 k" z8 z: S# v5 A
RCC_OscInitStruct.HSICalibrationValue = 16;) R; V2 g& e- n$ L: D$ h& `7 {. k1 @
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;. J! h# a5 m& q) H
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;# A1 x8 [5 a7 n8 |$ d4 Y) b% e
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
HAL_RCC_OscConfig(&RCC_OscInitStruct);5 r9 e9 c7 k( K$ S D D1 u" @
5 e/ r% x8 i& I* ]# ^
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; B, L. `$ g5 A. k/ ^. N
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
1 m- H) \+ S2 V0 o( Q* y5 L9 Y
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;' q1 \0 B4 t7 u, X! W5 K. n2 ?) \5 T
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;$ }, @ U% ^1 |+ l
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);8 Q6 p6 \, Q8 A6 x, i
__SYSCFG_CLK_ENABLE();
}9 ~6 W, A/ y1 J! r6 w- |
) O' o8 v, A7 }. j
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
memcpy(txBuffer,rxBuffer,RXSIZE);" o, |/ ^) s5 [* O8 q* _
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);* O7 m$ J& f( n' z$ k
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);6 F; b j- Y2 z& T# e, Q$ E, D
}
}. U% z, `- Q7 G/ e1 {% X8 \
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 o! U' {# N' w; E- Z+ U! e
{
int32_t GyroValue;
3 H9 q/ @* x( n5 i, b
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();' K- U3 }/ Y f1 x) v7 A% j
ComplementFilter(GyroValue);
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。