本帖最后由 slotg 于 2019-1-23 21:59 编辑
' \1 ?9 A4 f( Z" z" b' M+ E; L
6 j b6 R8 z- P" YSTM8-SO8-DISCO 尺寸比想像中的还要小,小小的一块板子很有意思,只是这块板子的安排方式不适合直接外接模块或是元器件,因此我将底下的 3 块 MCU 小板掰下来打算插在面包板上做实验,而 STM8-SO8-DISCO 就做为编程器使用。( S. h }/ `% q/ V5 L$ u
- _$ `' X/ q# c手上有一个 R,G,B LED 小模块:+ u* T, J: ?9 Y {! H% w, a
- E. k5 t' e' ]
) {/ H! h8 R1 U; D
- H" ?0 p& l0 d) T9 m1 x! {" R我想用 STM8S001J3 来点灯,看了一下引脚排列 pin5,6,7 都是 GPIO 很适合连接这个 LED 模块,模块直接插在面包板上只需要再拉一根共地就可以了,程序中只要在该引脚输出高电位时 LED 就会亮,我想实现的就是一个简单的 LED 依序亮灭功能,拉好线也写好了程序,只是下载烧录后运行结果怎么只亮了一个 LED 呢?pin5 与 pin6 所连接的 LED 不会亮!一开始怀疑是拉线的问题?也怀疑是程序上的问题?只是一个简单的点灯程序怎么会不行呢?
9 U+ m8 c" j- r
/ m) D3 O B# gSTM8S001J3 的 GPIO 引脚有复用功能:8 S7 l! b2 u, f6 H% f! c
- q5 i! J' P T7 V4 l. e
7 {" m P. }% V8 D9 j) n* X0 f1 q1 m7 u6 K3 S' i& o+ l) G; e) ?
以 pin7 来说,这根引脚兼具了 PC3、PC4、PC5 功能,也就是程序改变这 3 个 GPIO 任何一个的状态时都会反应到 pin7 上,我在程序中发现了 pin5 定义成 PA3 时是有输出的,不过定义成 PB5 时 LED 就不会亮?查看数据手册的引脚说明里有这样的描述:
/ I. f* h' G* {" L
" u1 p% b6 t8 G% t7 Q
, {7 K6 T! c) Z* t' b+ f7 U. n8 ^# w2 a& Z( m$ ~8 A6 Z6 a) @7 y* p" ~ E
PB4 与 PB5 有特别的说明:
) n) L0 }5 V' R( h4 ?7 ]0 P5 d) }! K! @% w/ e. e
' i# R+ e3 y- m" b
2 B( ^, m8 z( M' Y1 ?' cSTM8 的 GPIO 架构图:% X4 f0 [# u, K
/ R1 D" r9 c% F F8 x) E2 m/ E
. c, d5 z- M, B" p3 k9 ]1 C% ^( _' c
3 j7 f6 D3 j' [# e( S. j/ M
这个意思是说明了当 PB4 与 PB5 做为输出时,P-BUFFER、PULL-UP 与保护二极管是不存在的,也就是 PB4 与 PB5 是一个单纯的 Open-Drain 架构,是不会有电位输出的!因此当 pin5 做为 PA3 时因为有 P-BUFFER 所以会有电位输出可以驱动 LED,但是做为 PB5 时就是一个单纯的 OD,以目前 LED 的接法当然是不会亮的。我改变 LED 接法,让 LED 的阳极接电源,阴级接控制引脚,程序输出低电位时点亮 LED,这样就实现了我想要的结果了。4 q% X j- K+ ?5 L
# C: _& R. d% d+ {
3 L. _" l0 e! {1 _" ?" ?
$ R8 v8 v }; o I T5 w& E* I
图上的模块原本 LED 的接法也是共地的,不过我将 LED 拆下反接改成了共接电源。
6 J( L3 g4 e- r' s' v4 p5 F3 ]+ I/ P5 r2 L, D) p; S
源代码:
' Y0 V4 n) w1 ?! t: q; @- /* Includes ------------------------------------------------------------------*/+ P+ {3 M# ~# C4 B P
- #include "stm8s.h"6 [3 |/ p- Z2 l; x
- $ q8 u& g' F6 V4 l2 n D
- /* Private defines -----------------------------------------------------------*/
% S' N9 M. ]1 j1 B7 A1 n
1 _) S8 ^6 }$ W' E- #define LED1_GPIO_PORT (GPIOC)
; j. b0 K8 C( R6 g - #define LED1_GPIO_PINS (GPIO_PIN_3)
6 u- R/ P/ A: K6 P
+ A1 q. b* |# g" z- #define LED2_GPIO_PORT (GPIOB)
* R( i. y4 g( W, x; A - #define LED2_GPIO_PINS (GPIO_PIN_4)
3 i6 L! e1 X P2 J5 ^ - # k x! ] G- D* n( w
- #define LED3_GPIO_PORT (GPIOB)
5 M" q9 T" }9 Q! T+ M' Y& A - #define LED3_GPIO_PINS (GPIO_PIN_5)
8 f5 L. z0 `3 T
% E# e/ g G$ N5 ]- A, D- R; \- /* Private function prototypes -----------------------------------------------*/+ v8 Z0 O0 ?3 O/ T
- void Delay (uint16_t nCount);# i2 |2 ?* p7 E5 f
7 z* X$ J2 e2 n. w- /* Private functions ---------------------------------------------------------*/
4 u- Q! v. L% M( p0 B, A. y - ' U; |6 W7 G8 c5 b7 p
- void main(void)
% R, ~. X" |" H" D - {
8 n9 L- P d- }# w - /* Infinite loop */. o- T) A; f ^. w
- GPIO_Init(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);& j$ e ~6 F( J4 L8 [
- GPIO_Init(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
+ ]% n3 T: E% Q - GPIO_Init(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
5 Q9 V, e, r, W/ \7 {/ Q" c - ) L* Q' z9 s/ l0 G4 R
- while (1)
0 R$ R+ r8 A7 A* g8 N9 L0 X9 F - { |, d0 D5 T$ H; Q# h7 ?: Q& j8 Z
- GPIO_WriteReverse(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS);
8 Q7 d% y1 _. O5 F - Delay(0xFFFF);5 f+ C7 J9 s( S: r0 D1 o) b
; v; v9 B* L( b+ W; J2 b- GPIO_WriteReverse(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS);6 N3 d$ P$ W0 U* k; E0 x+ Z8 [
- Delay(0xFFFF);5 Q7 H# B5 P/ h) B; V
) a* k+ S* h3 `5 M! a* x- GPIO_WriteReverse(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS);
4 E, Z. J c7 z) d - Delay(0xFFFF);
& z! k) _" J5 W9 L/ E! i - }
& ~" |5 R( U5 g( k# T1 {' B -
p5 P$ ]5 j$ ?4 | - }
复制代码
- R' s8 d* v3 J q) x% Q
B01.rar
(707.55 KB, 下载次数: 21)
|