[Arduino STM32] 01:管脚编号 PIN_MAP
( M( Q" d9 W0 a' t3 a7 u0 ]4 Y+ k. l8 l: h5 e' T. R: h- E8 [
[Arduino STM32] 02:LCD5110 驱动8 G( g! H# K# g. y6 i( b
_) W8 r( m+ x$ U4 M5 s2 m
. C& w& i3 W2 A9 Z" e3 U并不是每一个 Arduino AVR 的程序都可以直接使用在 Arduino STM32 板上的,点完了 LCD 之后接下来也要试一下 OLED 的驱动,找了一个使用 Adafruit 库在 Arduino AVR 板上可以运行的例程直接在 STM32 下编译,结果却产生了错误!这貌似是库的支持不兼容,问题目前还在确认中,不过在 Arduino 官网论坛看到了这一篇帖子:5 Q* J$ U. i, S5 q) F2 d
& A0 ]8 a3 K% }# ?6 j1 S8 a# ohttp://forum.arduino.cc/index.php?topic=265904.21159 g: Q z# e, s7 |) [0 R) A
$ j3 ]& h$ g& Y3 M2 I
有人改写了 Adafruit_SSD1306 库,让这个库可以在 Arduino STM32 底下运行,程序中对于 SPI 接口方式的 OLED 管脚是这么声明的:
% H, \8 @- t" B3 L! t( h3 a4 t9 k7 V; M5 c
#define OLED_DC 22 // D/C 63 Y* }* n1 n' c( ?+ T; r
#define OLED_RST 21 // RST 5: [; d) [, q" I5 e7 M
#define OLED_MOSI 20 // SDA 4" ~8 j( h1 o+ @" G
#define OLED_CLK 19 // SCL 3" m0 d% q. k C" H
#define OLED_CS 14 // --- x Not Connected
8 y& G4 Q+ x, K5 @7 f# N; f% l
- g6 K* W9 S# j对应于 Arduino STM32 板的管脚为:
0 D9 U+ M" V8 \* ?; Q; r0 E. \- @8 u& ~9 A5 a" m
22 -> B6
y5 y D9 M7 j3 ?4 V1 q21 -> B5
* a9 S2 f# m) x' z1 y* `9 U20 -> B40 Y- Z; I2 } y
19 -> B3
# t* {- i; |' [; r) R; \/ G& J14 -> A14, I* H) \+ I) j# x F& A
; O6 \# ~) ~" x* H' g" k$ {主程序:
0 A, U) I0 V. | W: J* Y9 O6 y" g1 E2 T7 j
- /*# J3 d; L& a, n3 G3 u+ _
- Using Display: http://www.ebay.com/itm/3015048418053 K: A5 i [8 E% {" M
- Compiled Arduino GUI 1.6.1 on 2015-04-01 by M. Ray Burnette7 F! g4 B3 Y( P4 A: V: \
- Sketch uses 27,912 bytes (25%) of program storage space. Maximum is 108,000 bytes.7 C8 y; o" {- w
- Global variables use 5,616 bytes of dynamic memory.
8 w$ {3 g' O6 s* C - THIS VERSION OF SSD1306 IS SOFTWARE SPI ONLY!!! w' ?! }3 _1 q( `2 A. P3 y: [
- http://github.com/hwiguna/g33k/blob/master/ArduinoProjects/128x64_OLED/HariChord/HariChord.ino
% p4 e, G$ G! Q& O0 b h w& y - */
+ X# b( W7 e$ |# K) i5 M3 V
8 B+ X/ x2 |* n8 b h- #include ".\Adafruit_GFX.h"
; q! y/ x6 n8 `- E+ K - #include ".\Adafruit_SSD1306.h"
8 v p0 s* y1 P* ^& m3 n - . g4 _) h/ h, Z) Q& Y
- // software SPI works on Maple Mini ARM 32-bit; f3 z; n' q+ t9 N2 W4 T
- // use these settings for the OLED display...( t7 |1 |% R) \( `. I
- // These pin #'s are for Maple Mini/UNO/Nano/Mini328
7 j/ J- f0 s. R* `, G( O! j - // __Signal__Maple_//__OLED 128x64___/ z% _9 f% n- _" n8 S
- #define OLED_DC 22 // D/C 68 a& d, |. V# }9 b, ?
- #define OLED_RST 21 // RST 5
* ~1 m# l5 [, j - #define OLED_MOSI 20 // SDA 4) e2 M$ E! k: f! s: z5 }
- #define OLED_CLK 19 // SCL 3; [* Q& F% {0 }5 o5 f0 L2 A$ v
- #define OLED_CS 14 // --- x Not Connected+ A' x7 X' }& z1 w- S, {' p9 |
- Adafruit_SSD1306 OLED(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RST, OLED_CS);
+ n0 V( z6 u" {6 J - 6 R0 F" v r) L! g" X4 \) I+ a
- int nFrames = 36;
/ M" v" T+ e4 k- I; w o6 I - 2 r. o' A% }' ^9 {$ [3 G- z+ Y
- void setup() {
0 g# D" f: I+ p' f$ o3 i- v - pinMode(17, OUTPUT);4 b+ m) E- E" j
- pinMode(18, OUTPUT);
+ O5 ?' y, j; g! N7 o - digitalWrite(17, LOW);
" K* I3 v0 ~7 L( H3 p2 O6 G - digitalWrite(18, HIGH);% J4 n, Z! A8 c
- // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)+ e: G, v, P7 [" B& h" V' t
- OLED.begin(SSD1306_SWITCHCAPVCC);+ `5 @+ C0 H) `
- // init done
[' C0 Y7 X# w! c4 G -
/ ^# B' A7 C: j5 w" A* ~ - // Show image buffer on the display hardware.
- z- i5 n" o. m6 s - // Since the buffer is intialized with an Adafruit splashscreen1 x* M& d1 Y. t5 I4 h2 B" s# E
- // internally, this will display the splashscreen.9 q7 F/ `& b9 I7 T
- // NOTE: You _must_ call display after making any drawing commands, F8 ?) Z4 }, t
- // to make them visible on the display hardware!# Y: ^. d n* X! G& I" P
- OLED.display(); // Adafruit Splash
7 s9 q2 ~7 {4 C2 |4 w) }7 T4 v* x - OLED.clearDisplay(); // Clear the buffer.
( W- U" I S3 O( ^* ]5 e! Y+ { - // Y = 15 is the Blank Line between yellow / blue) @6 c8 G- \( j, t
- }' A' V' T$ o2 p) w6 `" e
- ) m- u% t# \/ c) V6 h8 D
- void loop() {
6 {5 {' Q% O( H9 y4 J4 N& T - for (int frame=0; frame < nFrames; frame++)
+ f W1 k6 Q8 y, K% n+ u+ j! F - {
, q' g1 M, C V8 L# W1 Z - HariChord(frame);
& r% D. _! Q; Q4 E - }; h( [3 P( m! _
- / f+ R' t# B% N( J$ B/ f+ a
- for (int frame=(nFrames-1); frame >= 0; frame--)
* N2 r" z! O6 i1 f- s. s - {
9 R& f8 Q9 J z; e - HariChord(frame);
3 c% @- \9 b+ Q, Q. f# g1 m& j - }
. a8 _+ q" k* [/ E) T - }
8 Q, ] m, {9 z5 Y# \0 S - # T2 V7 a- w, }8 x" K
- void HariChord(int frame)0 [4 O) u9 i) x3 p! V3 j
- {
! t3 s# z5 T) G7 E4 [( P6 ` - OLED.clearDisplay();
' _0 _, r3 N# n6 w8 G - int n = 7; r8 v3 N, \+ X- m g+ H) T( S& Y! J
- int r = frame * 64 / nFrames;( x- r. [" W& }, Z U6 O9 J e2 l
- float rot = frame * 2*PI / nFrames;
& J) n3 d% D- S. e - for (int i=0; i<(n-1); i++)
e! @& K6 j6 @+ `! j ~" ^/ H - {
* ?8 R r- B9 ^( L - float a = rot + i * 2*PI / n;9 a" W& X2 e! n* H" D
- int x1 = 64 + cos(a) * r;
, `9 R2 V2 x3 _. y8 o$ D" F - int y1 = 32 + sin(a) * r;
4 z) f/ t t9 \6 M% } - for (int j=i+1; j<n; j++)1 u7 j" O9 N7 u" b5 e
- {
& i' g" x7 Z v. i4 Q- Q( Y - a = rot + j * 2*PI / n;" v8 R1 ^3 _4 D. j, E* X, ?
- int x2 = 64 + cos(a) * r; d( Y+ @9 q2 p4 I9 x
- int y2 = 32 + sin(a) * r;
, q" ?4 e, \" ] x2 r8 } - OLED.drawLine(x1,y1, x2,y2, WHITE);5 e* G8 `4 x6 r: @
- }
* e7 ~2 j4 n) p) N. N - }) R7 A- W2 @( D! X
- OLED.display();
# _: E2 ]: E/ U! n/ T - }
# P* [1 D6 J' h+ D4 U
复制代码 6 P9 }2 Q: a# `' E* V: [/ O$ i
4 ?: a& o* d( r运行结果:) Z% Z/ W7 V. F) i+ j7 v. H
7 z5 ]/ M; D* X0 z2 V5 S
. w7 }5 Y- u. N3 V! ?, W2 \包括库与例程的压缩文件:
: I" d& Y9 X9 g
0 ?1 E% y5 B8 I) @2 r# D% `
SSD1306-HariChord_swSPI.zip
(15.93 KB, 下载次数: 185)
|
我也用的STM32F103,但是在调试SPI OLED屏时,第一次上电有时候没显示,需要复位才可以,搜了一下网上也有人在问,楼主有这种情况么。
我是没碰过,不过依你说的情况我是认为应该是MCU上电开始运行程序的时候 OLED 还没能正常动作,可以尝试MCU上电后延时一小段时间后再来设定 OLED。