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

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

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
本帖最后由 sincomaster 于 2018-8-3 18:03 编辑

近段时间才学完C语言,现在开始学习单片机.
在这贴子分享学习过程和遇见的问题,有什么不对的地方还请多指教.
开发板:STM8S DEV BOARD(自己做的)
主控:STM8S207CBT6
显示:OLED(SSD1306),支持IIC和SPI两种接口
按键:TTP223-TOUCH KEY+3X4矩阵按键(原理图设计有误,使1.5.9键值相同)
接口:含24L01无线接口,红外接口,18B20接口
电源:UCB5V供电,支持输出5V和3.3V
指示:GPIOB外接8个LED灯
语音:板上有语音电路
音频:喇叭和蜂鸣器
晶振:HSE(16MHz)
时钟:HYM8563
存储:AT24C64D
字库:GT20L16S1Y
收藏 评论15 发布时间:2018-8-3 17:54

举报

15个回答
sincomaster 回答时间:2018-8-3 17:56:33
本帖最后由 sincomaster 于 2018-8-3 17:57 编辑

这是自已做的开发板:

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 编辑

STM8S的延时程序用示波器测试了一下,和自已算出来的有误差,今天测试和前两的时间有一点点差,不知是不是我切换到外部时钟的原因,数据手册上说的1/2周期指令不清楚是算多少,我是按1周期指令来算的,
网上也有说16M时钟算出来有差,但8M时钟不会差,我没去试
还有就是5us延时是,IO推挽输出波形较好,用开漏PE1输出上升沿很慢,不清楚是否正常,PE1外部上拉4.7K.

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
这是自已做的开发板:

板很漂亮
sincomaster 回答时间:2018-8-12 23:55:47
本帖最后由 sincomaster 于 2018-8-12 23:58 编辑

经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要给我到时传上来,
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 编辑
sincomaster 发表于 2018-8-12 23:55
经地几天的努力,IIC驱动SSD1306 OLED终于成协,开心中........中间有很多问题,都 一个一个解决,如果有人需要 ...

楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?

另外你遇到的问题能不能传上来,我学习借鉴一下,先谢谢了
sincomaster 回答时间:2018-8-17 17:13:17
iyumi 发表于 2018-8-16 17:25
楼主,请教个问题,STLINK V2使用的时候你的开发板单独供电了吗,不单独供电有什么影响呢?

另外你遇到的 ...

我自己有两个ST_LINK,1个是正版,另一个是30几块钱的,两个我都拆开过,ST_LINK内没有给SWIM这4根线供电,所以开发板要有电才行,我是自学,所以学习中有很多问题,自己慢慢解决,我用硬件IIC,刚调试也碰到网上说的停在while(!(I2C_SR1 & 0x02));这句就不动了,一时半会也说不清楚,我现在也还没解决调用字符数组的问题,
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************
  2. 文件名称:        I2C文件
  3. 函数功能:        I2C Driver Code
  4. 软件平台:        STVD4.3.12
  5. 编写日期:        2018.09.06
  6. 代码作者:        sinco.170
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)
  8. *******************************************************************************/
  9. #include "stm8s.h"
  10. #include "iostm8s.h"
  11. #include "iic.h"

  12. //http://bbs.mydigit.cn/read.php?tid=2482933
  13. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/
  14. //http://www.openedv.com/thread-70958-1-1.html
  15. //http://blog.csdn.net/DevinTT/article/details/74854851
  16. /*******************************************************************************
  17. 函数名称:        void IIC_Init(void)
  18. 函数功能:        I2C初始化
  19. 输入参数:        null
  20. 输出参数:        null
  21. 编写日期:        2018.09.06
  22. 代码作者:        sinco.170
  23. *******************************************************************************/
  24. void IIC_Init(void)
  25. {       
  26.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
  27.        
  28.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入
  29.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的
  30.         PE_CR2                 &= 0xf9;                       
  31.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟
  32.         I2C_FREQR   |= 0x10;                //时钟为16MHz
  33.         //I2C_FREQR   |= 0x01;                //时钟为1MHz
  34.         I2C_OARH          = 0x40;                //7位地址模式
  35.         I2C_OARL     = 0xa0;
  36.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns
  37.         I2C_CCRH    |= 0x00;                //I2C为标准模式
  38.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
  39.         //I2C_TRISER   = 0x02;                //时钟为1MHz时
  40.         //I2C_ITR          |= 0x00;                //禁止I2C中断
  41.         //I2C_CR2     |= 0x04;                //开启应?
  42.         I2C_CR1     |= 0x01;
  43. }

  44. /*******************************************************************************
  45. 函数名称:        void IIC_Start(u8 addres)
  46. 函数功能:        I2C start function
  47. 输入参数:        null
  48. 输出参数:        Device Address
  49. 编写日期:        2018.09.06
  50. 代码作者:        sinco.170
  51. *******************************************************************************/
  52. void IIC_Start(u8 addres)
  53. {
  54.         while(I2C_SR3 & 0x02);                //检查总线是否空闲
  55.         I2C_CR2 |= 0x01;                        //产生起始信号
  56.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成
  57.         I2C_DR = addres;                        //发送从器件地址
  58. }

  59. /*******************************************************************************
  60. 函数名称:        void IIC_Stop(void)
  61. 函数功能:        I2C stop function
  62. 输入参数:        null
  63. 输出参数:        null
  64. 编写日期:        2018.09.06
  65. 代码作者:        sinco.170
  66. *******************************************************************************/
  67. void IIC_Stop(void)
  68. {
  69.         //while(!(I2C_SR1 & 0x04));        //等待发送结束
  70.         I2C_CR2 |= 0x02;                        //产生结束信号
  71. }

  72. /*******************************************************************************
  73. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)
  74. 函数功能:        I2C发送一个字节
  75. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
  76. 输出参数:        null
  77. 编写日期:        2018.09.06
  78. 代码作者:        sinco.170
  79. *******************************************************************************/
  80. void IIC_SendByte(u8 addres,u8 addr,u8 dat)
  81. {
  82.         u8 temp = 0x00;
  83.        
  84.         IIC_Start(addres);                        //
  85.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成
  86.         temp = I2C_SR1;
  87.         temp + I2C_SR3;
  88.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
  89.         I2C_DR = addr;                                //发送写入地址到数据寄存器
  90.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成
  91.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
  92.         I2C_DR = dat;                                //发送数据
  93.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成
  94.         temp = I2C_SR1;                                //清除标志位
  95.         temp = I2C_SR3;
  96.         IIC_Stop();
  97. }

  98. /*******************************************************************************
  99. 函数名称:        u8 IIC_ReadByte(void)
  100. 函数功能:        I2C读一个字节
  101. 输入参数:        null
  102. 输出参数:        返回已读到的数据
  103. 编写日期:        2018.09.06
  104. 代码作者:        sinco.170
  105. *******************************************************************************/
  106. u8 IIC_ReadByte(void)
  107. {
  108.        
  109. }

  110. void IIC_SendNByte(u8 txd)
  111. {
  112.        
  113. }
复制代码
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
楼主好厉害啊
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版