拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:& n- d' z3 H& j J P3 G -------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------$ i% Z8 v- d7 |+ [ main.c2 c" V7 Q$ Q/ X# }: f Z$ z { #include "stm32l0xx_hal.h"6 X) o1 Z/ ~; T3 F" S* a #include "dma.h"+ B8 n( s1 F8 z6 Q #include "i2c.h" #include "tim.h" #include "usart.h" #include "gpio.h"( _+ t) D9 l, O+ q" S3 O; G #include "mpu6050.h" #include "visualscope.h" 2 z# [/ ^: R( Q a2 L5 P+ ^ #include <string.h> #include <math.h>. n& N/ i1 t! z6 j5 D" Y, E3 G /* Private variables ---------------------------------------------------------*/ #define RXSIZE 8, {/ g5 [" }$ \ M+ r1 f1 e6 d #define TXSIZE 8( a3 v0 I4 G2 H% ?" K+ E" m uint8_t rxBuffer[RXSIZE];$ A; b& A2 d7 z. ?% U uint8_t txBuffer[TXSIZE];' k8 @' n% p9 t" S' P - S/ a5 ~$ X; O/ ~1 Q1 {6 ?9 P; a float Angle_accel = 0; float Angle_gyro = 0; float Angle_comp = 0;) O6 e/ G% W/ F uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */ /*---------------------------------------------------------------------------------------------------------*/ /* 重力加速度算出的角度 */ /*---------------------------------------------------------------------------------------------------------*// x0 F- n6 C8 E1 ? int32_t Calc_AngleAccel(). [* a @* k b' S! O& _ O { int32_t value = 0; / h" j+ V: L" j' o1 e value = GetAccelValue('x'); if(value > 16384) Angle_accel = -(asin(1) * 180 / 3.1415296);/ k' B7 l _) C$ V9 M# h else Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296);( d6 W q% a/ \- W% I & Y S" l# T$ h return value; }+ H8 k" V8 `( x) G8 C9 P$ ^ 3 u# x0 W6 R) o% x: c! A /*---------------------------------------------------------------------------------------------------------*/ /* 角速度算出来的角度(积分) */ /*---------------------------------------------------------------------------------------------------------*/& v$ [# g1 C: H' ` int32_t Calc_AngleGyro() { int32_t value = 0;) i9 w% T" i3 K, t value = GetGyroValue('y');# {; y( P2 `" V. @$ B* P& E Angle_gyro += (value / 16.384 * 0.01); 0 \7 f& P/ s2 t return value; } * M: s. v1 `& Z* Z2 [ /*---------------------------------------------------------------------------------------------------------*/ /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/9 M: e* L/ v; l0 R! g float ComplementFilter(int32_t simpleGyro)1 ]5 e0 B9 C o/ ~0 g/ N9 a4 \+ ~7 [ { Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; return Angle_comp; }! N& m% Y5 y7 T! \ ' `6 z' T+ X! m) z: N, k1 z+ R" d7 T /*---------------------------------------------------------------------------------------------------------*/ /* 输出角度至上位机 */ /*---------------------------------------------------------------------------------------------------------*/$ k4 c0 h8 N7 J# `$ j void VisualScopeAngleOutput() {1 s9 [, J- K3 Q0 j- F3 x 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);. ?, r T& ^- m( t5 w) f D4 x8 g8 N# u , m0 m/ h& U- d- j. y outAngleData[0] = AngleValue_Accel & 0xFF; outAngleData[1] = AngleValue_Accel >> 8; outAngleData[2] = AngleValue_Gyro & 0xFF;, j' \" T4 W" O9 ] outAngleData[3] = AngleValue_Gyro >> 8; outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8; //计算CRC crcValue = CRC_CHECK(outAngleData,8);: ]) a) T5 ]8 B! L. `6 l outAngleData[8] = crcValue & 0xFF;4 I: |8 P: I" m6 |4 ` outAngleData[9] = crcValue >> 8; //发送至上位机0 i; e- H1 p% u$ }: T9 T9 _% f HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData)); } /* USER CODE END 0 */ - ^* P7 x( _8 G- @ /* Private function prototypes -----------------------------------------------*/( o$ x7 @7 j& h! A% U& T void SystemClock_Config(void); / x9 h: {5 C" k* ^3 F 3 p: u6 ^& K0 \8 E. [3 i' ^3 }; q 硬件连接图: 波形图: ~6 X& c$ \& T 最后加一个视频:7 a d9 I# E3 @% I) E4 O 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"
#include "gpio.h"
/* USER CODE BEGIN 0 */% H4 r) Y+ i+ r: x
% Z( P0 m: L- S1 ~* X
/* USER CODE END 0 */' r5 {# I( W. e7 r! B6 [
6 K/ p! F; J6 Q+ Y/ o. ]/ m
I2C_HandleTypeDef hi2cx;
( ?7 T. u, M4 U% E( S! S
/* I2C1 init function */
void MX_I2C1_Init(void)
{
$ Z1 J# c$ E# Y
hi2cx.Instance = I2C1;* \" T1 h/ ?1 T3 z0 V2 V T
hi2cx.Init.Timing = 0x20D22930;
hi2cx.Init.OwnAddress1 = 0;
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;+ g, s+ p, _( W6 I- G. S. H
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;5 Z# t, m' r, z" V0 [) \
hi2cx.Init.OwnAddress2 = 0;
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;, D3 l6 m$ V& Q7 y6 K2 L6 x
HAL_I2C_Init(&hi2cx);
/**Configure Analogue filter, k ?- Z6 h/ K2 n* Q# ?( R7 X
*/
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)7 ^% ^3 A$ I i- {' k
{5 I, ~8 F0 D; c+ C# p5 Q
8 Y& b- Y0 U* ?' s6 p
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1). g! {( |0 u$ I* t, Y8 O& O/ J
{
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
3 f( W2 s" ]4 d% m) F. I3 q
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA! T' c% s5 @( w( u9 l& w
*/; D8 G, S/ j* c3 w/ ^9 Z3 s- r! x# M
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;* ]" k6 F E8 U5 L- t4 A# m, l
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;+ e/ `) C7 m8 k) J# }& ]0 B
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);$ k. ]! T/ b4 W" t* ?) H" }
0 z* F% v7 ~( o$ @ }
}% W4 \6 L* u! g; ^% y3 [8 R. C" h8 p
}
! q+ S4 p% q: a7 e% c! q0 o! Y# z
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{3 B6 n/ n$ `, _% h8 l: V
if(hi2c->Instance==I2C1)
{
/* Peripheral clock disable */* s" j- L' M* p" x1 y( w
__I2C1_CLK_DISABLE();" v; Q( z5 W3 z4 l# _! B$ v
) @& i/ X9 G) `8 A8 {' @
/**I2C1 GPIO Configuration * n" F* g- z: l' o, p( [* t
PB6 ------> I2C1_SCL8 v6 ^3 G4 s% P2 f! g* M2 T
PB7 ------> I2C1_SDA1 U. O% g, r# F$ u& c0 D* ^! H
*/' g t0 \. H8 ]* T5 f# N
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);% u- |' e8 n0 B! f0 s% a9 Y
}
}9 [0 z* d, N) O: V; |. _8 W% Z
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
usart.c2 @) Q( X/ P' C7 _* R
#include "usart.h"
#include "gpio.h"
#include "dma.h"/ T/ j* E; C. V6 J# L
. ~& K3 u* o9 e5 {5 k, c
/* USER CODE BEGIN 0 */4 t9 e/ ^9 j' F9 I& \
/* USER CODE END 0 */- z8 \; U7 ~& S. I& L
UART_HandleTypeDef huart2;3 r1 z8 x4 f7 A$ P- Z' N; _7 d
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;* [5 q- T( b! i
) Z' |) x0 R1 y$ ~- j* x
/* USART2 init function */
) o; z& z/ g: D
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;5 |/ Z" x3 Z, G% W
huart2.Init.BaudRate = 9600;8 K, G0 t' H. W- ?
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; A6 c0 Z- P4 d% Y( w/ e7 `
huart2.Init.OverSampling = UART_OVERSAMPLING_16;6 S; t7 X7 _* Q& i/ ~$ B* t- g
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart2);
}
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
8 v8 w6 a" o; u9 ~) ]
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==USART2). [" t3 ^ h: M3 q: r' ^; w
{1 T/ M# W5 w6 a) {+ |
/* Peripheral clock enable */
__USART2_CLK_ENABLE();3 n9 H) F3 f7 n9 L: b
! q2 T! P( O$ D/ m) T2 a
/**USART2 GPIO Configuration 5 s4 q$ B k( N
PA2 ------> USART2_TX" Z+ ^9 v" t0 F2 _! ^6 I
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;) S3 {2 y2 D% W) L$ b( p
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; \' r+ @- P: D6 @4 e4 V
GPIO_InitStruct.Pull = GPIO_NOPULL;7 j; x! [: l9 W+ w
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;* ^. P. j* v9 W9 u
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;2 b9 Q U. l2 t/ m! k5 N+ L+ Z
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);: ^) G* U' q+ P1 U; u3 _+ s
GPIO_InitStruct.Pin = GPIO_PIN_3;2 U0 x! r5 U/ v
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;3 X4 C) S. Z! h- M' @! b* O
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;8 N9 Z5 c* P, Q p
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;% ?, ]& J1 f0 G5 d7 w9 `
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);6 b1 q8 e# O$ `
/* Peripheral DMA init*/
hdma_usart2_rx.Instance = DMA1_Channel5;& Z% q* W+ ~! O
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;& u: e2 J- d. |/ x
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;& P7 o# G6 t. N! O6 D8 N1 ?+ l
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;% Z5 @- e, n' z' B* m/ {2 m
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;6 u3 u: k! P4 B/ W9 a4 t
hdma_usart2_rx.Init.Mode = DMA_NORMAL;* X' s; N& c# g6 q
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_rx);
* k. j z$ {7 B
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);9 b& i' K& D8 E6 d! k( @
hdma_usart2_tx.Instance = DMA1_Channel4;+ z2 r( T. C7 V/ Y, s1 O" \/ V
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;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;5 E4 a' E' k' q( l$ ?, q
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_tx);3 G( C. G$ V; J s$ ~% U. S7 `
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
} P; ]4 V! ~; X- n+ @
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{$ t# S( e4 }/ d2 ?5 T6 `* {1 L
if(huart->Instance==USART2)
{
/* Peripheral clock disable */& U+ H# l7 u! h1 a; M
__USART2_CLK_DISABLE();4 _2 A8 n; B7 K) G, w! j
/**USART2 GPIO Configuration ( O3 p' o- o7 o9 P& C7 \# f& |
PA2 ------> USART2_TX+ ? T) B4 q4 ~; S! q
PA3 ------> USART2_RX
*/- J2 V2 @% m0 [) ~+ I% `
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);( [( C; H( T& q
/* Peripheral DMA DeInit*/
HAL_DMA_DeInit(huart->hdmarx);
HAL_DMA_DeInit(huart->hdmatx);
}
}; i6 u3 K9 B# U0 g
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
mpu6050.c2 e0 ]( O% ?& c- M. k7 _9 ?
#include "stm32l0xx_hal.h"
#include "MPU6050.h"
//各坐标轴上静止偏差(重力,角速度) j8 m! i% b, n$ h
int16_t offsetAccelX = -195;
int16_t offsetAccelY = 560;
int16_t offsetAccelZ = -169;' t; Y" b+ d3 S$ _
8 C7 T! y( L4 U& A3 b6 s. ~/ S! z
int16_t offsetGyroX = 12;
int16_t offsetGyroY = 33;# G- W0 i. s- C" ^- g
int16_t offsetGyroZ = 4;* q8 p! e; C3 e" S; a7 b" b
8 T @( c. S& \" I: ] |
extern I2C_HandleTypeDef hi2cx;2 F; `8 F! `! @. e2 }$ @ Z
5 O! P% M0 X7 Q
//**************************************
//向I2C设备写入一个字节数据" G ^3 a& f% x& \) V0 I% b8 g8 N& r, v
//**************************************! f7 u/ [# @& E/ I. {) M
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)/ \/ G) S- @& f% p- m! k3 [
{3 i2 P2 P' [! E# p
uint8_t rxData[2] = {REG_Address,REG_data};3 j& V6 F* m/ Y' W. e3 V; |
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)+ ~; N! u. \& q" N8 t s0 \
{. C. {" Z0 f# [% u
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}
}
//**************************************) p1 P% Z/ s2 x+ n
//从I2C设备读取一个字节数据4 b. f3 m0 E& U% h3 K
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)2 a/ @3 R _9 E, }
{! T+ p9 }4 t& v( i
uint8_t REG_data;
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)
{$ d D2 p3 C/ F, V8 C
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}5 u( X v8 ^: f7 ^9 N( o/ {) M% {
} N# \: }/ E; G5 a, b7 p
% D9 _9 W& g: K6 N
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK)
{; j! {! K3 C8 `( m; Y5 t
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}# V% i* ?4 ~) ^. Y8 d' _' ~; W
}
return REG_data;
}) S0 \3 O- b2 ]# @+ q
//**************************************
//初始化MPU6050
//**************************************% G/ y8 d; Q7 P! \4 n3 n* L
void InitMPU6050()9 M7 r4 X/ ]) m. f
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态9 t4 d. C6 |$ D2 |( g0 i* b0 j
5 n) t6 X- ~1 |. b* M! b$ K) O
Single_WriteI2C(SMPLRT_DIV, 0x07);. C# F: @# s2 ?" L* v: `
Single_WriteI2C(CONFIG, 0x06);
$ h& h7 I$ n2 h& B
Single_WriteI2C(GYRO_CONFIG, 0x18);1 f* y% Q5 B$ n# F
# j5 ?) A, r6 V( }2 m8 n/ M; d
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************# Q) r) y, ^4 r( \8 S& K
//合成数据
//**************************************7 L a! _8 {7 D: y4 f F
int16_t GetMPUOutValue(uint8_t REG_Address)4 l" v, `5 J6 h
{
int16_t result;# d" _/ C3 a: J+ `5 Q. I) j
uint8_t H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
result = (H<<8)+L;. ]3 q% P' ^( @9 b% {+ n
return result; //合成数据
}8 J' ]3 G$ M5 E
. ~. U+ R1 C5 Q# q& V
//**************************************% H9 `2 h5 z6 k9 a# Z& G6 d
//取某一轴上的加速度数据: M, E1 p( |, u+ M% ]
//**************************************
int16_t GetAccelValue(char axis)
{' D9 _3 |- u5 b
int16_t result = 0;, z( z0 I/ `6 y1 U
switch(axis)) ^* C- ]0 O5 o6 a8 B- E
{8 {: ^6 f% D- |( Z( x Q
case 'x':
case 'X':( D: _! `. |( G. V
{
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;
}
break;/ [9 s# K9 U6 }. I% J
case 'y':5 e6 T- N) T \5 q. A
case 'Y':
{: `) u6 c- H- g3 F$ y- ^+ r) W
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;& F- }# Q L; t; |
}$ l, q8 ?; l! }. B
break;4 n4 c3 ]5 J0 c- c1 v, s( A- ^: c
case 'z':
case 'Z':
{
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;. }2 g3 G8 Y. Z3 p
}
break;
}! C2 A, I% H& L# [ u0 b
return result;$ `( O" @1 z% u/ S( v2 v( } }
}5 V# s, i& S) ]7 [1 Y' i d1 m+ v$ Y
! O$ G" O Q, v3 k+ ]
//**************************************
//取某一轴上的角速度数据
//**************************************
int16_t GetGyroValue(char axis)
{
int16_t result = 0;
switch(axis)& C; a7 x' v6 C% _* v) h
{
case 'x':$ l( r. W7 d7 R! ~; O
case 'X':( i, d* q; z- J; x f
{2 Z0 T' G0 L- {9 P9 A4 F- S# t7 Y
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;+ N% M& z/ j# E6 x9 e
}& n/ D! B2 k2 T$ l$ ?* j$ T
break;8 u* D- [$ w/ ] k0 h( H
case 'y':) X7 n9 O( j& r6 ]/ B9 t
case 'Y':: c- J4 @0 p' m( p
{
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
}1 }0 R( o" A) b
break;. w: U( O' A, ?7 s: M
case 'z':
case 'Z':) ^7 w( R& ?0 w' b6 D" N
{
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
}5 x) Q$ ~ c, Z5 V2 ~
break;
}
return result;
}
评分
查看全部评分
{
/* USER CODE BEGIN 1 */
3 M& D; F; k* W% y9 Z
/* USER CODE END 1 */% T- U- t, L* [3 R7 Y
/* MCU Configuration----------------------------------------------------------*/* A& N8 q9 T ^ A2 M* U: S0 p2 P2 |
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
7 p3 c5 i- h) i- n
/* Initialize all configured peripherals *// k @- L- t3 M( _
MX_GPIO_Init();' B6 ^8 V8 Q7 ^. P7 O
MX_DMA_Init();
MX_I2C1_Init();$ O& J- `! _9 l8 ]! M4 Z4 l% {
MX_TIM2_Init();
MX_USART2_UART_Init();+ {: A! e# D& P* Y
InitMPU6050();
6 c6 T! S* f6 y( M" J5 h
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);+ k: h! b3 t# z
HAL_TIM_Base_Start_IT(&htim2);6 q$ J" F5 c+ V5 X& J
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */* L0 m7 L1 i o+ k" e+ c
/* Infinite loop */1 n; ^7 v; q+ ?& b
while (1)- B% j/ K8 j2 s# a/ o1 |# }8 A1 H, Y
{9 {- F; i9 e$ D9 v2 L6 ^; k4 M
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
VisualScopeAngleOutput();
HAL_Delay(100);9 u- L- U3 u" E. `+ I: Y8 Y" K$ i
}
/* USER CODE END 3 *// o# ^' L+ ]; B
+ V p5 G) K0 r
}6 j* X+ l6 W* d3 }8 X2 K
& ?( |0 `. I* x+ y* o" n* {' o
/** System Clock Configuration' U7 {) s/ a7 X, S2 A. O6 ]
*/( B5 k& B, j* Z+ A. |9 K5 B
void SystemClock_Config(void)$ j+ T$ v$ J4 y8 A& ], M8 C# p$ e
{! }6 Q$ _. \2 f5 f3 n
RCC_ClkInitTypeDef RCC_ClkInitStruct;: d6 U+ |, G0 ?3 M; G& v6 i7 t
RCC_PeriphCLKInitTypeDef PeriphClkInit;7 |% b7 E7 v2 O. y4 W& n4 R8 m
RCC_OscInitTypeDef RCC_OscInitStruct;
__PWR_CLK_ENABLE();
1 x, {) g" ?0 v! O: d
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;; |3 J+ X/ K' a5 Z7 D/ g+ O
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;! O' u+ [% Y6 Y
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;2 e6 A+ d" P( z% _: N: h( M0 X
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;- _, C5 x* y$ O, {3 }4 _! H
HAL_RCC_OscConfig(&RCC_OscInitStruct); x$ y9 s8 U. R( a. u
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;; v: q9 z. j9 ^( f2 ], v4 `1 u
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;/ k1 F q( e9 G% v
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;& B9 _3 U6 _; \$ f( L* E7 P
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);7 Z _8 e+ ~1 C a5 _8 A9 f0 L
__SYSCFG_CLK_ENABLE();
0 O b; x g$ d
}+ ?& b" B W# E. `6 X
9 }/ x* ?9 C7 i) Z. D
/* USER CODE BEGIN 4 */9 c6 z1 Z) m) H& y+ N+ R
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)* h n7 b6 c! C" y z# l' K( V
{
memcpy(txBuffer,rxBuffer,RXSIZE);
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);- x; B/ t4 x. B3 `! s4 N
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}
}
; d( U9 N$ ]6 w& ~: \
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)+ p. A4 _- u9 M2 e
{$ S4 U/ l( d. F: U: ?; r5 }8 n" b
}5 D, E, [& t. l' y4 `2 I8 q( @
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ P- L8 {3 X/ I4 D* O3 U/ v9 r
int32_t GyroValue;' g3 L% k( x, t* m* }2 V' O) Q
' Q$ I' s7 P# A+ R9 a+ m3 {
Calc_AngleAccel();6 y" h1 y, \: U9 S7 F) G) x
GyroValue = Calc_AngleGyro();
ComplementFilter(GyroValue);) A& X, g) ^: j7 k) X
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。