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

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

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
本帖最后由 sincomaster 于 2018-8-3 18:03 编辑 1 s: G8 s; K7 O# G5 W5 n3 g6 j: g6 l

3 G) M- ~  Z  p- Z  [近段时间才学完C语言,现在开始学习单片机.
' X( f3 q1 h- {- \1 D2 ?: e/ }在这贴子分享学习过程和遇见的问题,有什么不对的地方还请多指教.4 B; h# F8 X3 L  H- ~# W
开发板:STM8S DEV BOARD(自己做的)
. g2 p2 f  Q8 r$ Z主控:STM8S207CBT67 w% p1 w, F& D! G1 `3 W
显示:OLED(SSD1306),支持IIC和SPI两种接口
" W) |! |/ J* W按键:TTP223-TOUCH KEY+3X4矩阵按键(原理图设计有误,使1.5.9键值相同)3 {5 @: S3 S" l2 g
接口:含24L01无线接口,红外接口,18B20接口
6 S, ^/ Y5 y: Q9 m; Q) c5 l电源:UCB5V供电,支持输出5V和3.3V, Q( W% T( }& p' s" p0 R9 l
指示:GPIOB外接8个LED灯
( a7 C' C6 I" H* r" O+ Z语音:板上有语音电路
! S) M& B: N: l- K0 f/ W: l* w4 G0 {% a音频:喇叭和蜂鸣器' A( F1 `8 ~% y1 p3 }7 P
晶振:HSE(16MHz)/ M2 i" W( [- s8 h8 P2 ?# p8 G
时钟:HYM85632 @8 x8 j1 Z) E. @$ O" `
存储:AT24C64D
: |5 ]8 G9 U" n% `字库:GT20L16S1Y
" o, L2 y& b  x
赞 收藏 评论15 发布时间:2018-8-3 17:54

举报

15个回答
sincomaster 回答时间:2018-8-3 17:56:33
本帖最后由 sincomaster 于 2018-8-3 17:57 编辑 - X. K" e! }4 s9 G* v$ N, X
1 ]( v" o+ r+ `' J& Q" |
这是自已做的开发板:% Z. ~# d) P! f7 E7 P, W  x9 c0 ^

& A" F: h* Y8 }
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 编辑 / ]5 D; l0 N% I7 T& T7 Z" u' I- K7 e! Y
$ n$ p: f# m. k  D. V, w
STM8S的延时程序用示波器测试了一下,和自已算出来的有误差,今天测试和前两的时间有一点点差,不知是不是我切换到外部时钟的原因,数据手册上说的1/2周期指令不清楚是算多少,我是按1周期指令来算的,
, G# D) h, S$ F0 B网上也有说16M时钟算出来有差,但8M时钟不会差,我没去试4 D: u' v2 Y% i: P* I
还有就是5us延时是,IO推挽输出波形较好,用开漏PE1输出上升沿很慢,不清楚是否正常,PE1外部上拉4.7K.- m) o$ h. y1 s" n8 ~* n* |2 `. d* i( P# P

8 ~/ u; t5 A2 ?% k# Y

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:562 g/ u/ o7 Y9 G' t. {. g7 ]
这是自已做的开发板:
* l. d8 ]  u- d! @- {0 j
板很漂亮
sincomaster 回答时间:2018-8-12 23:55:47
本帖最后由 sincomaster 于 2018-8-12 23:58 编辑
7 d2 R" H* A& G2 M* p& W2 [: X, I1 N/ t5 s
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要给我到时传上来,) e$ J% x/ }; g- b  ^% B8 h/ 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 编辑
; K6 s# w/ l% G7 r, Y; I+ Q
sincomaster 发表于 2018-8-12 23:55  D2 Y2 ]* \3 _" T6 W1 H' J
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要 ...
6 F! F6 a/ ]! v, M
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?
5 l. P8 x- S, h# L, I6 F- J5 G
; [' N- \6 {6 m" M另外你遇到的问题能不能传上来,我学习借鉴一下,先谢谢了
* Z& l! _/ C, t- Q
sincomaster 回答时间:2018-8-17 17:13:17
iyumi 发表于 2018-8-16 17:25( ?' M- [# x: A% m1 w& B9 k
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?( C/ w( {: Q/ G( i

0 }* M: S! ~1 n3 o3 \8 S+ X: R另外你遇到的 ...

  I, [) H7 |5 M: z我自己有两个ST_LINK,1个是正版,另一个是30几块钱的,两个我都拆开过,ST_LINK内没有给SWIM这4根线供电,所以开发板要有电才行,我是自学,所以学习中有很多问题,自己慢慢解决,我用硬件IIC,刚调试也碰到网上说的停在while(!(I2C_SR1 & 0x02));这句就不动了,一时半会也说不清楚,我现在也还没解决调用字符数组的问题,
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************
    / z& X( ~( w# h/ K3 z. Y. @2 z
  2. 文件名称:        I2C文件5 x* P7 W0 k9 z7 Q; Q
  3. 函数功能:        I2C Driver Code
    & }2 \0 o' d6 A. D# e. d  s
  4. 软件平台:        STVD4.3.12
    / D  _8 p" t4 u% m5 n
  5. 编写日期:        2018.09.06& m8 @3 J+ J, H% w8 f
  6. 代码作者:        sinco.170
    - ~3 R4 E, {: I2 ~1 @% w8 x. l
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)
    * q' z+ o( R+ k0 A
  8. *******************************************************************************/8 e+ e8 v* P3 G, k
  9. #include "stm8s.h"
    $ N2 \; _  t/ {3 m  D1 W+ g7 `/ @, \
  10. #include "iostm8s.h"
    # r- Z& L- d8 u8 o# i: f' T1 w
  11. #include "iic.h"9 u/ _% L9 X; j" L7 C! n( l

  12. + Y, L* L& o1 j* i; g+ H8 E
  13. //http://bbs.mydigit.cn/read.php?tid=2482933  n' v3 `& B/ U' p: m0 ~
  14. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/3 U5 \1 d; N) H4 q  X# ~0 O
  15. //http://www.openedv.com/thread-70958-1-1.html; p5 _# y4 [- g, P* Z* ]* G
  16. //http://blog.csdn.net/DevinTT/article/details/74854851
    & T" u6 X: K. w- r
  17. /*******************************************************************************
    % d4 J) M$ |6 M9 t
  18. 函数名称:        void IIC_Init(void)
    ' ]3 w' l  ~+ a$ V: `
  19. 函数功能:        I2C初始化3 B- D+ T, O; }. q& v) A
  20. 输入参数:        null
    . d- Z1 u, `& S+ i- y
  21. 输出参数:        null7 \/ i3 L! `7 u* J
  22. 编写日期:        2018.09.069 A. V- \$ V# {6 o
  23. 代码作者:        sinco.170
    - A! _' q& |' t* T7 g& S2 U
  24. *******************************************************************************/" G( @. n; R) ?/ m
  25. void IIC_Init(void)
    3 p  m& G& j& |+ S1 h6 M
  26. {       
      q% Y& U+ u  ?
  27.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
    & y$ b6 Z* U) \- p
  28.        
    % [" J. Z, Y# h- M% u/ S
  29.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入$ `: d- A; V0 r; L3 S& |
  30.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的
    ) Y. h* S$ v. i4 F& d
  31.         PE_CR2                 &= 0xf9;                       
    / l, U5 L$ d& q8 s/ d7 `3 r
  32.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟/ b' R" n. U- K
  33.         I2C_FREQR   |= 0x10;                //时钟为16MHz
    % X- m6 C$ G- o# D/ [9 V
  34.         //I2C_FREQR   |= 0x01;                //时钟为1MHz
    1 B0 A& ~6 j; s$ u% k
  35.         I2C_OARH          = 0x40;                //7位地址模式( ^9 P* X% \  v3 a' y  E
  36.         I2C_OARL     = 0xa0;
    1 W( A$ f/ z9 `3 D* r1 ]1 O* [+ z
  37.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns/ h6 ?3 M) p/ |9 @# N
  38.         I2C_CCRH    |= 0x00;                //I2C为标准模式& b. J9 y5 G$ x8 I8 z. ?2 ]: H
  39.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11) o5 I2 L( i0 R" A& l$ {
  40.         //I2C_TRISER   = 0x02;                //时钟为1MHz时/ G. ]# {( H. q, ?7 N) q+ C
  41.         //I2C_ITR          |= 0x00;                //禁止I2C中断
    , K3 h$ ], _9 a
  42.         //I2C_CR2     |= 0x04;                //开启应?: V1 p1 s* E$ k; A. v
  43.         I2C_CR1     |= 0x01;1 V! j( y5 E1 g
  44. }& w4 m6 V- v9 o, S# i

  45. 7 T9 H0 M5 Z% U6 K8 x9 g
  46. /*******************************************************************************4 C0 }' n1 b1 y8 I
  47. 函数名称:        void IIC_Start(u8 addres)4 {8 A8 S1 |8 y# \& a% X( e
  48. 函数功能:        I2C start function. b0 h2 q  R0 G8 q4 q
  49. 输入参数:        null
    3 h, |& Q$ |* y5 G) y# \
  50. 输出参数:        Device Address
    * _4 @' R0 _, o6 y; t
  51. 编写日期:        2018.09.06
    ! Y  N( w* J4 {$ y
  52. 代码作者:        sinco.170
    8 P& C" X/ t& R5 I( x
  53. *******************************************************************************/
    ; @" [) ?+ F0 I$ s5 t5 M" `
  54. void IIC_Start(u8 addres)! R+ g% p: v* n& |% v4 ^
  55. {; W; F& U0 {: x
  56.         while(I2C_SR3 & 0x02);                //检查总线是否空闲
    7 w8 \* Z7 G- O- n2 }* G$ w
  57.         I2C_CR2 |= 0x01;                        //产生起始信号2 ^: ~& h( t4 A7 W; s8 F- k
  58.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成: Z" i& E  m0 d9 v
  59.         I2C_DR = addres;                        //发送从器件地址7 X' o3 _/ @8 j3 v2 B  M( R! d0 i; N
  60. }' [, n  {0 T' j. ?9 j0 O) a7 {

  61. ' a0 R0 j" J7 ^: E9 J) ?
  62. /*******************************************************************************
    * b! K. E; d) h0 K% S
  63. 函数名称:        void IIC_Stop(void)% m* A% R9 @" s3 p0 B( M+ }( U
  64. 函数功能:        I2C stop function2 I  S8 g8 U8 N! V" w
  65. 输入参数:        null
    4 S6 R' e& t4 @. P/ d. \4 O0 w4 E* O8 ^
  66. 输出参数:        null2 U- @1 Q2 Q& l5 `
  67. 编写日期:        2018.09.06+ M) x% T* b# S0 v
  68. 代码作者:        sinco.170  L3 R8 T8 j: V( K) E- I
  69. *******************************************************************************/8 E: R0 r- h. m( n6 A& ]/ Y
  70. void IIC_Stop(void)
    5 g. e/ r2 T3 Y4 [( r" l1 S
  71. {
    : T) Z4 p& w4 `/ `6 X0 L# B) c) \
  72.         //while(!(I2C_SR1 & 0x04));        //等待发送结束- |/ m' \6 T8 h! }' ^  H
  73.         I2C_CR2 |= 0x02;                        //产生结束信号
    ) g: U. a% F/ m' @: c
  74. }
      B+ ~" W1 t0 X7 V, P7 X
  75.   E+ A  g: v+ y# j; Q
  76. /*******************************************************************************( h3 H! _! n7 h4 {0 e3 p
  77. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)- l1 P7 j. N+ L4 U& }7 t' b1 G# P
  78. 函数功能:        I2C发送一个字节
    * _( Y; C. M! b* j* T. a- M
  79. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
    5 d9 ^' ~4 d. }  [
  80. 输出参数:        null; `# r; \% o- b* I$ u
  81. 编写日期:        2018.09.06( H( B  Y. e" A5 L" _1 L
  82. 代码作者:        sinco.170
    / u, f/ e- Z- @" d. ~. @9 `
  83. *******************************************************************************/$ w0 T* w  n! r$ U5 X& b1 U/ B
  84. void IIC_SendByte(u8 addres,u8 addr,u8 dat)
    # L- F: e8 J  D" |% Y9 q: Z
  85. {+ g( L$ x& b  f+ C( K
  86.         u8 temp = 0x00;( f8 n, G3 s: C6 E; F6 t
  87.        
    5 R/ B1 d$ E# O  z$ l
  88.         IIC_Start(addres);                        //
    0 ]& S7 T& T6 @/ A- f3 P7 _. v2 p
  89.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成: {5 ?9 z4 H- r
  90.         temp = I2C_SR1;9 c+ R+ d: @, E4 l( _
  91.         temp + I2C_SR3;
    2 E, x9 J) _: ~+ [/ O+ i
  92.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
    6 K1 @) r* A+ ]# V# Q7 p6 Y- s  Y
  93.         I2C_DR = addr;                                //发送写入地址到数据寄存器  |( a' F6 S- {: _2 J! {
  94.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成+ O9 _2 n5 i. p# r+ x. |+ x
  95.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空6 j9 V) y$ d8 i
  96.         I2C_DR = dat;                                //发送数据
    0 |; \( d& q/ K2 h( o+ Y$ s; J
  97.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成
    9 N$ p0 l" @9 z  v; y9 X/ r
  98.         temp = I2C_SR1;                                //清除标志位
    + c/ S. G- F6 c7 N6 z! I' e
  99.         temp = I2C_SR3;/ U) @  t" T8 r/ b( ]2 h! B" t
  100.         IIC_Stop();& F3 A& u/ |- a/ ]0 x3 F  l
  101. }
    " B7 e* @3 r: e# I( \

  102. $ E) U3 V- Y  @4 j# D
  103. /*******************************************************************************
    % D% M# i# ?) a
  104. 函数名称:        u8 IIC_ReadByte(void)
    / a9 I6 S. i: W8 L4 K6 j$ l1 V
  105. 函数功能:        I2C读一个字节
    $ ~. Q/ c, Y0 e1 G$ _  F( }1 m
  106. 输入参数:        null
    " r* c, `6 y2 n) p! e& F! j5 H
  107. 输出参数:        返回已读到的数据/ H4 e" @. L3 K) y8 X9 w
  108. 编写日期:        2018.09.06
    7 x0 O8 \  A( O9 y' o' t/ ?
  109. 代码作者:        sinco.170, g+ b) `1 D' Y9 r
  110. *******************************************************************************/
    . `9 m7 y+ x% j& ]; I9 k! S
  111. u8 IIC_ReadByte(void)) b8 ~2 H4 f- m- P- c2 A6 v0 q
  112. {+ N$ p; W$ e, Q$ [/ P1 G: }) W
  113.         1 A" N4 h, J; k. ~
  114. }0 r# q$ V2 v0 f# K5 W. S' l
  115. ! w* Q% T1 p# ]# {$ Q7 t  E
  116. void IIC_SendNByte(u8 txd)  d3 T' f1 J: \' c# M- o
  117. {
    : n( w$ {) |) V& \* k. N1 f3 ~! {
  118.         9 X7 L, c- d( ?
  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
楼主好厉害啊! b8 B4 @, S' V! D
12下一页

所属标签

相似技术帖

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