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

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

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
本帖最后由 sincomaster 于 2018-8-3 18:03 编辑 & G  c3 l7 P( a
* @6 d7 J! f8 J  H
近段时间才学完C语言,现在开始学习单片机." B5 @  e) g0 Q; ]
在这贴子分享学习过程和遇见的问题,有什么不对的地方还请多指教.# ~/ S$ R6 O5 B; }7 Q! z
开发板:STM8S DEV BOARD(自己做的)* J4 y+ E* H! S# i
主控:STM8S207CBT6
" q3 v9 \( V4 {7 |8 b, n" s显示:OLED(SSD1306),支持IIC和SPI两种接口+ e# _4 [, ?. V* p9 s5 Y6 o
按键:TTP223-TOUCH KEY+3X4矩阵按键(原理图设计有误,使1.5.9键值相同)
: v4 @" _4 P! g* Q接口:含24L01无线接口,红外接口,18B20接口
8 I, z# D+ @' C6 g) c; j+ v2 k电源:UCB5V供电,支持输出5V和3.3V
* N5 c& m6 H  ~6 w/ a0 `指示:GPIOB外接8个LED灯
3 e2 G$ O/ z8 u1 O6 G语音:板上有语音电路
, o) w: \9 \! d1 ?- y音频:喇叭和蜂鸣器
( q9 d- M& k9 P晶振:HSE(16MHz)
, L4 d, ~- L8 p/ r时钟:HYM85633 v" {- x4 d* i1 u6 ^- B# P; {
存储:AT24C64D
5 ]4 {4 O- L, {( D( L  e$ _5 b+ v字库:GT20L16S1Y9 P% ]3 h8 n3 p$ F7 x
收藏 评论15 发布时间:2018-8-3 17:54

举报

15个回答
sincomaster 回答时间:2018-8-3 17:56:33
本帖最后由 sincomaster 于 2018-8-3 17:57 编辑 7 Y# a- F: M5 i- V4 m. V" T" u
+ Y( i- J4 q, Y, F* C  n" l
这是自已做的开发板:- z7 J9 w5 ^7 j7 \

; T7 |+ L- G  H
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 编辑
! V3 o5 `) X# |4 }* p- Y
! ?( S6 o6 }; h0 d2 BSTM8S的延时程序用示波器测试了一下,和自已算出来的有误差,今天测试和前两的时间有一点点差,不知是不是我切换到外部时钟的原因,数据手册上说的1/2周期指令不清楚是算多少,我是按1周期指令来算的,
5 H0 r  P! p( y/ a! q! [' X2 Z网上也有说16M时钟算出来有差,但8M时钟不会差,我没去试
, u3 S0 T* b0 A8 r: x还有就是5us延时是,IO推挽输出波形较好,用开漏PE1输出上升沿很慢,不清楚是否正常,PE1外部上拉4.7K.9 [' l: I( f8 i7 s. Z: Z- H

+ |6 d9 e$ e% z( u/ ~  q4 f

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
% Y. s2 G. I8 J这是自已做的开发板:
% z" A- s- r  k) A
板很漂亮
sincomaster 回答时间:2018-8-12 23:55:47
本帖最后由 sincomaster 于 2018-8-12 23:58 编辑
$ S0 g0 O  Q" I: ]1 ?, B- G4 y# B% a3 Q" j$ b3 n
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要给我到时传上来,' N# N) x0 F3 d+ |4 d- I6 U$ Q; K
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 编辑 & J% }0 \  f/ x1 \7 n
sincomaster 发表于 2018-8-12 23:558 s; H7 h- C) v7 P4 U+ l5 n2 l! t
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要 ...
6 F( t; z1 [- ^+ K( m
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?
! S: I& Q3 \3 N% Q% N  Y) U
2 ~2 m) Y9 a: r9 y' {' R另外你遇到的问题能不能传上来,我学习借鉴一下,先谢谢了
: m1 g  K; F( W$ y
sincomaster 回答时间:2018-8-17 17:13:17
iyumi 发表于 2018-8-16 17:25
4 {3 R* ~9 g; w  q( I- ^+ N楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?
3 B6 s6 R  x( G# }3 j9 a, H
  p# M. R& l( o; P- ~9 R2 A另外你遇到的 ...
! d% S0 P/ a+ A% y5 a: x' [' u7 ]
我自己有两个ST_LINK,1个是正版,另一个是30几块钱的,两个我都拆开过,ST_LINK内没有给SWIM这4根线供电,所以开发板要有电才行,我是自学,所以学习中有很多问题,自己慢慢解决,我用硬件IIC,刚调试也碰到网上说的停在while(!(I2C_SR1 & 0x02));这句就不动了,一时半会也说不清楚,我现在也还没解决调用字符数组的问题,
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************+ F1 g" Z; C% Z: I; s" ]
  2. 文件名称:        I2C文件2 r# n/ G+ Q5 V$ d. _' `7 C
  3. 函数功能:        I2C Driver Code
    2 |8 i1 N$ l1 I$ u  V. m1 M$ j8 {' t/ D
  4. 软件平台:        STVD4.3.12
    & i0 A" p, N8 t0 G6 e
  5. 编写日期:        2018.09.06
    & J$ _& Y6 g. j% T- ], S5 I4 f* ~
  6. 代码作者:        sinco.170
    - F5 `' ?7 Z# j6 p+ ~% x
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)! X% w/ a% M$ m; B
  8. *******************************************************************************/
    ' n+ x" n4 N# \+ U! U. c
  9. #include "stm8s.h"8 t8 f$ m: H2 q9 K0 I/ S
  10. #include "iostm8s.h"
    ' |& D  s9 Y. D, f/ W
  11. #include "iic.h"& U1 M, c4 r& F

  12. - f( K8 p. U4 G5 i
  13. //http://bbs.mydigit.cn/read.php?tid=2482933# \( F7 h. y; }8 q" Z+ |  b% l$ b
  14. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/# C+ V% ]4 ~  U& o# i
  15. //http://www.openedv.com/thread-70958-1-1.html
    ) P7 e% n: K0 v
  16. //http://blog.csdn.net/DevinTT/article/details/74854851" ?8 Q& H: |) x$ R. }
  17. /*******************************************************************************
    # }/ ?" t  M$ D9 i4 O$ q3 q% M
  18. 函数名称:        void IIC_Init(void)3 l8 j8 m+ T, Y: \, t" x* O
  19. 函数功能:        I2C初始化- ?  H) _( U1 p9 c2 k
  20. 输入参数:        null
    " d0 F5 ~, p- d9 l' p
  21. 输出参数:        null
    : \4 o- ~* i/ [8 z( V+ S3 U
  22. 编写日期:        2018.09.064 M/ m0 |+ [3 x% p8 h- q
  23. 代码作者:        sinco.170
    ' X# w0 J/ m/ ~5 D# _2 v& J: c
  24. *******************************************************************************/* `9 \7 R4 y% w. u' L7 A8 [
  25. void IIC_Init(void), M4 i' \$ R+ L; `$ i$ {
  26. {        - c- \* T  K- s
  27.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
    0 @+ T6 u3 {- {' V8 I
  28.         5 z$ E! C5 ?. i5 M
  29.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入
    - b1 m) Q& h: i: \* p+ p
  30.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的' S0 u) W7 c$ A
  31.         PE_CR2                 &= 0xf9;                          a: `( U" ^" ^/ @
  32.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟
    5 J! c7 G1 h* L+ }: \% H7 u3 A
  33.         I2C_FREQR   |= 0x10;                //时钟为16MHz* Z3 h% {& E/ g9 g0 d) C* H  f6 I
  34.         //I2C_FREQR   |= 0x01;                //时钟为1MHz
    * u) P) I$ g- A( A2 g- I" O
  35.         I2C_OARH          = 0x40;                //7位地址模式& D& L/ r( M' _: d4 p$ Z5 D
  36.         I2C_OARL     = 0xa0;
    & l! b. [0 }5 }+ v
  37.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns
    8 }2 Y& Q3 ~3 |$ I/ A# |" C) E" T, b
  38.         I2C_CCRH    |= 0x00;                //I2C为标准模式
    + B1 `; s6 x: s" v
  39.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
    0 X: X$ [- b6 y+ ]+ K+ R4 \
  40.         //I2C_TRISER   = 0x02;                //时钟为1MHz时" I1 a; y' L0 X$ B0 H
  41.         //I2C_ITR          |= 0x00;                //禁止I2C中断
    8 W: S; M) [& r
  42.         //I2C_CR2     |= 0x04;                //开启应?
    * H2 z! s1 U+ _$ D
  43.         I2C_CR1     |= 0x01;' L# e2 t  B& S3 e9 g) ~7 s7 u
  44. }
    0 C& g5 Z- o7 Z, q) ^! K! s) P

  45. 7 T4 @( P+ H  F8 S; [! A( g
  46. /*******************************************************************************
    ; l& ^  P3 M( a0 S, G
  47. 函数名称:        void IIC_Start(u8 addres)& L- g- B+ y9 Q3 H4 c5 P
  48. 函数功能:        I2C start function
    9 e! E5 f& t, Y; W8 {1 o
  49. 输入参数:        null5 B- @5 f( x* N" W2 E9 ~0 t
  50. 输出参数:        Device Address
    8 J- |9 r/ t, D2 U! H& J
  51. 编写日期:        2018.09.06  |9 d, l6 [. n% d- Z# H/ T
  52. 代码作者:        sinco.170
    1 `0 s6 x9 [3 A% ~5 C. X2 d6 u
  53. *******************************************************************************/
    ) W# H5 p& s: X% d( s; I
  54. void IIC_Start(u8 addres)$ p# |, v" @) b* Y$ b& k8 _
  55. {
    # g' N, R( e7 _( J; d
  56.         while(I2C_SR3 & 0x02);                //检查总线是否空闲0 @5 N/ i: P7 B1 e+ I1 H2 T
  57.         I2C_CR2 |= 0x01;                        //产生起始信号, ?( X3 N& V- ?9 H9 x' N
  58.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成4 w0 m! {1 z; V- a. i! d
  59.         I2C_DR = addres;                        //发送从器件地址
    . m" r0 B$ B* M1 p! l3 W: |
  60. }
    9 }: {& A3 Y) U. Z6 U: i) K0 T

  61. ' b; C1 O7 s% E; t3 B
  62. /*******************************************************************************0 S% r" J, Q& r( N4 E4 ]! l$ j, T
  63. 函数名称:        void IIC_Stop(void)
    6 M4 ^2 P/ ^. O6 h& }+ T5 X# \
  64. 函数功能:        I2C stop function9 S+ y% Z$ x1 F
  65. 输入参数:        null* E5 L4 t4 k) x) m* v
  66. 输出参数:        null
    - K1 }: s5 \* h1 J8 M
  67. 编写日期:        2018.09.06. g9 o+ d! Q/ O3 r* C' \
  68. 代码作者:        sinco.170
    7 p0 R( z. Y, ^/ {; ^0 Y1 W
  69. *******************************************************************************/
    7 y2 c% \3 [9 Q1 D
  70. void IIC_Stop(void). [! _8 u6 l3 i
  71. {
    ) g9 Y3 X/ M- Y8 H7 Y
  72.         //while(!(I2C_SR1 & 0x04));        //等待发送结束
    1 T0 z: F# d7 V4 q* I1 y! `) k  u9 ]
  73.         I2C_CR2 |= 0x02;                        //产生结束信号8 _# |* l( M  U4 F9 D
  74. }& N. t3 P1 Y! I! f) K& P
  75.   i% L6 v" l3 R( W
  76. /*******************************************************************************
    & ~4 H& X& S4 Q( `% e# p0 z3 i
  77. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)
    4 f. h, {+ L6 B* R  a! z" [; ~  I3 l
  78. 函数功能:        I2C发送一个字节% @) d4 Q" ?7 _, y/ W
  79. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
    7 n& V; h' `& _: D4 x
  80. 输出参数:        null
    ; N3 P1 Q5 K; y$ [% l3 |
  81. 编写日期:        2018.09.06. Z0 _5 }6 K, J8 Z: S# f0 ]
  82. 代码作者:        sinco.170
    ; C+ T. {' q6 p
  83. *******************************************************************************/
    ! H; T/ T  T. P. J% N, E' ~- G1 k2 |
  84. void IIC_SendByte(u8 addres,u8 addr,u8 dat)2 N/ b/ a# A4 u2 `" C- B6 l! q& G
  85. {
    4 l/ |  U, w7 |: J  a, Z3 `
  86.         u8 temp = 0x00;8 V8 S; {' u) n
  87.         ' x0 u6 @4 G( E7 g1 j5 ~! y, q
  88.         IIC_Start(addres);                        //
    / v( ]* y9 v6 G3 J
  89.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成& J& Y+ C5 q8 Q' Y1 Q
  90.         temp = I2C_SR1;
    9 a; ]/ ]- `$ [' _- V- c/ U
  91.         temp + I2C_SR3;8 `) C% C) r3 {4 q  G0 G1 X
  92.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空. w, W3 Q5 e8 _/ d' W
  93.         I2C_DR = addr;                                //发送写入地址到数据寄存器
    " N2 Y  o4 L4 H3 k: h
  94.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成
    $ C: }- x+ b% D: e# o6 B' O
  95.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
    - h/ b8 s3 T4 r  G$ |
  96.         I2C_DR = dat;                                //发送数据
    & X9 @# ?, P8 q* N4 q6 t6 p. G
  97.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成. D0 P) c# Q! T) B6 E2 q. p1 ~7 \: ?: x
  98.         temp = I2C_SR1;                                //清除标志位2 L# ?+ x; v! M% t3 v6 `$ h7 J
  99.         temp = I2C_SR3;. X$ P$ H# ?5 U) ]/ Z
  100.         IIC_Stop();
    7 U3 g( j( ^/ X$ }& }* e
  101. }
    " Q, X- i; u" ?- ~' K
  102. : z; m) ?% u- c, R
  103. /*******************************************************************************
    ) g) m; d+ V8 N' r% E+ z. {
  104. 函数名称:        u8 IIC_ReadByte(void)
    & F2 {- H7 Z5 h( ?4 z
  105. 函数功能:        I2C读一个字节' v# q) s. F' l1 d  ?% V5 J
  106. 输入参数:        null
    ! D. G  ?$ U0 J) h0 S4 B+ ^9 |) a
  107. 输出参数:        返回已读到的数据2 W6 y/ u1 G9 E# f& I
  108. 编写日期:        2018.09.064 S5 e! g! X4 r4 s3 q( r  [1 ?
  109. 代码作者:        sinco.170
    3 ~9 R! |( G) \3 X( g7 z
  110. *******************************************************************************/9 \2 ^8 I0 Q- `1 p6 \! D
  111. u8 IIC_ReadByte(void)# O: a& y+ Z3 F) o) _
  112. {$ S+ v# q5 f/ R  H8 c+ y2 c* k+ J0 n# F
  113.        
    ! k: B7 k' |# d1 B
  114. }& {0 A* z* |$ r) [& W
  115. ( ]7 ^( [- z: j% ?* J: l
  116. void IIC_SendNByte(u8 txd)
    6 H; \& _- b  j- J7 _1 w) A5 k9 o
  117. {. G% @. U3 I6 z* Y  U7 @
  118.         % t6 u" `. z' w( r( y1 _! f8 ?' @
  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
楼主好厉害啊
& i! S0 d3 l( B$ g/ c" C: N
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版