拿到开发板有一段时间,看了下资料,使用mbed平台那简直是太简单了,但mbed封装的太严实,实在是不利于我们了解MCU内部运作机理,所以还是要使用ST的库(直接寄存器操作就免了,我不想回到石器时代),现在ST库除了F1系列已经改变,采用新的HAL Drivers的方式,这种方式更友好,更符合软件工程。使用STM32CubeMX把和MCU相关的代码已经生成的90%了,剩下和10%需要自己来完成,所有的中断基本上采用“伪回调”的方式,使用用户更专注于业务算法本身。废话不多说了,直接上代码:. T! m4 @7 ?" m4 K1 f% I -------------------------------------------------------------------------------传说中的分界线---------------------------------------------------------------------------- main.c& S/ n3 P+ x8 ^9 f t #include "stm32l0xx_hal.h"+ \* }' ~* A( ]# g% e9 s* T8 k8 q #include "dma.h" #include "i2c.h"7 K2 j* s' Q; t. _ #include "tim.h" #include "usart.h" #include "gpio.h"6 p8 v A6 j- j #include "mpu6050.h" #include "visualscope.h"* j! i8 v3 }% D1 b$ _7 o #include <string.h> #include <math.h>* t( c5 Q6 [7 {/ R$ c /* Private variables ---------------------------------------------------------*/, R( a% U8 }& `8 u' y" J$ W #define RXSIZE 8) w3 w3 k/ U& i, ` #define TXSIZE 8 uint8_t rxBuffer[RXSIZE]; uint8_t txBuffer[TXSIZE];* F- | u! S; x3 r; l, B float Angle_accel = 0;" |# {4 F+ y+ K7 z float Angle_gyro = 0;, U/ z4 Z# b5 I4 Q& `, _ float Angle_comp = 0;- Q! Q/ j$ \, j uint8_t outAngleData[10]; /* USER CODE BEGIN 0 */ /*---------------------------------------------------------------------------------------------------------*/ /* 重力加速度算出的角度 */0 {# y s; F; ?1 n! a7 x /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleAccel()5 M& i+ J8 x$ o { int32_t value = 0; value = GetAccelValue('x');3 q7 E2 n J+ y" K if(value > 16384)- Q- A q9 }! {' g7 }: {9 x2 n5 B Angle_accel = -(asin(1) * 180 / 3.1415296); else% l c! {8 b9 r+ Y& X, P2 w Angle_accel = -(asin(value * 1.0 / 16384) * 180 / 3.1415296); ! j8 T/ c: n, [6 Z return value;: i( x- O- [: e D- m& L } /*---------------------------------------------------------------------------------------------------------*/; R Z' ]! o" E* c+ r" e# b- b /* 角速度算出来的角度(积分) */ /*---------------------------------------------------------------------------------------------------------*/ int32_t Calc_AngleGyro()+ }$ _: p9 ]( t. A" }' z {' p- D: }8 J' u7 M' q7 `* A( z int32_t value = 0; value = GetGyroValue('y');" t+ H2 B' _/ S6 M5 M$ F* A4 Z Angle_gyro += (value / 16.384 * 0.01); " d% w3 Q5 ^% O" R return value;% R; G# X9 g( _, @3 i( ] } # T: a( K% `, d; T /*---------------------------------------------------------------------------------------------------------*/ ?( C6 |( z0 z7 _; s2 D /* 互补滤波求角度 */9 F1 `( _) j! B. X /*---------------------------------------------------------------------------------------------------------*/ float ComplementFilter(int32_t simpleGyro)! x+ w W% J# N2 M; r6 c. g" N& ? { Angle_comp = 0.98 * (Angle_comp + -simpleGyro / 16.384 * 0.01) + 0.02 * Angle_accel; 9 N' B2 B4 r: d1 G, Z' O: b7 A return Angle_comp;. `; f' Z) l2 H+ c0 o9 O } # Z, j I% B0 j' m2 D6 w/ [5 l /*---------------------------------------------------------------------------------------------------------*/ /* 输出角度至上位机 */( |- o7 D$ L' Z$ k- e4 Z /*---------------------------------------------------------------------------------------------------------*/ void VisualScopeAngleOutput(). d" P" j. w, b; }2 l0 c {1 B6 V# g b* l$ e8 J6 j2 ^2 g int AngleValue_Accel,AngleValue_Gyro,AngleValue_Comp; Y+ C* l( U/ W# a$ R7 _5 Q uint16_t crcValue; AngleValue_Accel = ceil(Angle_accel * 10 -0.5); AngleValue_Gyro = ceil(Angle_gyro * 10 - 0.5);5 k( r! ^4 B/ Z AngleValue_Comp = ceil(Angle_comp * 10 - 0.5);, m, {+ ^/ P" j' w - m6 D1 `# w) I( E* u' R+ X outAngleData[0] = AngleValue_Accel & 0xFF;4 i) T8 g9 a+ ^3 [ outAngleData[1] = AngleValue_Accel >> 8;. Y* @3 L" w* c& p, P outAngleData[2] = AngleValue_Gyro & 0xFF; outAngleData[3] = AngleValue_Gyro >> 8;9 |9 H5 P H, g0 y+ D* `* k" H- J4 P3 W outAngleData[4] = AngleValue_Comp & 0xFF; outAngleData[5] = AngleValue_Comp >> 8; //计算CRC6 @0 o4 h7 t5 j5 {- D6 Y$ w; H crcValue = CRC_CHECK(outAngleData,8); outAngleData[8] = crcValue & 0xFF; outAngleData[9] = crcValue >> 8; //发送至上位机 HAL_UART_Transmit_DMA(&huart2,outAngleData,sizeof(outAngleData)); } /* USER CODE END 0 */4 V5 j) @# |$ j5 a ) O6 g' b7 R, N( i7 l /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void);6 W" e/ {1 n0 C# |8 _ 2 i& E, \/ Q6 P" m & ?' q. i$ @ x; Y- ~) i4 C3 ]0 F 硬件连接图: 波形图: 最后加一个视频:& v- w D" E/ y: g" X% q8 ~" X 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"! u# w+ Y6 ^- h$ q+ Z% S
/* USER CODE BEGIN 0 */2 k+ F0 S' M# l% y6 z+ `
6 Q; C3 ^- C" A$ h: M" Q
/* USER CODE END 0 */( F/ O( c5 o/ m2 m
I2C_HandleTypeDef hi2cx;1 N) M0 @; O/ _
; [6 u3 R8 F! F) r3 }0 I8 P
/* I2C1 init function */+ ?7 \! U4 Y8 X5 w$ c+ ^
void MX_I2C1_Init(void)
{
e% Y5 x4 t, ]+ \- F6 d
hi2cx.Instance = I2C1;
hi2cx.Init.Timing = 0x20D22930;
hi2cx.Init.OwnAddress1 = 0;
hi2cx.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2cx.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;. j8 }+ R1 r6 @) ]/ G
hi2cx.Init.OwnAddress2 = 0;8 F; J5 ~5 P5 T1 N) m
hi2cx.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2cx.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
hi2cx.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;% t. ~1 A9 c, p1 b: S4 }
HAL_I2C_Init(&hi2cx);
: a& f M# H- u8 N) F
/**Configure Analogue filter
*/
HAL_I2CEx_AnalogFilter_Config(&hi2cx, I2C_ANALOGFILTER_ENABLED);
}5 Q' S$ y, o7 f7 _' ^+ Y
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)
{. Y% |; y: N# @/ Y
/* Peripheral clock enable */4 Y- R- M- Y/ r& W& g
__I2C1_CLK_ENABLE();
/**I2C1 GPIO Configuration 4 ^* n. e5 u7 n$ f$ v1 G- Y
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;5 D2 f9 h5 p, I9 b( Y3 [; `
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;) a% N: I) Y# l; S1 n
GPIO_InitStruct.Pull = GPIO_NOPULL;: j/ j0 D- \; Z! E/ T" K
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- f6 H1 d i/ W$ w/ d/ W% i. y% _
}
}4 o. l0 g( c. ~5 z' j" \
- G9 S" |' \# P' P/ z
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c); }' @6 i/ I+ B2 t) L
{
6 Z5 r, u1 l! K; L! E2 e6 ^. ?, N$ p3 w
if(hi2c->Instance==I2C1)0 e$ b, n8 O) S" c
{+ O! |6 |% y% S& Q/ X6 n
/* Peripheral clock disable */2 [4 ^+ F5 p1 b! S# q% w+ X
__I2C1_CLK_DISABLE();
# `7 q0 h N8 p' W# m5 i
/**I2C1 GPIO Configuration . d* Q! m# S% n X
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);$ Z8 Z. J2 b# m/ {4 p
}$ p9 w/ F$ d" t
}. V+ s( M8 R$ S: L/ F$ u
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------+ d' i" v! ] b+ X7 V0 c) h
usart.c
#include "usart.h"
#include "gpio.h"
#include "dma.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
" J# T# C9 X9 g1 F @
UART_HandleTypeDef huart2;1 {" P" j( J0 N- `
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USART2 init function */8 c! n" v' J% q E9 J
void MX_USART2_UART_Init(void)
{8 z( E6 J! Y- u5 f4 D9 @% D
4 e e$ G& c: W* M7 P V' l
huart2.Instance = USART2;/ u; w3 P% w4 }2 W% J$ {$ E
huart2.Init.BaudRate = 9600;' Z ?' I j7 M/ ?# s$ f& o7 m
huart2.Init.WordLength = UART_WORDLENGTH_8B;0 t: I8 l v! v* i0 k( _0 W
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;$ x$ U C# H6 t; ?4 p
huart2.Init.Mode = UART_MODE_TX_RX;6 c7 P9 H* M# u _. s
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;7 R1 U- i/ h, U- |" H2 T7 _! d
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart2);
}
/ y) n9 g# u7 C. S' d5 H: s! P
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{+ m9 n2 h5 w8 M
+ u( E0 `0 k2 {" G; V2 y" Q
GPIO_InitTypeDef GPIO_InitStruct;# {. z- n1 |! C: T2 L
if(huart->Instance==USART2); L: x% D& `& H9 n
{+ ]( I! F% C7 D8 h2 T4 p: W
/* Peripheral clock enable */; Q4 Y3 ^" q5 O% Z& r9 d/ r
__USART2_CLK_ENABLE();
6 i, ~5 Z( A/ \ a, R G
/**USART2 GPIO Configuration
PA2 ------> USART2_TX0 C4 S) m2 t) o5 A% ^4 U0 t/ R
PA3 ------> USART2_RX0 h$ @- W2 y8 S% n
*/
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);
" x, n* q4 V" o+ C- ]4 T
GPIO_InitStruct.Pin = GPIO_PIN_3;. Q U1 p# o3 S* `" y$ I
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);1 r) T7 v" v) G5 ]
A9 Y9 P2 A8 F/ G* L% j
/* Peripheral DMA init*/
hdma_usart2_rx.Instance = DMA1_Channel5;
hdma_usart2_rx.Init.Request = DMA_REQUEST_4;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; s! [) _' D: b' M
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;" [7 `5 X* o6 P8 B3 u, D
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL;% y/ }5 [3 b6 ]& q/ H! z1 n6 D
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;+ @" |0 D" n2 ]+ n( u- G+ z) w1 u
HAL_DMA_Init(&hdma_usart2_rx);8 `# N" M0 {6 E. V% d
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
hdma_usart2_tx.Instance = DMA1_Channel4;
hdma_usart2_tx.Init.Request = DMA_REQUEST_4;$ G( i# o, S% Y! {& p5 d
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;1 W* ^# D2 G o7 ~4 g3 y% t0 X( ^
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE; `1 ]. d/ P( s( C
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;- X5 z+ w6 a( e& |% p' N
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;6 X: j2 r) {5 V' f
hdma_usart2_tx.Init.Mode = DMA_NORMAL;) r6 x7 [0 @& ~+ A$ C
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_usart2_tx);
6 R/ d7 S0 j1 t1 S( q. p, Q1 w
__HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);7 K3 h# K/ V# X6 ^; h# ^
}, n( C5 ? {' s
}
1 L( ?/ S$ I$ Y) c6 i. r' A4 N" Y# E
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)4 R% k' L) e4 w: ] y1 O! n
{
7 s1 S8 E5 v6 o) D
if(huart->Instance==USART2)3 l! l- i0 A. l& S
{
/* Peripheral clock disable */
__USART2_CLK_DISABLE();
/**USART2 GPIO Configuration 3 b+ }# W+ m( i) J; U9 O0 g
PA2 ------> USART2_TX% y. u1 D9 P$ c9 z. u% N
PA3 ------> USART2_RX9 n# j; p. `; x3 j& v
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
, J5 W2 c4 y# i8 R
/* Peripheral DMA DeInit*/( z5 z2 ^# I7 s1 Y- ?. q7 N: B! _) K
HAL_DMA_DeInit(huart->hdmarx);
HAL_DMA_DeInit(huart->hdmatx);
}
}
------------------------------------------------------------------------------- 传说中的分界线 ----------------------------------------------------------------------------
mpu6050.c6 G" P: t# J1 c+ e
#include "stm32l0xx_hal.h"3 z$ H5 P0 N9 L+ K" t( H/ M) K
#include "MPU6050.h"
9 t# x) X& N) w
//各坐标轴上静止偏差(重力,角速度)
int16_t offsetAccelX = -195;
int16_t offsetAccelY = 560;; R/ @2 m$ N$ X+ c/ d6 v
int16_t offsetAccelZ = -169;
int16_t offsetGyroX = 12;$ S5 a+ u, ]" |" @
int16_t offsetGyroY = 33;. a. Y8 ~: ]# F
int16_t offsetGyroZ = 4;$ W; I: J( P. i$ E
extern I2C_HandleTypeDef hi2cx;
0 b' q. ?; ^3 t! W- i, a5 o: |
//*************************************** ?9 G# t( j; B
//向I2C设备写入一个字节数据+ |' g% S) L0 E* f6 \
//**************************************$ v8 l$ o; h Z+ e5 c1 B
void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
{* R& y' _9 Q+ {/ ?! \
uint8_t rxData[2] = {REG_Address,REG_data};1 x. \7 t0 n9 d
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,rxData,2,5000) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}, z% E7 f% I* @1 r4 f
}$ j* ^' s3 w/ [2 ?. u) }
//**************************************0 j# ~3 ]; ^& V2 L' Q' N4 C' ~
//从I2C设备读取一个字节数据
//**************************************
uint8_t Single_ReadI2C(uint8_t REG_Address)
{
uint8_t REG_data;; d N! K: |7 J% o
while(HAL_I2C_Master_Transmit(&hi2cx,SlaveAddress,®_Address,1,5000) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}
if(HAL_I2C_Master_Receive(&hi2cx,SlaveAddress+1,®_data,1,5000) != HAL_OK); A; }$ [- B% [
{
if(HAL_I2C_GetError(&hi2cx) != HAL_I2C_ERROR_AF)
{}
}, ` r) X! K9 H9 h- q6 q* x
return REG_data;
}
//**************************************, C8 _3 r! g; O0 ?6 U7 r
//初始化MPU6050
//**************************************
void InitMPU6050()
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
Single_WriteI2C(SMPLRT_DIV, 0x07);
7 \3 R& p3 b) p, x4 T: ] i
Single_WriteI2C(CONFIG, 0x06);( D1 G0 K7 h5 u/ b, l( n# d* `6 M1 T% M
) T- u/ b7 Y9 e; \' h& N" I& a
Single_WriteI2C(GYRO_CONFIG, 0x18);# r( s/ W7 } p
/ D4 q; i- J; Q2 K9 ^5 C) t! n
Single_WriteI2C(ACCEL_CONFIG, 0x01);# Q; b, D5 i6 t G0 z/ ^3 T7 F/ P
}) V# D' M' Z0 ^$ v
//**************************************7 P0 H/ O7 p4 @
//合成数据
//**************************************
int16_t GetMPUOutValue(uint8_t REG_Address)
{& N: c. c3 j- v
int16_t result;
uint8_t H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);8 _) U' r$ E8 F% R6 a' G9 R/ _: b4 J
result = (H<<8)+L;
return result; //合成数据$ {) b5 r% Y W
}- Q7 Z) {& f5 d
/ `& h2 ^% ^( p
//**************************************
//取某一轴上的加速度数据+ \" n5 T. k3 c, w" v; a3 l6 x
//**************************************# _3 s3 i$ t( f" x
int16_t GetAccelValue(char axis)- P# |* I( I) k# V1 C: u
{$ i4 _% w& \9 }& J
int16_t result = 0;% Z" u1 o+ o" M5 [8 S
switch(axis)
{; ^3 S& S3 r7 s; w
case 'x':' C. S0 I1 E, l1 J1 N; N
case 'X':
{
result = GetMPUOutValue(ACCEL_XOUT_H) - offsetAccelX;' `" _& L2 M6 n; N8 i
}
break;- \4 c4 X! L, _! P/ u! D" D* P
case 'y':8 N) ~" b/ b: |2 T
case 'Y':
{
result = GetMPUOutValue(ACCEL_YOUT_H) - offsetAccelY;; O% O3 B2 d5 T8 E0 I" {
}/ ?$ u1 a+ }! T* ~
break;
case 'z':
case 'Z':) P0 a, X0 ]4 k" ~( U
{
result = GetMPUOutValue(ACCEL_ZOUT_H) - offsetAccelZ;6 {' g3 r! z% R: `% `# Y' [0 \$ p
}9 X0 X1 V7 Q2 A1 A7 f5 x
break;% k1 K( Z7 j' Q4 d3 u
}5 k7 U; @6 I' T3 j" K" U: i
return result;
}& k. R, R( ~9 [6 d* q
//**************************************% ]/ R% ` b; h" q
//取某一轴上的角速度数据
//**************************************
int16_t GetGyroValue(char axis)
{6 b: Z% `& b' F! x
int16_t result = 0;
switch(axis)! f( e& M$ k1 B4 C! a
{6 Y N- l6 M! ?. W& @
case 'x':# U0 m' e2 |# K. N% h9 A, k
case 'X':3 |" E( Y. {- ~$ ?! n
{% y7 [& w4 _( K% a
result = GetMPUOutValue(GYRO_XOUT_H) - offsetGyroX;
}" @, t/ f, B( v! u- Y6 w$ [9 {' H6 [
break;. y% |5 u4 l" N4 F) A
case 'y':
case 'Y':- w9 k6 K, A" Y. Q. o+ U
{
result = GetMPUOutValue(GYRO_YOUT_H) - offsetGyroY;
}
break;
case 'z':5 `- h' I- D% W) C o5 ~/ B6 R
case 'Z':- u e! H. ~) Y
{7 \! ?" z" c3 d2 O1 i/ U6 g
result = GetMPUOutValue(GYRO_ZOUT_H) - offsetGyroZ;
}/ ~: R3 b ?3 X8 q% D
break;4 O& t+ k1 X" P/ D- c( @$ S- W
}
return result;) }+ V( P# U. d: g8 H. p
}
评分
查看全部评分
{9 O$ O5 `6 D2 K" o) J
. I2 R) a& k) S3 s
/* USER CODE BEGIN 1 */
" {9 j& m7 i' }, |
/* USER CODE END 1 */' d6 t9 l9 m& i
3 c8 Y0 x/ U- V' J& h9 F" {/ }4 d
/* MCU Configuration----------------------------------------------------------*/
; |& L1 N. z. x2 U5 p! u
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */4 t1 T( Q7 G; ]0 V+ F: l( i
HAL_Init();# H- D. T+ d' q/ c; R4 ^, W' L, ~9 r
/* Configure the system clock */
SystemClock_Config();
. ^( m; \, N1 ~1 S0 W
/* System interrupt init*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);! K; N( B' j0 s8 b' ^6 }) t0 R# T9 r
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();/ R5 W$ B1 }1 \+ ~' S% a& o
MX_TIM2_Init();
MX_USART2_UART_Init();; V+ C( q& V y% K
InitMPU6050();
/* USER CODE BEGIN 2 */4 I5 X& m8 b) p) n+ E5 o
HAL_UART_Receive_DMA(&huart2,rxBuffer,RXSIZE);
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */0 M& j0 E" l( \/ s2 G* \8 l. x
/* USER CODE BEGIN 3 */. Q& {$ @# A. |5 z' f) }
/* Infinite loop */
while (1)
{) H ^! x! I% ^+ K5 V9 B9 D8 ~) Y( _
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);+ L2 F) @) G/ W$ o. F+ ]- T5 X
VisualScopeAngleOutput();
HAL_Delay(100);
}( |* }/ J& v y6 L
/* USER CODE END 3 */
! o. M+ f7 L% a
}6 L- n) [# o5 ^% J* v9 ^3 m
/** System Clock Configuration
*// ]! t- d' g Z. ^; {, Z
void SystemClock_Config(void)2 v+ I9 J5 G- t) F
{$ [. E" {; A' G- m6 j- D
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;. x3 O1 Y: i& \8 G1 w: H: M g" K
RCC_OscInitTypeDef RCC_OscInitStruct;
__PWR_CLK_ENABLE();
E v1 N$ ~0 n, s5 t! E/ O
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);! r$ h- l3 b4 ~: m* k
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;8 `6 C8 m0 ]9 ?
RCC_OscInitStruct.HSICalibrationValue = 16;/ q2 @6 p8 f! o* t! L
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;2 P# E; J, |, V+ G
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;; ]9 _9 v2 i# n! N7 c5 }! r7 b" J
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;4 s" c8 Q: A) l
HAL_RCC_OscConfig(&RCC_OscInitStruct);5 c+ f5 J0 N* k8 w- J& }
L S$ Q' P5 T7 T, E( r7 Y2 K
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;9 Q3 m& O- x. g" D7 R- ] a
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;! _# _9 w P4 O
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;5 _, b; s4 f( | [- s# I: w- S" E
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;' _% c& P, U: {4 E7 L, W$ J. R/ z
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;4 y# W4 g9 M- j$ b7 h
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;% o; E( w# m( D
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
__SYSCFG_CLK_ENABLE();! X, B! n$ C( c) |( B8 T
}
^7 T1 e) ^0 @# |2 y( f* K/ E
/* USER CODE BEGIN 4 */- l/ ^1 {" r( R% O' a% N0 Z
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)9 W2 o: h8 g8 |! q3 `. u6 W+ ~. U
{
if(huart->Instance == USART2)" d% ~) s) ]7 m# X( A
{
memcpy(txBuffer,rxBuffer,RXSIZE);
HAL_UART_Receive_DMA(huart,rxBuffer,RXSIZE);
HAL_UART_Transmit_DMA(huart,txBuffer,TXSIZE);
}
}
% T4 R- ^$ F* _& I& w
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)9 [$ \1 u( E" Q6 T1 U: _
{
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# V O" d( L2 t5 H4 C1 A1 o
{( d! C4 T# j3 H4 h% t0 p
int32_t GyroValue;
Calc_AngleAccel();
GyroValue = Calc_AngleGyro();6 t# N9 W) S$ V
ComplementFilter(GyroValue);
}
使用DMA方式,接收发送数据必须是个固定长度。
如果是长度不固定,你使用中断方式,然后加起止,停止标志位来判断。
好的,多谢指点!
请问应该注意什么地方
我使用是没有问题的呀。