[Arduino STM32] 01:管脚编号 PIN_MAP
" f) R1 F- ]3 i+ e* p7 b
, S2 d5 U! e3 n; W8 Z9 u' I[Arduino STM32] 02:LCD5110 驱动$ Q9 F# ]+ ~; \: W6 V/ x; A
/ ?6 a% V. n+ n$ z- {
) x% r% R2 F. Z并不是每一个 Arduino AVR 的程序都可以直接使用在 Arduino STM32 板上的,点完了 LCD 之后接下来也要试一下 OLED 的驱动,找了一个使用 Adafruit 库在 Arduino AVR 板上可以运行的例程直接在 STM32 下编译,结果却产生了错误!这貌似是库的支持不兼容,问题目前还在确认中,不过在 Arduino 官网论坛看到了这一篇帖子:
' q' m4 `/ z* j" c9 y5 l/ }/ q6 E7 U, l1 m% N' K+ C! P
http://forum.arduino.cc/index.php?topic=265904.2115
; F. P6 U, ^* s. `! b
: c3 ^& q4 E$ _有人改写了 Adafruit_SSD1306 库,让这个库可以在 Arduino STM32 底下运行,程序中对于 SPI 接口方式的 OLED 管脚是这么声明的:) p5 a U% m. P' t' V
% @! p, s% t E8 T# Y5 i' f9 e5 R#define OLED_DC 22 // D/C 6
( _3 ~9 k* t$ P2 r#define OLED_RST 21 // RST 5
, w9 c$ F: J7 o5 y#define OLED_MOSI 20 // SDA 4
% i: G# A8 i2 k+ W#define OLED_CLK 19 // SCL 3- E9 r5 E: Z8 N
#define OLED_CS 14 // --- x Not Connected
# R5 a- e9 x( N9 d" ] I' O$ A8 W# W9 t
对应于 Arduino STM32 板的管脚为:/ P: O1 W1 v) ~) l- l0 g# H
8 k& ~/ r, j% o( d5 K' T
22 -> B6
& j4 Q8 y1 `1 E21 -> B57 _; P$ M7 s8 u$ E% b
20 -> B49 V. d7 M/ \: w- g2 S+ N
19 -> B3( l0 L5 y9 a- ^: c7 c6 H$ M! Z3 F
14 -> A14% F2 c- l" o& a3 I8 W
6 R1 X+ H( h+ ?3 _$ [主程序:
( u ?; h% }, F" X3 [
+ \0 Z3 A" N- k. o" d! m" y9 V- /*) h' e+ ]7 q3 q" o7 l9 Z
- Using Display: http://www.ebay.com/itm/301504841805* _' G) I' b, d" Q2 ]
- Compiled Arduino GUI 1.6.1 on 2015-04-01 by M. Ray Burnette1 @* @ A% P- \6 f2 \
- Sketch uses 27,912 bytes (25%) of program storage space. Maximum is 108,000 bytes.2 j) Z& r( F0 @
- Global variables use 5,616 bytes of dynamic memory.
7 M9 B* s( ^" D - THIS VERSION OF SSD1306 IS SOFTWARE SPI ONLY!!!
4 C+ Y5 w* U. L4 o! ~; M2 } - http://github.com/hwiguna/g33k/blob/master/ArduinoProjects/128x64_OLED/HariChord/HariChord.ino ' D1 G& c' D1 I/ i# F# Z
- */( e. b d8 h. a( Z+ P: q B% c
+ \/ [* z6 ~3 t: c1 v0 C* \- #include ".\Adafruit_GFX.h"
$ h6 f! V& f& |7 a - #include ".\Adafruit_SSD1306.h"
, K2 B9 G! B* c4 D) k: S7 E+ U" g( g
; S7 g1 t- a2 C- // software SPI works on Maple Mini ARM 32-bit+ z- g) w5 ]+ P8 y
- // use these settings for the OLED display...
, B8 ~% w8 r0 S: Q: s - // These pin #'s are for Maple Mini/UNO/Nano/Mini328" T* r3 }) G- ?- X" t
- // __Signal__Maple_//__OLED 128x64___2 ^/ K2 m( L% B) c) d
- #define OLED_DC 22 // D/C 68 H# Y$ b) ]8 r$ k9 p2 R
- #define OLED_RST 21 // RST 5
' I% E$ X! s7 k M% ]3 T5 J/ {- v - #define OLED_MOSI 20 // SDA 4
& r/ B' `! O e0 t - #define OLED_CLK 19 // SCL 3" ^' ?1 V, w T. z1 x' F
- #define OLED_CS 14 // --- x Not Connected; ^; b% u& g. @% | @4 C7 ~
- Adafruit_SSD1306 OLED(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RST, OLED_CS);' o2 G; [/ U3 H
- / Y/ Z, i* F* J5 C
- int nFrames = 36;
! I% S% H8 x9 y# ], ~' B - 6 x/ H6 \/ f' x a8 ~& W9 ~" ~
- void setup() {! J' M1 `$ ]- T+ a4 J
- pinMode(17, OUTPUT);
I+ j6 y {, d$ P/ ]& T1 m( H - pinMode(18, OUTPUT);+ }: x- Q# G9 K6 ^2 c
- digitalWrite(17, LOW);# E+ d7 j: Y( v3 Q) f) Q" Y/ e9 E
- digitalWrite(18, HIGH);
1 |/ z+ B; Q- l! e3 t$ p - // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)4 t! [& P6 ~' j/ r b
- OLED.begin(SSD1306_SWITCHCAPVCC);, j/ [9 Q1 H+ C% r2 N
- // init done
; L" Y4 q- R% }3 X; a - ) ?5 n9 x$ T& G$ b+ B
- // Show image buffer on the display hardware. g+ v! s3 v" M9 }+ Y
- // Since the buffer is intialized with an Adafruit splashscreen
7 l8 H; w! ~6 v9 ]9 o3 G - // internally, this will display the splashscreen.
* T# d/ Y1 a* W% C7 S+ E/ w - // NOTE: You _must_ call display after making any drawing commands/ O4 ?& P. O- ]! ^8 K
- // to make them visible on the display hardware!
- n5 B% t7 g+ k5 k( x& [" c( N - OLED.display(); // Adafruit Splash% h& ~' o" @0 w) ?4 R
- OLED.clearDisplay(); // Clear the buffer.
4 k2 V0 t+ ~3 o - // Y = 15 is the Blank Line between yellow / blue7 z+ ?$ o+ `7 R9 w. A
- }! O4 j; F1 J9 |" V. k) P5 |/ {
- % W- w0 V9 _2 ^+ N3 p
- void loop() {& k0 f/ w: O9 _3 Z& Z5 y; n
- for (int frame=0; frame < nFrames; frame++)
- o0 X: w8 o2 h+ B6 ~6 Z7 U. C4 j - {6 t+ J- e, b# [$ j. }% X/ d% x
- HariChord(frame);4 u5 d( T0 E. i6 n, _2 N/ d
- }+ z& T: z$ \0 @
+ l) |; R6 c( j. {6 R5 B/ k- for (int frame=(nFrames-1); frame >= 0; frame--)( ?& n" E; o5 H" z7 c# M% b! B
- {( F& A3 D) N, y2 i5 K
- HariChord(frame);; `& Z# J) g; V
- }! d0 L2 I% i( T% {1 O+ U4 j/ z: q! @
- }' w5 J r4 ]4 q* `6 ?: d6 [! h2 [1 T
- 2 [# k" }7 o. R
- void HariChord(int frame)6 z1 S8 L( i0 F7 B( [7 ?
- {
6 C `9 l0 R5 O8 L) i5 B - OLED.clearDisplay();0 B3 N2 A. _( G$ s
- int n = 7;* A" p+ N- V* ]' |, X
- int r = frame * 64 / nFrames;
: w9 p; h3 J( @' w - float rot = frame * 2*PI / nFrames;! W2 V R9 T B( O* ~! K9 W* w
- for (int i=0; i<(n-1); i++)
: C9 ~* \. ~- t - {" |+ R) p" s$ O! t& j
- float a = rot + i * 2*PI / n; N; ~' x( D; p6 R0 d
- int x1 = 64 + cos(a) * r;7 e( v2 q& b0 A6 |* q( A
- int y1 = 32 + sin(a) * r;9 h1 ^" M h8 L
- for (int j=i+1; j<n; j++)
- j/ p2 C9 T/ z I2 J- T - {( f) o) Q$ O" ?6 T! L2 j, u$ r( w
- a = rot + j * 2*PI / n;
% j& l% R3 w' ~# o" p9 l - int x2 = 64 + cos(a) * r;
8 m1 z- E+ J: M5 ?" q0 N3 c5 d& D - int y2 = 32 + sin(a) * r;# e8 B1 S, L# e/ F V- j; f- F
- OLED.drawLine(x1,y1, x2,y2, WHITE);
* L0 T+ p5 X5 ^6 x: [ - }
6 s6 R7 T7 g. i7 j' a& E - }
# K# N$ o$ w( s8 ` - OLED.display();
" ^+ O/ v9 C3 b5 m# _( Q - }' C$ L* b5 v) B
复制代码
2 E2 O. j6 c1 T* m( t$ c* Q/ e* g" I! B( D' \2 u& {" l2 v
运行结果:
& |: ^7 Q# b4 w
8 ~0 U+ a, y" h! u0 X: t
. r" h6 B6 _7 Q3 R* T) d) L- U
包括库与例程的压缩文件:
; @+ l/ r3 Z9 P0 U0 x8 z2 a B& D* i
SSD1306-HariChord_swSPI.zip
(15.93 KB, 下载次数: 185)
|
我也用的STM32F103,但是在调试SPI OLED屏时,第一次上电有时候没显示,需要复位才可以,搜了一下网上也有人在问,楼主有这种情况么。
我是没碰过,不过依你说的情况我是认为应该是MCU上电开始运行程序的时候 OLED 还没能正常动作,可以尝试MCU上电后延时一小段时间后再来设定 OLED。