本帖最后由 slotg 于 2019-1-23 21:59 编辑 1 F- c5 c$ J" J2 t
$ u. [- j/ r& `+ K8 NSTM8-SO8-DISCO 尺寸比想像中的还要小,小小的一块板子很有意思,只是这块板子的安排方式不适合直接外接模块或是元器件,因此我将底下的 3 块 MCU 小板掰下来打算插在面包板上做实验,而 STM8-SO8-DISCO 就做为编程器使用。
( R/ Y, P. ^1 ?+ H, v" J3 t& L. B7 x* Z& a4 m
手上有一个 R,G,B LED 小模块:
$ D, M; ?0 Q5 L( q2 d6 H1 F, Z# j) J+ @
8 P! V% a4 `1 a, h& I! e: T# H3 T; S' s* ]/ t/ L' R0 G/ t9 p
我想用 STM8S001J3 来点灯,看了一下引脚排列 pin5,6,7 都是 GPIO 很适合连接这个 LED 模块,模块直接插在面包板上只需要再拉一根共地就可以了,程序中只要在该引脚输出高电位时 LED 就会亮,我想实现的就是一个简单的 LED 依序亮灭功能,拉好线也写好了程序,只是下载烧录后运行结果怎么只亮了一个 LED 呢?pin5 与 pin6 所连接的 LED 不会亮!一开始怀疑是拉线的问题?也怀疑是程序上的问题?只是一个简单的点灯程序怎么会不行呢?
$ E# g7 X! F* I8 w5 ~" k2 O4 n% m! e9 K0 c+ x( {8 } d1 O( k
STM8S001J3 的 GPIO 引脚有复用功能:
2 J$ i5 E" H( }( I5 w
3 a Z6 }! R( x1 x8 m$ [! o& \+ }/ R
) ~+ n" {! [+ |# r* X: R
- f A! m* y8 F" a5 V
以 pin7 来说,这根引脚兼具了 PC3、PC4、PC5 功能,也就是程序改变这 3 个 GPIO 任何一个的状态时都会反应到 pin7 上,我在程序中发现了 pin5 定义成 PA3 时是有输出的,不过定义成 PB5 时 LED 就不会亮?查看数据手册的引脚说明里有这样的描述:
9 h7 S5 Y0 j* `, d- H% f5 r0 ^# P0 _. a+ ?
/ n2 A3 D/ k- w! G: ^4 ?
* F9 {1 @: p3 a! N1 DPB4 与 PB5 有特别的说明:2 `9 Q7 e- E0 c# l4 h- n* Z3 R
% \+ n$ V: i! f
* T0 y D% z) i+ k8 I! O4 c! z
/ C6 q( e7 q9 y5 J) g0 m7 c
STM8 的 GPIO 架构图:2 A9 e; m3 \3 [. h; q6 \$ n V' I
- W- `$ g; F+ }# D* k
% {+ C/ K" W: f
! }; N% q/ P0 J, _# H$ k这个意思是说明了当 PB4 与 PB5 做为输出时,P-BUFFER、PULL-UP 与保护二极管是不存在的,也就是 PB4 与 PB5 是一个单纯的 Open-Drain 架构,是不会有电位输出的!因此当 pin5 做为 PA3 时因为有 P-BUFFER 所以会有电位输出可以驱动 LED,但是做为 PB5 时就是一个单纯的 OD,以目前 LED 的接法当然是不会亮的。我改变 LED 接法,让 LED 的阳极接电源,阴级接控制引脚,程序输出低电位时点亮 LED,这样就实现了我想要的结果了。8 X- J4 {; o1 ]
; R9 N5 }# H5 A* Z% n
* ]8 C. ^. C/ a% f" U" z1 ^7 a5 g8 l
图上的模块原本 LED 的接法也是共地的,不过我将 LED 拆下反接改成了共接电源。
0 Q7 z L8 u4 Z: O- H* V/ Z
8 Y- Q( R1 x v. A2 S源代码:. z% l3 D: }8 [8 N
- /* Includes ------------------------------------------------------------------*/
9 C) B: H, l8 Z, t5 i/ N3 N8 f - #include "stm8s.h"& N7 E* j6 I) o ?5 a$ J+ F
8 V0 I3 }7 `) [; p, ?- /* Private defines -----------------------------------------------------------*/) `4 i* F1 U7 ?
- 2 L5 E% r( F, N4 Z
- #define LED1_GPIO_PORT (GPIOC)
: w7 ]' b+ N/ ^" I - #define LED1_GPIO_PINS (GPIO_PIN_3)) K' t% I5 m6 b0 x' Y L, G, M
6 K; N, N3 Y) b0 c& Z1 m- #define LED2_GPIO_PORT (GPIOB)2 k% N/ O8 ]7 j6 g7 `" V
- #define LED2_GPIO_PINS (GPIO_PIN_4): w! a/ Z- f, v$ F6 G4 H& g2 W# m
- & t+ v. S5 R* f9 ^
- #define LED3_GPIO_PORT (GPIOB)
2 m& J$ ]" Y4 {6 `5 w6 [3 s - #define LED3_GPIO_PINS (GPIO_PIN_5)$ ^% Z1 M0 H5 h0 k- c
- 4 P d) c8 F6 W" d
- /* Private function prototypes -----------------------------------------------*/
+ T- z+ u1 `: G+ U. N - void Delay (uint16_t nCount);
' ?6 S- N5 ]. @+ o3 T - ) n( N( T! g, w; d' W! s0 m
- /* Private functions ---------------------------------------------------------*/% \. ^+ D8 I3 B- @3 h0 t
& b) l7 N2 r! t) {" ]* O- void main(void)7 G# ~, Q5 z, q1 F
- {
" z- M; ^1 d. m$ _& G: W1 G2 ` - /* Infinite loop */
# H% g' ?& T: Z$ t - GPIO_Init(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);) ~- S. L- r; z" D# R
- GPIO_Init(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
( ]. g3 I1 y* u; Y4 b) ] - GPIO_Init(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
3 D" |0 p+ \3 H8 ` - 6 L# F. p. y( y1 Q# R0 u
- while (1)7 v. n8 a/ u% [! Q
- {
* _! E0 I0 T7 s1 N# P% ]5 I( A - GPIO_WriteReverse(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS);6 k( M* v5 k! I) A, Z% ^, f6 n
- Delay(0xFFFF);0 Z1 x; E; \) _
- ' R/ `9 p' i9 ~$ v
- GPIO_WriteReverse(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS);
: C$ f1 h. S" E& l - Delay(0xFFFF);- o5 P/ ?( j8 A0 C+ O' i
- 5 z" K; X( u3 X% E; x+ k) C
- GPIO_WriteReverse(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS);
- y7 O }5 E4 ~2 t: j$ {5 `7 F - Delay(0xFFFF);: h5 k- r: E# ]# a4 H4 |
- }
$ G7 C1 E& p. S% E# K# j0 } -
, J% c% n. O6 U5 f3 c7 L2 K6 m - }
复制代码 7 v, [( z3 m. m- i g2 y' I, [
B01.rar
(707.55 KB, 下载次数: 25)
|