总的来说,STM32F429i这块板子上的外围器件并不算多,主要的就是VGA TFT,另外,还有就是USB、SDRAM、按键以及今天要体验的陀螺仪。 MEMS是微机电系统的意思,这个东西可以说给我们的生活带来了很大的变化,就比如最常见的手机,现今的手机都离不开它,没有哪个智能手机敢不用它。 今天要介绍的陀螺仪在手机中也有他的身影,在手机中它一般用于拍照防抖功能,短时间的离线导航等。 陀螺仪的作用可大了,小到你的手机,再到飞机、舰船,再到导弹、火箭,这些东西没一个离得开它,不对,有一个能不用,就是你的手机,除了你的手机没一个离得开它。 板子上的陀螺仪芯片型号为L3GD20,搜了一下,这是ST自家的一款传感器。这款传感器有spi和i2c两种接口可用,我们看看它在板子上的电路图不难发现,他的两种接口我们都能用,但显然ST的意图是让我们用SPI接口。 看看他的庐山真面目:7 L( l, @3 u8 t4 {% u 在官方的例程里,有个简单的小例子,我们来看看:其名字为“MEMS_Example”。 关于这款芯片的手册在ST的官网及其他许多网站都有,大家可自行下载。8 j$ `/ a' P! i C/ c Y% X, a 先大概浏览了一下程序,发现例程里边貌似只有两个轴的,先编译下载验证一下:# s& @* p; ]8 I" s3 `+ q 果然,程序少一个轴向的。8 t( N' u- D; r! B& q: g* J7 ] 程序大概意思就是,把板子往前滚,则显示向前的箭头;往后滚,则显示向下的箭头;往左滚,则显示向左的箭头;往右滚,则显示向右的箭头。 如下图:/ u$ k. v7 T u! Q u; B; N 然而板子在板子所在的平面旋转却无反应,所用陀螺仪分明是三轴的,可是程序却只用了其中的两轴,略微有点缺憾吧,于是我把第三轴方向加了上去,及Z轴。 修改后,在原基础上,当板子绕板子顺时针和逆时针分别旋转时,用屏幕显示出来。如下图:6 X+ L# C( _/ _ B i& C 下面是部分代码: if(Xval>Yval)* @# b8 X/ D- ^ F0 p" o {0 z+ ]% D* @$ D& n( q+ o f, } if(Xval>Zval) max_of_xyz = 1;& v: v- j+ Z: j+ K" u else max_of_xyz = 3; } else { if(Yval>Zval) max_of_xyz = 2; else3 f/ ^. D' H6 v, j max_of_xyz = 3;" y+ Q, K; o: I, w& ^" p } //max_of_xyz = 3;7 C! z O) r _) O' k4 ^$ C& Z 5 B% p2 e- V/ K5 V1 V- S- ^ if(max_of_xyz==3) { if ((int16_t)Buffer[2] > 40)3 o3 l6 u2 }! B. q; | { LCD_Clear(LCD_COLOR_WHITE);( @* V0 c: k; z8 M- `" O LCD_SetTextColor(LCD_COLOR_BLUE);1 o: B, O- T) F9 E7 b //LCD_DrawFullRect(100, 40, 40, 120); //LCD_FillTriangle(50, 190, 120, 160, 160, 310);1 j" v. G. |+ u# A8 S+ ] LCD_DrawCircle(120, 160, 90); LCD_DrawCircle(120, 160, 91);1 T7 `3 f7 O* d' g LCD_DrawCircle(120, 160, 92);: j2 }5 [7 l1 p2 f LCD_FillTriangle(120,105,105, 251, 241, 261); Delay(50);/ t, h% l! ?8 _9 k: V! D }8 F, C* v% f7 \. P if ((int16_t)Buffer[2] < -40)5 `1 z; { T% `7 e @& V) H- P \7 I: J {4 g' y2 a+ M( o5 S LCD_Clear(LCD_COLOR_WHITE);5 v9 ^6 g# k" d: K LCD_SetTextColor(LCD_COLOR_BLUE); //LCD_DrawFullRect(100, 40, 40, 120); //LCD_FillTriangle(50, 190, 120, 160, 160, 310); LCD_DrawCircle(120, 160, 90); LCD_DrawCircle(120, 160, 91); LCD_DrawCircle(120, 160, 92);1 Q$ e5 J) B/ H2 x1 ^ LCD_FillTriangle(120,135,135, 251, 241, 261); Delay(50); }: K. s" x& F$ Y. I0 u/ S5 i }6 n- l% b$ p# g9 i if (max_of_xyz == 1) { if ((int16_t)Buffer[0] > 40) { /* Clear the LCD */; D& A9 T2 w5 Y5 P, w6 u, W LCD_Clear(LCD_COLOR_WHITE); LCD_SetTextColor(LCD_COLOR_MAGENTA);9 L/ F- I3 ~4 ^; c' Y, z0 U3 X$ ? LCD_DrawFullRect(100, 40, 40, 120); LCD_FillTriangle(50, 190, 120, 160, 160, 310); Delay(50);! e- L O( b4 G) r! e; V }/ P& n' i1 V! T if ((int16_t)Buffer[0] < -40) {0 g8 M# o1 M: C) E( l7 N0 v) M% T { /* Clear the LCD */9 `# u4 h) J, ^: C' q, l4 h! k LCD_Clear(LCD_COLOR_WHITE);" I/ q7 w5 W/ K' ] LCD_SetTextColor(LCD_COLOR_RED); LCD_DrawFullRect(100, 160, 40, 120);8 j- ]! x- b0 H0 B' q2 k LCD_FillTriangle(50, 190, 120, 160, 160, 10); Delay(50);; @8 H n9 l8 Z }& m4 R: k5 J6 E" b6 U/ ~% r+ ^: r! y } if(max_of_xyz == 2) { if ((int16_t)Buffer[1] < -40) { /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DrawFullRect(120, 140, 100, 40); LCD_FillTriangle(120, 120, 5, 60, 260, 160); ) j/ s) K& H, c; ?4 \1 p* Y5 r Delay(50); }* e/ S x1 R' L) g5 v( Q if ((int16_t)Buffer[1] > 40) { ) `) ?$ P) f& S9 p5 d6 H /* Clear the LCD */ G+ Y4 O* y0 n8 L. F* l" R) C( @ LCD_Clear(LCD_COLOR_WHITE);) |4 v1 m7 S( b. x. y7 ~1 u$ a LCD_SetTextColor(LCD_COLOR_BLUE); LCD_DrawFullRect(20, 140, 100, 40);) W# C u6 ?: ^: O1 ` LCD_FillTriangle(120, 120, 235, 60, 260, 160); Delay(50); } } , X4 U5 {4 S+ h- f }! z3 n, [4 c/ b" Z7 [6 W 为了尽量减少改动,没有switch case ,不知道用了效率会不会更好。 当然,陀螺仪的作用可远不止如此。 _5 i- u( b' e3 p! t |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)