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

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

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
本帖最后由 sincomaster 于 2018-8-3 18:03 编辑
3 t8 a/ p1 J  `$ D) V. s
8 ~5 L1 w" t1 Q; n, B4 U2 v近段时间才学完C语言,现在开始学习单片机.
; i; C( B6 g4 z( A3 ]在这贴子分享学习过程和遇见的问题,有什么不对的地方还请多指教.
2 H0 }3 _, @) W8 Y; [6 j+ E开发板:STM8S DEV BOARD(自己做的)
) s1 _* P4 A7 g8 U6 [! W主控:STM8S207CBT6
5 p1 u2 d" r- z* e. U显示:OLED(SSD1306),支持IIC和SPI两种接口
* G3 Z7 z, ~; m* H  R  @按键:TTP223-TOUCH KEY+3X4矩阵按键(原理图设计有误,使1.5.9键值相同)6 O0 `" f# T: t1 N
接口:含24L01无线接口,红外接口,18B20接口
4 R8 o- m0 W& W( h! L4 b! Z; P, \! r电源:UCB5V供电,支持输出5V和3.3V
$ P. S$ a$ F2 Y指示:GPIOB外接8个LED灯4 u9 D# n: i! q
语音:板上有语音电路
" S% R5 ?4 X7 l8 V8 [  ?音频:喇叭和蜂鸣器$ y2 V. D: n7 M( d/ c) i. N/ b
晶振:HSE(16MHz)1 ]/ B; H7 D& j  a' l8 N
时钟:HYM8563/ ]  x3 q( |, _* [6 f
存储:AT24C64D
) D1 D/ a! F  s+ L字库:GT20L16S1Y$ T' ]. f$ a& W# o5 F7 R0 Y' G
赞 收藏 评论15 发布时间:2018-8-3 17:54

举报

15个回答
sincomaster 回答时间:2018-8-3 17:56:33
本帖最后由 sincomaster 于 2018-8-3 17:57 编辑   E/ B( k: _5 X7 ~/ _" G. q+ ]% j  Y8 `

6 }) N. S% ^8 x4 F这是自已做的开发板:' S& Y+ C3 i2 ^$ Y' t

& I! I( d0 F* e& v3 ~4 X/ D* z
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 编辑
0 f, n( b  {9 g( l; v' O6 M% W
% s' y% s' `; ^STM8S的延时程序用示波器测试了一下,和自已算出来的有误差,今天测试和前两的时间有一点点差,不知是不是我切换到外部时钟的原因,数据手册上说的1/2周期指令不清楚是算多少,我是按1周期指令来算的,& N6 c1 S7 @0 _( I% P7 |
网上也有说16M时钟算出来有差,但8M时钟不会差,我没去试
( I) s3 u6 [4 }' f$ M* C还有就是5us延时是,IO推挽输出波形较好,用开漏PE1输出上升沿很慢,不清楚是否正常,PE1外部上拉4.7K.
) e* }8 S" {: E% r! z# _
, x( E2 t8 k# _1 ]4 K' d

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
/ K9 F; ]9 H7 Z1 _2 J' w% m这是自已做的开发板:

+ j$ J) `( L. f! Z0 Y1 e' U板很漂亮
sincomaster 回答时间:2018-8-12 23:55:47
本帖最后由 sincomaster 于 2018-8-12 23:58 编辑 : M0 _! T( X, K1 M4 ^' E4 P; |+ l

, b0 x1 |! L. f, G/ c2 B- [经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要给我到时传上来,( `* A$ Y0 r  i0 R6 G1 l9 n
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 编辑 7 n5 `& p, o$ P7 |
sincomaster 发表于 2018-8-12 23:55' G1 R- p. ^: z6 Y
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要 ...

2 i4 K) U- n' z( f$ r, M1 @( ^楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?
: f6 T4 Z" v9 O/ ]% u) B3 |, w
: n* j( T+ m6 N6 @9 p* p另外你遇到的问题能不能传上来,我学习借鉴一下,先谢谢了
# V3 w2 z0 N) Q' B# o9 H
sincomaster 回答时间:2018-8-17 17:13:17
iyumi 发表于 2018-8-16 17:25. a# f( _% q( b' C5 Q% D2 \* h; y
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?3 k4 O- A' a+ Q/ A" Z: j& v

0 \  {6 I" D+ g另外你遇到的 ...

5 ~& c, _( j; {1 z我自己有两个ST_LINK,1个是正版,另一个是30几块钱的,两个我都拆开过,ST_LINK内没有给SWIM这4根线供电,所以开发板要有电才行,我是自学,所以学习中有很多问题,自己慢慢解决,我用硬件IIC,刚调试也碰到网上说的停在while(!(I2C_SR1 & 0x02));这句就不动了,一时半会也说不清楚,我现在也还没解决调用字符数组的问题,
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************! f0 e; C2 g9 m" w7 _( u
  2. 文件名称:        I2C文件5 Y9 |5 C- q9 X- n  b+ x; n
  3. 函数功能:        I2C Driver Code3 p$ r4 U7 b5 _
  4. 软件平台:        STVD4.3.12" E% I) m/ B; j# ?5 l2 [& K
  5. 编写日期:        2018.09.06& X5 E/ {! L$ V
  6. 代码作者:        sinco.170
    # O" M. [2 P- A+ C: Z
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)& u# w: }/ R1 L# n, r
  8. *******************************************************************************/7 S8 B1 A: f9 e" R$ R
  9. #include "stm8s.h"$ F# N- s1 [8 @0 y
  10. #include "iostm8s.h"* _* z6 {8 Z! c+ p/ l
  11. #include "iic.h"5 u. ]* J( m8 N1 d

  12. * g' T5 M9 a4 ~/ ?
  13. //http://bbs.mydigit.cn/read.php?tid=2482933( s3 x0 r, i7 J. e
  14. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/* ?1 J) M' F' W1 |" n) V# T
  15. //http://www.openedv.com/thread-70958-1-1.html8 o  R7 Z4 K: [; }8 U8 S$ A3 g! _8 \
  16. //http://blog.csdn.net/DevinTT/article/details/74854851: |3 y- c. C: c- c# D4 ]
  17. /*******************************************************************************1 ~1 b0 f5 i; t+ i  ^! i8 L8 G
  18. 函数名称:        void IIC_Init(void), p8 n5 F& C  W# k+ \: H- p
  19. 函数功能:        I2C初始化/ z/ D5 N6 E8 ?6 W0 M4 X( L
  20. 输入参数:        null
    % v- u& c6 B! g0 v5 B2 B
  21. 输出参数:        null
    6 X- h( k% X. p7 e# T, L
  22. 编写日期:        2018.09.06  ~6 H" v" e$ v3 I: [
  23. 代码作者:        sinco.170
    ) n' c+ Y' J, |! p+ S8 i
  24. *******************************************************************************/+ f. Y. K7 {& D  g# e' m# S
  25. void IIC_Init(void). _( ?- i! c; j+ Q) F8 y
  26. {        + l/ x( \* j, l6 H( c
  27.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
    : o7 p+ P# H, @  e/ e" z
  28.        
    & n+ X/ C$ T0 o8 m
  29.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入
    ! T# t- g" z5 M) G* z4 M
  30.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的
    ) J6 p) D5 V; N& z0 I0 z
  31.         PE_CR2                 &= 0xf9;                        5 W3 T1 M; P" Q& a9 d
  32.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟
    5 i. }; t) U9 W* _# G, v- r9 |
  33.         I2C_FREQR   |= 0x10;                //时钟为16MHz
    ) v% S1 I9 V. ^9 d# \, g
  34.         //I2C_FREQR   |= 0x01;                //时钟为1MHz* u4 q5 ?1 C: D6 Z! C" O
  35.         I2C_OARH          = 0x40;                //7位地址模式. h: e* @8 ]" ~: D" N1 m" G
  36.         I2C_OARL     = 0xa0;
      P4 g5 i: D9 L  S: Z' i
  37.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns
    - e3 p& e$ M; _) J7 z+ ?
  38.         I2C_CCRH    |= 0x00;                //I2C为标准模式
    ) W$ X4 c" ]& Y# L2 p2 C
  39.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
    : Z1 |2 S! o( @7 @) B$ ?+ K
  40.         //I2C_TRISER   = 0x02;                //时钟为1MHz时% Q1 X8 K7 g# B) _# w  u& H
  41.         //I2C_ITR          |= 0x00;                //禁止I2C中断% G3 e7 u. x( ~3 G
  42.         //I2C_CR2     |= 0x04;                //开启应?
    % y, u! Z( e6 T$ P/ G
  43.         I2C_CR1     |= 0x01;
    + b: w! B* A/ A; W
  44. }, m7 |3 \' _7 ]9 L! j' ^7 ?

  45. : }: T4 b* r! g5 U  ^" h( ~, q
  46. /*******************************************************************************' c9 e  k* A) }7 j7 G( q" ]2 Y! c/ F2 T: X6 z
  47. 函数名称:        void IIC_Start(u8 addres)
    9 V' E3 ~! x* \  [( t# H4 X
  48. 函数功能:        I2C start function3 B# B. N! W$ q# n& B2 [
  49. 输入参数:        null7 t( `) _" ~$ b; }# [+ C3 C& d
  50. 输出参数:        Device Address, V) H/ X3 o; j2 H% m
  51. 编写日期:        2018.09.06
    , `* a& F, Q& h% w; Q
  52. 代码作者:        sinco.1702 L! I. ~5 Z/ R) B
  53. *******************************************************************************/
    6 @% ?. P. Y8 B- B! I  ^$ T
  54. void IIC_Start(u8 addres)
    # }: _! v/ u( W; E" V6 G
  55. {! q$ d0 `, v: s9 V$ Z1 s
  56.         while(I2C_SR3 & 0x02);                //检查总线是否空闲
    0 |5 F0 M5 u9 O
  57.         I2C_CR2 |= 0x01;                        //产生起始信号
    # Z! i; B- l3 k- f/ c  [! \" a- h
  58.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成
    / [# G( M9 J- u$ ]
  59.         I2C_DR = addres;                        //发送从器件地址
    ( w6 k0 Q3 y, ?6 o% F
  60. }
    2 f$ V( _7 [& }6 M

  61. $ j" Z1 n3 s  Z4 k
  62. /*******************************************************************************: r0 s) h$ s9 D0 {* t3 y
  63. 函数名称:        void IIC_Stop(void)
    * x$ \2 M; R( i$ ]( g
  64. 函数功能:        I2C stop function
    ; V- P8 e( ?8 n' j9 t! L
  65. 输入参数:        null
    + D& n3 r" c/ C7 O) t
  66. 输出参数:        null1 l* f- \4 k) p! q3 E: _. I1 L
  67. 编写日期:        2018.09.06! ^4 _5 a3 d% P% T- J: S, P
  68. 代码作者:        sinco.170. O' L+ M& a5 T
  69. *******************************************************************************/
    , T+ h' t5 |4 v7 R* @) R
  70. void IIC_Stop(void)
    6 f3 y' y3 w5 L  z5 b7 q8 e
  71. {
    ! j6 y6 [% b% u8 x# \$ i
  72.         //while(!(I2C_SR1 & 0x04));        //等待发送结束
    ' }. t4 @& Y; k; |
  73.         I2C_CR2 |= 0x02;                        //产生结束信号
    : u& |0 ?% E- s& \
  74. }6 w, U! l* X! ~8 R+ @: W) M0 C
  75. 2 X: m% W  D, g- V2 u7 a
  76. /*******************************************************************************
    / L) |) I. w4 Z2 Y( n: H+ l8 g
  77. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)
    # M( g- k  W) n  [; P2 g
  78. 函数功能:        I2C发送一个字节5 O" R' y" P% d: j" ]
  79. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
    9 r1 U" R4 j8 Y9 M4 c2 @  s
  80. 输出参数:        null0 l' x; _8 [- o/ c9 c' w$ F) `2 d$ E
  81. 编写日期:        2018.09.066 w& K9 \: I7 e# R  @
  82. 代码作者:        sinco.170
    ; ~6 h/ z" f% a+ e
  83. *******************************************************************************/
    3 ?" q) P+ x' O' E  q
  84. void IIC_SendByte(u8 addres,u8 addr,u8 dat)
    9 w4 q! }1 x! P" j- f& j
  85. {1 n2 P2 @3 B% F4 _, i: r
  86.         u8 temp = 0x00;* s, [& `8 D  x7 V
  87.        
    ( o& L6 j5 Z9 }" E- V9 R
  88.         IIC_Start(addres);                        //# f' d0 q8 g8 x+ q* ~
  89.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成
    $ q7 E! `0 ]- D, r! @7 M5 }- ?
  90.         temp = I2C_SR1;' i5 j# T1 q& S( i5 K
  91.         temp + I2C_SR3;. s/ i) `; A- L( R, H8 O! v9 }
  92.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空! k8 {5 m; Y  Z+ Y8 z& A& E+ I
  93.         I2C_DR = addr;                                //发送写入地址到数据寄存器  t+ e" r: l) g" [& H
  94.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成! Z. k: G) S5 a4 O
  95.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空4 G0 I" P, w8 k  U7 |, P5 ]/ @
  96.         I2C_DR = dat;                                //发送数据6 J' l9 |, P* [5 N: }' u" u
  97.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成" G, H; b0 h6 d. t- }! F" W5 T
  98.         temp = I2C_SR1;                                //清除标志位
    ) T* \! \% w& y# }; a+ L: {# q
  99.         temp = I2C_SR3;' `& i# e8 @' F+ ~
  100.         IIC_Stop();6 l1 Y  x6 G+ f( M( t
  101. }# h' w  n2 e+ i8 A

  102. + Z# o9 ^- k4 P1 i  w/ _
  103. /*******************************************************************************
    - x8 I. P: W; N& I4 b9 s% X; T
  104. 函数名称:        u8 IIC_ReadByte(void)3 n# U6 e1 B% Y
  105. 函数功能:        I2C读一个字节# Z" a8 o( Q2 g7 [" v
  106. 输入参数:        null
    0 M5 W  T2 P+ m# O* _* }- o
  107. 输出参数:        返回已读到的数据
    - g# }3 H+ b4 |7 t9 D
  108. 编写日期:        2018.09.068 ~& r& K" E  T# d' ]
  109. 代码作者:        sinco.170
    5 S% n+ r& Y) U7 r3 _' H
  110. *******************************************************************************/
    4 g7 u4 u  S# v+ \$ l) C* d
  111. u8 IIC_ReadByte(void)/ B. ~6 V9 a8 J- V6 _) V/ @
  112. {( M, x6 ]  n! @3 r3 V  t/ W
  113.        
    % |! I1 i' C; I/ D
  114. }4 `* D& R' e. M5 V' u, M4 [

  115. 9 P" l/ c$ M1 v8 P
  116. void IIC_SendNByte(u8 txd)
    4 M9 r) P: W- ^
  117. {
    : I& ~5 c5 p) H& r
  118.         4 `4 g7 ^% h! o% M8 |
  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
楼主好厉害啊
8 Q5 b2 i3 L2 d1 U( C8 k
12下一页

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版