[Arduino STM32] 01:管脚编号 PIN_MAP4 S6 X6 f. Q; h: ~5 d1 c8 p
2 V: L6 ~6 l8 W0 _8 h* j0 H" ?' i# q
[Arduino STM32] 02:LCD5110 驱动
# b8 r- d& b {* `+ ~
8 z. C* ~; P: _
- ? g) F! ]$ r/ q/ ]并不是每一个 Arduino AVR 的程序都可以直接使用在 Arduino STM32 板上的,点完了 LCD 之后接下来也要试一下 OLED 的驱动,找了一个使用 Adafruit 库在 Arduino AVR 板上可以运行的例程直接在 STM32 下编译,结果却产生了错误!这貌似是库的支持不兼容,问题目前还在确认中,不过在 Arduino 官网论坛看到了这一篇帖子:, a$ ]1 M. C" ]; g
+ S X" L0 ]4 \1 ahttp://forum.arduino.cc/index.php?topic=265904.2115! e0 Z) T i& P& ^5 o. \( t$ e
- _8 w6 @ `5 B9 n有人改写了 Adafruit_SSD1306 库,让这个库可以在 Arduino STM32 底下运行,程序中对于 SPI 接口方式的 OLED 管脚是这么声明的:6 k2 k7 n0 n0 O% Z% V: K: y
) `' \% b; f) R! o: I4 \3 i5 ]#define OLED_DC 22 // D/C 6
. [# f7 ]1 u6 A; U. c& T# J#define OLED_RST 21 // RST 5
4 y& k3 y- T! A#define OLED_MOSI 20 // SDA 4
) M; n* f7 u& `' b' b9 ~#define OLED_CLK 19 // SCL 3" `0 U' v, Q' }+ S+ ]0 A$ G
#define OLED_CS 14 // --- x Not Connected" H) L) C7 {5 i3 c( e! A8 e2 d/ ]
2 k) B! F8 z9 k: _5 m' B2 B
对应于 Arduino STM32 板的管脚为:9 x4 X. K! V4 V/ R3 q1 p
7 r* f+ S4 n f1 |+ L3 |
22 -> B6& ]; f! H! c! n6 ]/ _- y% y
21 -> B5. F, F# E$ C9 v8 |: X6 R# B: a) y) @
20 -> B46 B6 ^3 n' v1 D( Q7 I9 M
19 -> B3) I. u" H( h6 @4 f$ G
14 -> A14
+ f1 l" `, g! D+ ]/ o( U2 K) t+ r( n3 z* z" Y
主程序:% Q. T7 D( {4 C! Q- z9 g
& I4 S0 K9 R, g$ i3 r& o- /*
7 Y* `1 l; d2 M6 h - Using Display: http://www.ebay.com/itm/301504841805
) q9 |# n$ x7 V2 r2 r - Compiled Arduino GUI 1.6.1 on 2015-04-01 by M. Ray Burnette/ z% n7 o+ T+ b% J7 M* ^ g
- Sketch uses 27,912 bytes (25%) of program storage space. Maximum is 108,000 bytes.
% O& \, S+ X2 @5 m5 R% ^& M; } - Global variables use 5,616 bytes of dynamic memory.& h. A6 n C5 U
- THIS VERSION OF SSD1306 IS SOFTWARE SPI ONLY!!!
3 i. A; v: u; |; u. _+ v9 ]+ K - http://github.com/hwiguna/g33k/blob/master/ArduinoProjects/128x64_OLED/HariChord/HariChord.ino
4 k: x5 Z4 W# S$ @( F6 c) E8 `/ r - */
! P$ K0 T+ o6 E& l o5 Z+ f; N - b& ~0 T3 E# y6 k
- #include ".\Adafruit_GFX.h"
) D1 X0 g' R* `7 G2 U3 J - #include ".\Adafruit_SSD1306.h"8 ~' R3 o' a4 l7 k+ ]
- # }3 `# X# I( \) t9 n; b0 `
- // software SPI works on Maple Mini ARM 32-bit9 W& `$ _* Y7 w0 K7 T1 x) J; C
- // use these settings for the OLED display...; u* b3 S, G- u! U
- // These pin #'s are for Maple Mini/UNO/Nano/Mini328
. ?. p9 q* a9 p& T- m0 L - // __Signal__Maple_//__OLED 128x64___
' s3 i p$ Q; U4 A* {6 Y2 Q% r! K - #define OLED_DC 22 // D/C 6
1 k* m2 W p0 V5 d. t$ C - #define OLED_RST 21 // RST 56 Z' e* \) n j7 @) h
- #define OLED_MOSI 20 // SDA 4
8 q e+ t( W0 I9 D- O - #define OLED_CLK 19 // SCL 3
. L# W! J/ \ n3 ? - #define OLED_CS 14 // --- x Not Connected
3 H4 T& K5 x: ]% W$ F6 K! }2 D) q% \ - Adafruit_SSD1306 OLED(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RST, OLED_CS);9 k# L6 P+ L$ _5 T
7 M* O5 k1 h! D0 j- int nFrames = 36;( t: s0 z# u" b
( Z. c1 N$ q: n `2 W0 |1 l) |- void setup() {, r y |- L* T& J
- pinMode(17, OUTPUT);
N3 @- g+ o) g- v! n+ v - pinMode(18, OUTPUT);
( ^- H) t6 G) P - digitalWrite(17, LOW);" M; {; e3 t# K7 H3 t
- digitalWrite(18, HIGH);7 n7 Z6 w/ p8 D7 s, \$ ]
- // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
3 F' w$ S. z" L. y5 K8 i - OLED.begin(SSD1306_SWITCHCAPVCC);
7 d( z- F6 t2 y - // init done+ x. t; A0 O T+ a8 [
- 3 y: b4 F6 Q3 K' _
- // Show image buffer on the display hardware.* ]( a* t7 _$ ]% f3 W
- // Since the buffer is intialized with an Adafruit splashscreen
! ~. p/ z) D& n$ l. v - // internally, this will display the splashscreen.
, r8 ^3 S3 p# ^/ i( h4 t - // NOTE: You _must_ call display after making any drawing commands+ e$ _+ O/ H: o
- // to make them visible on the display hardware!
+ q: `- ^' v) a4 V' o - OLED.display(); // Adafruit Splash) O6 J; H' y7 j
- OLED.clearDisplay(); // Clear the buffer.0 n# A0 w3 E1 S+ p
- // Y = 15 is the Blank Line between yellow / blue
7 y6 O5 ^3 g( I+ a* _" f3 [ - }
; M6 y: S' K5 Z9 ?# N+ m - ; s) T; F2 H( H! ^- L
- void loop() {/ r# Z$ T6 E6 C
- for (int frame=0; frame < nFrames; frame++): _: f5 r4 s3 T* ]# [, @2 z
- {
! }6 }! K. Z9 I - HariChord(frame);+ }8 L% @8 K7 @* F" e* n
- }
) _6 M+ U$ \4 z( f9 J! [' v; R9 y
6 R# l2 a3 T; k2 Q6 y- m- for (int frame=(nFrames-1); frame >= 0; frame--)( R: g6 _5 N" g1 V* {9 r- M* o
- {
B7 }' q; b& O9 `. H M - HariChord(frame);# n) I% o4 E2 H" n
- }1 ~; u3 k, \, S- T$ A& x
- }9 X4 K* O* x* j% P7 u- v) K
' d3 P: W/ p% s6 ~5 t1 t. w- void HariChord(int frame)
( A- x/ B9 N$ d, G4 _ - {3 e) g: o* M. u, y2 y
- OLED.clearDisplay();) M+ U0 Y/ M3 ^/ L, U
- int n = 7;
* H# b" E% W" |7 B- o6 } - int r = frame * 64 / nFrames;! [7 }" j G1 J" _
- float rot = frame * 2*PI / nFrames;
0 [( w' T$ w. a8 ^ - for (int i=0; i<(n-1); i++)
3 r/ r* e1 o- X3 c+ Y- D - {
! R, g( g$ p8 R& ? - float a = rot + i * 2*PI / n;4 h$ S9 m% `5 c
- int x1 = 64 + cos(a) * r;' V; o) D1 Z/ \: R; W' C8 Y
- int y1 = 32 + sin(a) * r;0 Q1 k6 `/ F- j+ [6 Q7 M
- for (int j=i+1; j<n; j++)+ s+ D* j. G3 ?6 `8 q4 P- F0 B
- {
2 V6 @- p+ c: F8 J& A - a = rot + j * 2*PI / n;
& _( j* V# {7 X - int x2 = 64 + cos(a) * r;2 }# H+ q% \' n" a4 o3 l9 @& u' V
- int y2 = 32 + sin(a) * r;& l& o2 m6 P& q( m0 p
- OLED.drawLine(x1,y1, x2,y2, WHITE);( g/ \3 @6 l. \* s5 I4 |
- }
- J2 h. j% n! H- I9 p - }# X5 i& S, m' O& ?8 ?% u0 i
- OLED.display();
( F# _% m- c& F - }6 z; u& T5 g4 J
复制代码
, a* F3 W9 K: M4 B) b6 G$ B7 @- {; G+ }: ]' G s1 I# X- i
运行结果:3 r5 m+ J; T+ S( f$ s
, X' ?: o( v$ c/ a. s+ P @3 a: g2 v0 w+ ?7 _, f1 [/ @. q% P
包括库与例程的压缩文件:6 L- E1 q- ~* D$ y1 p
3 y$ K# f4 t, j' c. |( `- P
SSD1306-HariChord_swSPI.zip
(15.93 KB, 下载次数: 185)
|
我也用的STM32F103,但是在调试SPI OLED屏时,第一次上电有时候没显示,需要复位才可以,搜了一下网上也有人在问,楼主有这种情况么。
我是没碰过,不过依你说的情况我是认为应该是MCU上电开始运行程序的时候 OLED 还没能正常动作,可以尝试MCU上电后延时一小段时间后再来设定 OLED。