你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

记录学习STM8S中遇到的问题和过程....

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
本帖最后由 sincomaster 于 2018-8-3 18:03 编辑
) \! A( f9 \+ f9 X, ~9 E& q* R
/ V- ~2 D0 w# U8 F近段时间才学完C语言,现在开始学习单片机.' }; `7 ~7 i, \7 Y$ h
在这贴子分享学习过程和遇见的问题,有什么不对的地方还请多指教.  r* E& w$ U+ l
开发板:STM8S DEV BOARD(自己做的). }2 ^9 v1 c# m
主控:STM8S207CBT6
9 M/ ]1 I1 `4 Z显示:OLED(SSD1306),支持IIC和SPI两种接口/ K7 A& R% y) J9 J8 X
按键:TTP223-TOUCH KEY+3X4矩阵按键(原理图设计有误,使1.5.9键值相同)" V0 O2 ~+ X4 _. j
接口:含24L01无线接口,红外接口,18B20接口0 H8 n0 s+ n' u
电源:UCB5V供电,支持输出5V和3.3V6 g1 P0 o( o4 O4 {% A$ C3 v" e  d/ N
指示:GPIOB外接8个LED灯
) P7 N: ^- K2 b0 p( A8 i: X9 C4 Y语音:板上有语音电路; O% C# Y5 g5 r* J- d+ i
音频:喇叭和蜂鸣器/ i) w# X  ]+ T% b6 V5 v9 l, d. r
晶振:HSE(16MHz)& }: O* N+ Z2 N6 s
时钟:HYM8563
; B& A0 P2 \# m8 V3 }2 }( j存储:AT24C64D) m, h3 T" w4 e6 z: G1 F  P3 z$ E& I
字库:GT20L16S1Y
) [# W. n$ h0 a
收藏 评论15 发布时间:2018-8-3 17:54

举报

15个回答
sincomaster 回答时间:2018-8-3 17:56:33
本帖最后由 sincomaster 于 2018-8-3 17:57 编辑
  E4 n. X4 @  u; e; `
% |* l3 H+ x4 G2 I- w/ A6 F这是自已做的开发板:
+ c! q' l* \; \9 Y" t, A% ?1 W6 k3 q9 V( C
124149gs0hel3s1lh0a1k4.jpg
124155mb2fze7ckofq8eit.jpg
124232m36hgsvwv3wpduuh.jpg
124304lur552lp0j5w3ilr.jpg
124348ef1y922yneqfezyn.jpg
124432k5kdallxln56jn5n.jpg
七哥 回答时间:2018-8-3 19:35:40
板很漂亮
sincomaster 回答时间:2018-8-4 10:16:37
本帖最后由 sincomaster 于 2018-8-4 10:25 编辑
% L, V/ c! P7 ?+ p( ?4 ~& o: _, S- v* Z2 \; T/ [# O0 t
STM8S的延时程序用示波器测试了一下,和自已算出来的有误差,今天测试和前两的时间有一点点差,不知是不是我切换到外部时钟的原因,数据手册上说的1/2周期指令不清楚是算多少,我是按1周期指令来算的,% F0 w) ]6 c& q& W' a/ G! N0 Q
网上也有说16M时钟算出来有差,但8M时钟不会差,我没去试
1 z7 I2 J( l1 E/ P+ ]还有就是5us延时是,IO推挽输出波形较好,用开漏PE1输出上升沿很慢,不清楚是否正常,PE1外部上拉4.7K.0 I  S+ D, o/ c8 V( k; p
9 f7 h2 S3 b1 F' r# {

1ms

1ms

5us

5us

PE1的5us上升沿

PE1的5us上升沿

10ms

10ms

50us

50us

500us

500us
2018-08-04_101242.jpg
sincomaster 回答时间:2018-8-5 00:43:38
现在在写IIC驱动程序,可开发板做好了大家都说STM8S的硬件IIC有问题(中奖了,开发板用的就是硬件IIC)伤心呀!祝好运能早日写好测试
zero99 回答时间:2018-8-7 09:20:13
给楼主点个赞
csg123 回答时间:2018-8-12 15:44:58
sincomaster 发表于 2018-8-3 17:56* a$ r  k* g- ^$ v# y
这是自已做的开发板:

: ]& L- p+ g9 R' z+ p- _板很漂亮
sincomaster 回答时间:2018-8-12 23:55:47
本帖最后由 sincomaster 于 2018-8-12 23:58 编辑
9 Q4 l/ Q& H3 Y
/ t! O% O7 k& w" T# M经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要给我到时传上来,
  U% i4 g# a2 r# R& Q4 F, J
20180812_233703.jpg
2018-08-12_235230.jpg
2018-08-12_235150.jpg
iyumi 回答时间:2018-8-16 17:25:46
本帖最后由 iyumi 于 2018-8-16 17:27 编辑
) K' I( N$ Y6 Q$ J7 g
sincomaster 发表于 2018-8-12 23:55* F6 [9 g* R* j
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要 ...

: o! o8 m+ U8 d# i/ ~9 ~楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?
: \/ s4 s! q! B+ O! ^( |' j! G- U, `: ?! \7 _3 Z
另外你遇到的问题能不能传上来,我学习借鉴一下,先谢谢了
8 r3 O, ]7 o5 B/ w4 ~
sincomaster 回答时间:2018-8-17 17:13:17
iyumi 发表于 2018-8-16 17:252 B: y0 m  W3 Y. E
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?- I7 ^) S% u8 u7 g; y- S( i0 E8 `& ^

% E$ e' V1 h* T" J另外你遇到的 ...
$ a4 {) y9 e2 X& ?$ I7 @0 f. i
我自己有两个ST_LINK,1个是正版,另一个是30几块钱的,两个我都拆开过,ST_LINK内没有给SWIM这4根线供电,所以开发板要有电才行,我是自学,所以学习中有很多问题,自己慢慢解决,我用硬件IIC,刚调试也碰到网上说的停在while(!(I2C_SR1 & 0x02));这句就不动了,一时半会也说不清楚,我现在也还没解决调用字符数组的问题,
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************. q$ J7 J! L' y) A% T' j3 z
  2. 文件名称:        I2C文件
    $ a4 c+ o4 q+ m* A/ _' A' s
  3. 函数功能:        I2C Driver Code
    ( m( ~; M8 a0 z1 u/ I, q
  4. 软件平台:        STVD4.3.129 X( U  v" H- ?- w
  5. 编写日期:        2018.09.06
    7 z+ D, w" @4 N7 S! e+ ?: g
  6. 代码作者:        sinco.170$ @/ b3 z2 s7 s; ^
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)
    , y6 \  K" p0 h
  8. *******************************************************************************// I, {3 i9 ]8 p! b2 N5 o. I0 W
  9. #include "stm8s.h"
    0 J5 |+ B  Y: T) g9 r; O( x
  10. #include "iostm8s.h"
    8 `7 P  H  [: w" z
  11. #include "iic.h"/ C; {: J4 M- ^2 D: w# v; t

  12. $ \. t9 I1 E/ s' w8 _1 q) G, V
  13. //http://bbs.mydigit.cn/read.php?tid=2482933" O* Y& j4 R9 I/ ~
  14. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/
    ( t0 f8 x, x8 o! R6 e- }% G0 Q" E
  15. //http://www.openedv.com/thread-70958-1-1.html
    . O  M: y3 o, R- T/ T/ f# p" V
  16. //http://blog.csdn.net/DevinTT/article/details/74854851" x9 n' j7 j2 V' z2 P. r& g& j
  17. /*******************************************************************************
    7 u+ ~/ W8 i% g/ `6 t2 }
  18. 函数名称:        void IIC_Init(void)# A/ o& S5 H2 q( {' X% ?6 e, s
  19. 函数功能:        I2C初始化- ?# j  N- r! n) r' l3 a1 _! Z
  20. 输入参数:        null3 U( }* n" A# \" B
  21. 输出参数:        null
    + R: ?# _  u5 W1 U) N
  22. 编写日期:        2018.09.06; j* a8 D' O% [/ z( _
  23. 代码作者:        sinco.1707 O- d" z0 m- Z5 ?, @$ y$ W) e
  24. *******************************************************************************/
    8 n; d5 b' j% ?! I, Q) c, P
  25. void IIC_Init(void)
    ' \# q- f. F; o
  26. {        ! u6 ^8 V: e7 T$ @, h- ]
  27.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
    8 H; E( u: @" d# A
  28.         3 l# B5 f; U5 x4 N1 A
  29.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入  }0 p  o/ O4 b. G
  30.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的
    5 c7 ]7 U* L5 V( L5 g5 S- N
  31.         PE_CR2                 &= 0xf9;                       
    $ e  ~3 s. _) B, n7 c
  32.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟! h& @1 ^4 W/ M/ t# p6 F
  33.         I2C_FREQR   |= 0x10;                //时钟为16MHz* I# `; N4 \# f, a# g7 o1 ]
  34.         //I2C_FREQR   |= 0x01;                //时钟为1MHz
    8 t8 i. n  t6 T
  35.         I2C_OARH          = 0x40;                //7位地址模式9 Q! L! a7 a! v, a& k. n
  36.         I2C_OARL     = 0xa0;
    1 X4 q$ i$ K( [: y* V& [7 \
  37.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns
    5 l% P1 f* k5 E3 k& l6 ~7 g
  38.         I2C_CCRH    |= 0x00;                //I2C为标准模式- l2 v- {% O; N
  39.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
    6 a& z( I6 P" @' C8 M' Q0 F
  40.         //I2C_TRISER   = 0x02;                //时钟为1MHz时
    $ v* @' N; h9 r: X6 z
  41.         //I2C_ITR          |= 0x00;                //禁止I2C中断  x+ ^1 W: M& K+ y, ]% N
  42.         //I2C_CR2     |= 0x04;                //开启应?
    , H: i$ G* w3 l" Q4 Z3 w2 Z
  43.         I2C_CR1     |= 0x01;
    ' P3 p$ [- ]3 l: ^
  44. }
    7 [% f8 f& D# Z, r
  45. - a( m2 ^1 d, `) c) @
  46. /*******************************************************************************
    9 w6 ^8 z2 T( {9 S! B; N3 V! x- x, W  z
  47. 函数名称:        void IIC_Start(u8 addres)+ n; |  V& M6 Q8 M
  48. 函数功能:        I2C start function2 [. A, d: ~5 I0 b+ t9 F
  49. 输入参数:        null7 h- Y$ N( a7 ~% Y4 y/ B" d
  50. 输出参数:        Device Address% b* q0 ~/ l% Q$ G( W: x: x
  51. 编写日期:        2018.09.06
    ! E* ~3 F0 p& O& ]
  52. 代码作者:        sinco.1701 [" E- [; P. O4 f4 ?$ X9 Y1 ~
  53. *******************************************************************************/
    0 n! m% i1 {3 U2 s6 c! `
  54. void IIC_Start(u8 addres)
    ) ?9 p- m. |% d& E
  55. {1 R9 t7 Q  @. Q! u6 [8 T
  56.         while(I2C_SR3 & 0x02);                //检查总线是否空闲% S& Q! R1 l7 w& c
  57.         I2C_CR2 |= 0x01;                        //产生起始信号
    - B" B2 J, d7 l& o, F
  58.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成' A! O6 B, q+ v/ W
  59.         I2C_DR = addres;                        //发送从器件地址9 A4 [2 P2 {' `# J7 p( x. U
  60. }' c& ?3 \8 _/ A; U" H1 E+ @) T
  61. & T& t8 c. m! L
  62. /*******************************************************************************
    ( P: I- _" e! h2 O
  63. 函数名称:        void IIC_Stop(void); e' Y1 Z8 H) ~; d( i1 j2 {
  64. 函数功能:        I2C stop function
      U6 ?5 \: o) h
  65. 输入参数:        null) A$ N! _! e& b+ @7 {/ @9 n
  66. 输出参数:        null9 o+ ~" d" z% v
  67. 编写日期:        2018.09.06
    : B) {( O3 x/ ]# y. [' @
  68. 代码作者:        sinco.1703 I  H3 f; }& S, x" }$ f: j5 G
  69. *******************************************************************************/# g( n' B' k7 P. i- W) T
  70. void IIC_Stop(void), N; q3 p* @  E
  71. {) R8 t+ O2 @* X9 d" h5 h
  72.         //while(!(I2C_SR1 & 0x04));        //等待发送结束3 d3 u& m2 Y/ T6 l' R
  73.         I2C_CR2 |= 0x02;                        //产生结束信号
    9 H; w8 d& T! U% s$ w
  74. }
    $ U/ {; X6 ?; f) z; }7 P
  75. 8 s1 |- t) |! J6 S8 _! P! E
  76. /*******************************************************************************2 q5 R( y( y  M; c, M2 d  ^: B
  77. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)
    5 N( b% X9 q" f' \( r
  78. 函数功能:        I2C发送一个字节
    0 m- p1 P7 x0 ^2 ^
  79. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
    2 e8 e5 j2 F- u3 Y
  80. 输出参数:        null- Y7 ~0 h* l. J
  81. 编写日期:        2018.09.06
    . B  u- e2 @$ c6 ]$ Y& V
  82. 代码作者:        sinco.170* H$ Q8 u3 m/ E' D$ p( g. T
  83. *******************************************************************************/5 u5 I$ P) }. g: K" v( m$ x' a* E
  84. void IIC_SendByte(u8 addres,u8 addr,u8 dat)% ]( v$ X1 i0 U  F1 k: J
  85. {5 o- p6 M! I3 f& h/ N2 B2 Y) q
  86.         u8 temp = 0x00;2 f0 ?: L& \0 C1 L* x& u
  87.         ( B9 o# x# n1 N1 @, n9 W. {
  88.         IIC_Start(addres);                        //; ]( K9 P9 r; D
  89.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成
    9 ^& g& y" `  e& ]) j) U
  90.         temp = I2C_SR1;
    & I7 P( Y  F- W) k3 K
  91.         temp + I2C_SR3;
    $ |& D$ X7 ?: s# C' t
  92.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空8 C9 A3 @" h) O8 H
  93.         I2C_DR = addr;                                //发送写入地址到数据寄存器
    # ^& t% ~' c; `( w8 N) X
  94.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成
    8 \8 x- X2 Z7 G3 `, p4 `/ I3 W
  95.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
    ( \3 [3 K# k$ Z' Y
  96.         I2C_DR = dat;                                //发送数据
    6 E7 r7 e3 L3 g; l* a
  97.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成
    5 E2 W' @9 Z0 I
  98.         temp = I2C_SR1;                                //清除标志位9 b% ?3 I$ s5 S; F9 S
  99.         temp = I2C_SR3;
    & |8 v- r# q8 a9 g0 B
  100.         IIC_Stop();
    / @# H  x1 t% S
  101. }  r. r3 o. E6 |( t3 H+ J/ H

  102. " B- J* P+ S; M1 W9 N1 V+ d+ ~( S
  103. /*******************************************************************************
    2 K8 M8 P5 T' y# Q  U- `8 V' V
  104. 函数名称:        u8 IIC_ReadByte(void)
    $ t: J" G6 P0 B. B# S; b1 `
  105. 函数功能:        I2C读一个字节
    2 b/ f) ]# i3 n: t8 z9 k
  106. 输入参数:        null8 T+ d# C) o8 a4 b5 q
  107. 输出参数:        返回已读到的数据* J3 t; h0 p8 L6 Q( z! N2 h5 @
  108. 编写日期:        2018.09.06/ _2 K$ ^/ }3 c! G0 N
  109. 代码作者:        sinco.170
    6 }9 w2 f* @9 X3 X+ W+ n! ?; k
  110. *******************************************************************************/
    ; M/ a4 i; b  A2 O0 E* h- [, }" v
  111. u8 IIC_ReadByte(void)
    2 O% {8 F$ q# I3 `3 K2 {4 q
  112. {7 Z- s" W# M& ^! S; [
  113.        
    4 R" k4 }% P3 P; r; @
  114. }- ?  r8 K/ u! W8 r0 _# E4 S0 a
  115. 1 j  R& e7 [/ q& e
  116. void IIC_SendNByte(u8 txd)
    ! E0 t# y. H+ e( [+ ?3 D
  117. {
    9 K/ i+ f* O6 o- I
  118.         6 h+ H' E; [9 c) W1 Z
  119. }
复制代码
sincomaster 回答时间:2018-8-18 00:53:43
今晚串口发送调试成功,可以去睡觉了,明天还得上班
2018-08-18_005142.jpg
sincomaster 回答时间:2018-8-18 09:37:49
用逻辑分析看到的数据包,还是不错的,哈哈,但很奇怪我的IIC怎么没有数据包呢,我可是一直在发0xa0呀.
2018-08-18_093211.jpg
2018-08-18_093247.jpg
sincomaster 回答时间:2018-9-12 10:55:14
8月底搬了家,搞得身体累得不行,最近没有学习,研究了一下字库:GT20L16S1Y的驱动,准备国庆搞一下这个,把SPI调试一下
叶子1568 回答时间:2018-10-12 11:31:49
楼主好厉害啊
& g5 e) S: e. G$ A( c9 S
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版