拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码: -------------------------------------------------------------------------------传说中的分界线----------------------------------------------------------------------------% X0 V1 f6 X5 D( G3 m main.c; X& s) Z; a! E) P9 ? P: w+ p: f #include "stm32l0xx_hal.h"8 v) u+ c5 Y; i" s/ T N #include "dma.h", Z" C$ m% i; j #include "i2c.h" #include "tim.h" #include "usart.h" #include "gpio.h" #include "mpu6050.h"+ e, z. O3 O: g #include "visualscope.h" #include <string.h> #include <math.h> $ K7 c8 R ^6 q4 I2 ? /* Private variables ---------------------------------------------------------*/ #define RXSIZE 8 ?8 q0 Z, S' t5 C# U Q" J4 j #define TXSIZE 8 uint8_t rxBuffer[RXSIZE];, s, I! p! C" i$ m, U6 @ } uint8_t txBuffer[TXSIZE]; float Angle_accel = 0; float Angle_gyro = 0; float Angle_comp = 0; P3 a- ?2 t# `3 z$ E uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */' T0 b% v- ` |6 G0 E k9 n1 t 7 x' t9 F' b: ]% h: g /*---------------------------------------------------------------------------------------------------------*/6 B3 i' g; O- q. K. P! A /* 重力加速度算出的角度 */ /*---------------------------------------------------------------------------------------------------------*/0 X, W: v( _5 r1 j int32_t Calc_AngleAccel()( Q$ F% i; r) }) Q) f {0 |3 e; O! g+ t8 F* K int32_t value = 0;- W o- {/ I7 _ N' ]% N" k* l value = GetAccelValue('x'); if(value > 16384). x! U; I! A1 ~# g/ u/ B5 l# U Angle_accel = -(asin(1) * 180 / 3.1415296);0 s2 x2 K# W0 ^9 @ else Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296); return value;! w1 e/ H+ Q7 y; E# ^' L } : b# w' x- o6 M /*---------------------------------------------------------------------------------------------------------*/ /* 角速度算出来的角度(积分) */3 f2 M/ E. [2 z& N+ ~ /*---------------------------------------------------------------------------------------------------------*/% l ?% W8 k) F1 X6 [3 [ int32_t Calc_AngleGyro()) ?# u! v' I* Q! c {0 G( E) Y8 ^; N, }" i! \ int32_t value = 0; value = GetGyroValue('y');& k9 l! x/ b/ p7 X- c Angle_gyro += (value / 16.384 * 0.01); & t5 T5 e' R9 [" a. Z1 P7 p4 k4 W return value; } - n/ j( D- @: A# |) N /*---------------------------------------------------------------------------------------------------------*/ /* 互补滤波求角度 */ /*---------------------------------------------------------------------------------------------------------*/ float ComplementFilter(int32_t simpleGyro) { Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; return Angle_comp; } * y& M. j4 G" Q3 n; h, u- c8 o5 | /*---------------------------------------------------------------------------------------------------------*/ /* 输出角度至上位机 */ /*---------------------------------------------------------------------------------------------------------*/8 \. i7 M; G) `3 j7 R void VisualScopeAngleOutput() {: q8 ?! G9 L6 Q7 U# J" G int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp;% |9 o t' h- s0 O uint16_t crcValue;+ j9 x1 j, U- X( L9 Q0 t% f & f8 h6 x" b) q; I AngleValue_Accel = ceil(Angle_accel * 10 -0.5);- E" b0 b1 _1 S$ p u# E5 h AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);. v# r0 G* g0 b8 j! E AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);+ O$ {/ ~9 e" j! h. d& Z9 X& A outAngleData[0] = AngleValue_Accel & 0xFF;9 b8 K% I( b- y( k/ H outAngleData[1] = AngleValue_Accel >> 8;& h3 W- b, n5 i8 { outAngleData[2] = AngleValue_Gyro & 0xFF; outAngleData[3] = AngleValue_Gyro >> 8; outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8;1 b; T; Z, [7 v! L: G //计算CRC, F1 b8 c# D# c crcValue = CRC_CHECK(outAngleData,8); outAngleData[8] = crcValue & 0xFF; outAngleData[9] = crcValue >> 8;* P8 a1 c! J, d/ \3 W2 i //发送至上位机 HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData)); }; n$ p; z4 R; z /* USER CODE END 0 */+ ]$ g* T' p# K9 {6 u& ^2 ?% Q /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); 硬件连接图:3 B) E' t( X, d# Y K6 g, k 波形图: 最后加一个视频: STM32L053 演示, Q3 E1 S$ M. g# o. n; z. P+ d |
聊聊 STM32 MPU OpenSTLinux 实时扩展包 X-LINUX-RT
意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS
【STM32MP135-DK】裸机移植shell
【STM32MP13DK】 在Linux主机上交叉编译一个Hello Word应用
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体在意大利建SiC整合制造厂
轻松地实现ClassB在STM32CubeIDE上的移植
ST历史小知识(6)- 与世界共同塑造美好明天
ST历史小知识(5)- SiC衬底进一步发展
ST历史小知识(4)- 投资未来
#include "i2c.h"
#include "gpio.h"
, o n/ V% Z) i" J. X
/* USER CODE BEGIN 0 */1 L0 |* e& M; G1 m7 i
/* USER CODE END 0 */( X1 v/ M. A! a5 U) I- H
I2C_HandleTypeDef hi2cx;/ n' N$ a3 b. w* r- D
: G+ a2 `9 s( D3 }
/* I2C1 init function */
void MX_I2C1_Init(void)
{4 Z3 ~, e, c' m
hi2cx.Instance = I2C1;% ]# `2 h! _9 a8 {
hi2cx.Init.Timing = 0x20D22930;
hi2cx.Init.OwnAddress1 = 0;
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;3 h1 h1 g# w" i# Y7 N' e( ^) n2 z
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
hi2cx.Init.OwnAddress2 = 0; p- z- C% ~( n/ t! C* H
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;3 C/ I2 H$ q! s6 e" D S
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;2 N9 F% L+ D0 l# o& U
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
HAL_I2C_Init(&hi2cx);1 k! p2 q; h% x {
/**Configure Analogue filter; g7 Q9 S, b5 g s) y% P
*/
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);+ c2 U4 E- d: H4 C! L# S; Y
7 m- L* H- M! w6 r# \; p. ^+ s
}
7 G1 R) e& Q6 O* x$ v: {
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c), P7 Z2 R& c6 ?& u9 Y! u* }+ T
{
GPIO_InitTypeDef GPIO_InitStruct;$ @7 G: l0 Y. O5 \
if(hi2c->Instance==I2C1)% O( K2 ]6 ^& ]/ ~1 p. K j# }$ l
{
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
. `: t2 f! T7 l
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA2 c4 P( \4 u+ M
*// F' z2 u' m# ?
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;' [1 z& R5 l) F3 Q" H* f% r
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; K6 P# h4 {7 o/ E
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;- \' i5 |6 q$ e3 P* X: k- Q
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);& I- Z( ^) `$ d2 n: Y/ X& c
; o4 v+ X7 m h
}8 F: [7 ^7 e: R1 ^! U
}. l) ]$ y- E. A" b \" w
# N& z* i8 ]3 ~, \
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)& D" b& g: n- w J- h" t; N
{* J9 P2 H2 v7 ], i% H! |
if(hi2c->Instance==I2C1)
{
/* Peripheral clock disable */
__I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration ) W# o( r, K+ C( R6 j+ w' s' q
PB6 ------> I2C1_SCL) x6 N7 X. J" ~4 M
PB7 ------> I2C1_SDA6 ]4 h1 k8 o% a/ A3 `* K- {0 ?
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
}' Y0 Z7 b3 ]# `8 o$ Q
}
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
usart.c& ], r5 M* ^8 H- v+ p6 d2 a
#include "usart.h"# @& k$ V- L1 _! k$ w2 m
- Q3 X* f; y2 |8 ?- k
#include "gpio.h"
#include "dma.h"$ {& t3 W" @$ F. b
% d! x; L- e: S! {
/* USER CODE BEGIN 0 */2 f# |+ X: I9 @
: c' t9 A6 t- j- g- {
/* USER CODE END 0 */! g$ F, D/ L0 G% s* o3 m
: T# j0 J- T& o* ]1 @/ \) s
UART_HandleTypeDef huart2;/ R7 W, x, a) z: }" Z1 F4 ?
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USART2 init function */
' B5 I4 |) {( n9 Z
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;) |" C+ ^7 j: ?2 t
huart2.Init.BaudRate = 9600;$ K& @3 H! v5 G
huart2.Init.WordLength = UART_WORDLENGTH_8B;& M; P. p$ D+ P5 @. _) |$ H
huart2.Init.StopBits = UART_STOPBITS_1;' S5 Q1 T3 S+ N0 q
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;7 Y4 x( |) |3 H
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart2);8 S8 d* |$ w8 ~2 s9 X
}
/ h& h1 d: k& s8 h
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
$ t6 L i4 L' ]" Q' H% j5 G. U
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==USART2)
{ f F1 K/ J' s% ~
/* Peripheral clock enable */
__USART2_CLK_ENABLE();
- D, j: P& O- D, L
/**USART2 GPIO Configuration
PA2 ------> USART2_TX6 ~& r: } Q/ A& f1 W# _& H4 W
PA3 ------> USART2_RX" e) d! Q2 ]$ ]$ e. T# ]# h( w
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;, c/ H: s+ O+ H1 ]: n4 J
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;2 [$ C. {2 d: i' Q9 Q
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 {! z2 v4 f% y9 p9 [% A
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;8 Y# x' d. q0 b% Z* c. j+ M Z; z7 L
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;" q% k6 ^* j" {# g9 o9 a
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);' Y" w$ C8 m: k4 ~$ V7 n
/* Peripheral DMA init*/
1 t& [% V0 y6 u
hdma_usart2_rx.Instance = DMA1_Channel5;
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; Q8 ?3 L% I6 J; O3 c
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;' K8 t _+ Q& y8 W7 U3 m/ o+ G8 V4 A y
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;+ y% |5 T* y7 ^( [
hdma_usart2_rx.Init.Mode = DMA_NORMAL;* `/ t+ B/ E& R4 d% Y. O
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_rx);
+ p3 C! X) O W/ q* q
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
hdma_usart2_tx.Instance = DMA1_Channel4;3 f3 n' c3 }& S& f5 r2 j B5 i, E
hdma_usart2_tx.Init.Request = DMA_REQUEST_4;% V1 i2 ^5 l$ A8 `' G9 z1 z7 C
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;' |! U7 x5 [+ y' R
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;, A' G' d) k* R8 K
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;: X2 c+ m3 Y& q: Z# I3 O
HAL_DMA_Init(&hdma_usart2_tx);
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
Y# k- r% m6 r- a
}9 @; F N: p# s1 y1 {
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
if(huart->Instance==USART2)
{
/* Peripheral clock disable */# T$ P/ r k/ \+ \: ~
__USART2_CLK_DISABLE();
" ^9 {4 {+ z. r8 O9 j# J( e
/**USART2 GPIO Configuration 9 a8 g& e _; K# r* g6 P$ ]
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
/* Peripheral DMA DeInit*/5 D2 T0 B4 M- b. Q
HAL_DMA_DeInit(huart->hdmarx);7 y' m2 S" W& x' A
HAL_DMA_DeInit(huart->hdmatx);
}7 ~+ j# Q) |! p) r9 b
}1 a) ~- o: I0 w; n; l- \+ d! }
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------, u$ T/ N" {& C u1 A
mpu6050.c* M& t' s# Z2 }( [/ J
#include "stm32l0xx_hal.h"
#include "MPU6050.h"
//各坐标轴上静止偏差(重力,角速度)
int16_t offsetAccelX = -195;
int16_t offsetAccelY = 560; a5 ]" C- M8 h+ R& D3 w0 ^' \. i
int16_t offsetAccelZ = -169;0 T2 ]$ n0 V$ ^; V
int16_t offsetGyroX = 12; x# u- Y6 l4 K2 r% l/ p
int16_t offsetGyroY = 33;
int16_t offsetGyroZ = 4;
8 K4 b7 z2 |5 W9 z6 T+ Z
extern I2C_HandleTypeDef hi2cx;
7 `9 }9 `$ l2 ?' {0 C" {
//**************************************
//向I2C设备写入一个字节数据
//**************************************9 Q1 O* M% t. j1 L& N; k
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
{ r# i/ _# }: o
uint8_t rxData[2] = {REG_Address,REG_data};
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)1 G$ j1 b l. [: M
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}
}& b* R1 Z% ^2 P C. n3 U S
//**************************************. N' P; m: p3 f" V' V( ]. }
//从I2C设备读取一个字节数据5 o" {; H# X. F3 q: r& p1 z
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)$ f6 z. C8 L4 h% B& ^# Z* {
{ ], F0 b- g9 e' {
uint8_t REG_data;
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)1 K2 e% k. R! b$ W- m) w$ t
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF); W$ r$ T8 O7 o9 j) O
{}
}
3 M7 B; G% p) s9 E- t
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK) u3 N% D) h4 X# C! O
{ B" M+ Y, I( [
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)$ O! Q, S8 v% E1 {& z
{}
}5 ]' P9 M. L- w5 d8 l2 g
return REG_data;1 `9 e3 Y2 d3 s2 D: {
}8 |6 Y7 _$ t' q* o; [
//**************************************. `# m' p" t0 ?' d6 i
//初始化MPU6050/ n9 M. x( y( e* J
//**************************************
void InitMPU6050()
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
Single_WriteI2C(SMPLRT_DIV, 0x07);" F# Z% x) }9 ^8 `
Single_WriteI2C(CONFIG, 0x06);2 K7 f& P' A$ h- e) }
Single_WriteI2C(GYRO_CONFIG, 0x18);
& `* j4 g+ _) G4 U, g8 {( `
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//************************************** H* f$ q% o% b( ?& F
//合成数据
//**************************************0 X0 `' L) B. Z; z3 k, O. K
int16_t GetMPUOutValue(uint8_t REG_Address)$ r7 g0 T" Z9 x% I
{
int16_t result;1 F' A0 U& X% n: I- r% m0 y1 ^
uint8_t H,L;9 Q* D" p. g) j$ E3 S
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);, p- e" C( V1 X2 D ?# A
result = (H<<8)+L;2 e+ o* Y7 ~; P* \5 |
return result; //合成数据$ G) `# ?2 a3 h# Y
}$ M9 r$ W- ?6 i; e: e6 e4 N
# G/ t; {$ Q/ \ C
//**************************************- n8 v9 a" t2 n
//取某一轴上的加速度数据" G$ r7 f) ], p& C9 Z% \* k
//*************************************** c* i! q; l8 K% [' R
int16_t GetAccelValue(char axis)
{0 V3 L0 U# m" y6 H5 N6 m$ ]
int16_t result = 0;
switch(axis)
{5 {6 x% x8 k& m& {
case 'x':
case 'X':
{
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;4 z ^7 j. B+ v8 \2 d! s
}! F( ^" z" E) \9 m
break;
case 'y':
case 'Y':& j; Q1 U% `/ I% x% t
{
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;; b& R. Q; m# D8 a! Y, a
}
break;
case 'z':6 [- `. M# Z: F5 `5 e
case 'Z':1 t8 {/ U9 J1 Z' o" U0 n& V/ V
{$ b2 W& X. @- ]
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;3 e. L, J+ k1 c- L9 ?# a( S$ M
}
break;
}
return result;+ }/ g2 z9 Z; C$ C6 P" X8 x$ T# D
}
9 X) z1 l7 S9 t H! l: f1 I4 U
//**************************************( o% |% s- Q0 F9 q( }
//取某一轴上的角速度数据
//**************************************( |9 z( ^) E! o6 s/ f1 {
int16_t GetGyroValue(char axis) n6 J+ W" k- E# I
{8 {2 |% X- T- Y Q# i& a# a5 z9 l
int16_t result = 0;5 Y& {+ g( N/ z# U8 T0 y" l( }! O5 O
switch(axis)% Y/ c, P: P5 y8 x5 }. N1 s8 s
{* l0 p, J6 G& }' f
case 'x':* v9 i* e" Q7 c `* h: {1 U* P
case 'X':
{4 P) P3 l4 Z1 O/ f) `
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;+ o. ~3 N4 B C R+ V
}
break;# ]- \$ M0 n* }/ E8 t: X c0 T% k
case 'y':
case 'Y':$ }) a! u3 k! s! s, T _: |
{, J, H+ W0 b1 H! x ^
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;& h2 U/ O9 N, n' M
}
break;
case 'z':9 ^+ J- r+ \# `4 y+ m5 Y
case 'Z':+ w) N7 U. M% \6 t
{" S0 M2 E( [0 p E+ E) x
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
}
break;
}& }8 S: g/ {, b( O$ y, r' Z
return result;1 @0 W! c! z( T" T. b- c
}
评分
查看全部评分
{# V/ D: U, F% m5 M3 U7 r5 v; H
/* USER CODE BEGIN 1 */; [6 Y5 w' I# N) p
' l. l& ?! ~" H
/* USER CODE END 1 */0 u" A3 F! u1 n8 o* z! _, g
/* MCU Configuration----------------------------------------------------------*/3 ~1 c$ i% p- D$ ?/ e5 K
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */9 I, o$ E3 ^! R+ m
HAL_Init();; j; J L% Y$ j3 ^ J
. \4 F0 q1 @! x8 R3 H1 _+ v6 V$ b1 p( |
/* Configure the system clock */" ]. F1 b9 A. \; U& m: |, ~
SystemClock_Config();
% }+ C- ^0 ~( {& g6 p( N( Q7 O7 M
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);. E( [% N; R, Q0 F
/* Initialize all configured peripherals */2 \, o( w& e# r
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_TIM2_Init();
MX_USART2_UART_Init();
InitMPU6050();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
HAL_TIM_Base_Start_IT(&htim2);: L& ]& J0 [/ X, ~
/* USER CODE END 2 */6 f% I) l5 ^+ i$ I
8 S7 }. \; v% N! ]4 ?
/* USER CODE BEGIN 3 */' y: H+ ?0 ?( W8 z- P% _
/* Infinite loop */
while (1)2 \' t4 J( U: p9 I% v3 g
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
VisualScopeAngleOutput();5 x8 G# g0 I' i8 }
HAL_Delay(100);9 |0 V. x* ?' s! @' \& D
}
/* USER CODE END 3 */
}
/** System Clock Configuration- `: e! E) d# I, j& o; K, x5 z
*/. {" h @8 C* P% t' ^" X% C
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;. n4 e+ g3 ~7 Q* k9 [
RCC_PeriphCLKInitTypeDef PeriphClkInit;5 C& d; Q& @) g9 E
RCC_OscInitTypeDef RCC_OscInitStruct;
$ x. h" Z7 ~) q1 E6 |: S0 M* @, w" z
__PWR_CLK_ENABLE();
~0 i/ Q1 S: Q4 J* k9 t
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);! L/ ~5 n+ S. U9 h
! {0 U9 W: m% |% V3 S8 q3 Y- k3 c
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; p0 y4 Y. A. n( B R9 x1 h
RCC_OscInitStruct.HSIState = RCC_HSI_ON;: h" I v) q: ` R/ U5 a
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;- y1 q" \% K* b# u/ _- N/ v
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;9 ]0 R0 D$ X! H
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;" m5 d, I7 W) }0 q* f0 c
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;7 j' V0 I& N+ H( J; r) t1 V
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;: [1 I, r \/ F3 L
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;9 @, u1 b! ^4 F5 [% }
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);5 m! V0 z8 X' Q/ q7 _6 l8 Z, V
9 t0 }! d8 f/ \& G
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;+ d/ e( x& W7 F
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;) f( b5 d8 L7 v8 J
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
6 d& t/ r h: E" v9 ?
__SYSCFG_CLK_ENABLE();
0 k6 H! B+ {1 W% z: `+ [
}
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
memcpy(txBuffer,rxBuffer,RXSIZE);. s) |& J/ s9 _
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);3 x5 J, {: {& |* G: B
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}
}9 o3 K- h$ e* H/ Z7 E" L. M
& s9 U5 ^1 A/ R0 F" n
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
N0 X- D9 l, c4 M2 B, z. h
}* E$ t% l) a% \1 `" ?4 z
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{3 E9 o. R) b4 S/ A; d
int32_t GyroValue;( b4 {$ a6 J c# t2 Q
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();7 h# ^( V) R% G6 p6 Y) R0 P
ComplementFilter(GyroValue);7 O# z0 z/ n9 m2 S
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。