发新帖本帖赏金 3.00元(功能说明)我要提问
12
返回列表
打印
[STM8]

【STM学习】STM8新手上路——第一天、GPIO

[复制链接]
楼主: sjw1716094642
手机看帖
扫描二维码
随时随地手机跟帖
21
sjw1716094642|  楼主 | 2015-7-24 18:09 | 只看该作者 回帖奖励 |倒序浏览
wang253098656 发表于 2015-7-24 15:43
楼主我是菜比,能不能把每句话的数值为什么这么设定写出来呢

谢谢提醒,我下次会注释的

使用特权

评论回复
22
sjw1716094642|  楼主 | 2015-7-24 18:09 | 只看该作者
mintspring 发表于 2015-7-24 12:24
楼主抱着试试看的态度,让我想起来县里电视台的医药广告,医托就是这么说的。 ...

:lol

使用特权

评论回复
23
sjw1716094642|  楼主 | 2015-7-24 18:11 | 只看该作者
ixc1227 发表于 2015-7-24 15:17
楼主帮我看看我的STM8S要怎么下载HEX 和在线调试。新手,要先学习连接,谢谢
https://bbs.21ic.com/forum.ph ...

你那个软件是给STM32下载程序的,你可以用STVP或直接用IAR

使用特权

评论回复
24
大秦正声| | 2015-7-24 18:30 | 只看该作者
看看

使用特权

评论回复
25
mintspring| | 2015-7-24 18:37 | 只看该作者
看楼主头像,楼主对机器人比较感兴趣吧。

使用特权

评论回复
26
sjw1716094642|  楼主 | 2015-7-24 18:50 | 只看该作者
mintspring 发表于 2015-7-24 18:37
看楼主头像,楼主对机器人比较感兴趣吧。

我觉得每个单片机爱好者都对他有兴趣的吧:lol

使用特权

评论回复
27
zh113214| | 2015-7-24 22:06 | 只看该作者
mintspring 发表于 2015-7-24 12:25
抱着试试看的态度,买了两盒,一吃还真有效, 又买了两个疗程,竟然好了。 ...

:curse::curse::curse::curse::curse::curse:

使用特权

评论回复
28
松哥无敌| | 2015-7-25 09:14 | 只看该作者
哈哈哈,第二天的呢?

使用特权

评论回复
29
zh113214| | 2015-7-26 14:51 | 只看该作者
stm8性价比还行。。

使用特权

评论回复
30
小浣熊| | 2015-7-26 18:51 | 只看该作者
讲的很详细啊,非常感谢楼主分享自己的经验。。。。

使用特权

评论回复
31
尤彼卡| | 2015-7-26 19:00 | 只看该作者
流水灯之类的学习IO口比较快

使用特权

评论回复
32
sjw1716094642|  楼主 | 2015-8-4 20:43 | 只看该作者

RE: 【STM学习】STM8新手上路——第一天、GPIO

STM8新手上路——第二天、SPI串口TFT

咳咳,也是为了队形说是第二天,其实学完好久了,当时因为没人回帖就没继续,现在回来啦!虽然从开始学到现在已经有两个多月了,但是我仅仅用了一遍STM8的外设,没有太多深入使用。所以,有什么不对的地方要请大家指正啦,小弟说错话还请见谅哦

步入正题!上回讲解了IAR的基本使用方法与IO口输出。

那么!。。。。我手头正好有一个SPI的串口TFT小液晶,那么我们不如赶紧拿IO模拟一下SPI吧~~~~~~

第一步,建立一个C工程(可以用空工程,个人习惯问题),然后将上次的程序全部复制进main.c  (其他的基本IAR设置参见第一天内容)



这里还要说个事情,就是芯片是时钟设置,因为使用内部高速时钟只用了一个寄存器,所以就不额外开贴了,稍微介绍一下带过。


    可以看到,16M的内部晶振直接输入到HSIDIV(内部高速时钟分频器),我们只需找到它,并作相应设置即可。
我们在这个寄存器中找到


  从复位值便可知道,上电默认是8分频,我们现在需要16M时钟,故0分频,将其设置为0即可:CLK->CKDIVR=0x00;

现在可以以这个频率做一个准一些的软件延时,毕竟延时对单片机很重要。(我用逻辑分析仪校准了,在Delay.c)
我们继续模拟SPI;
SPI时序我就不介绍了,网上资料很多,so我直接上代码啦
void Wdata(u8 data)                                     //写入数据
{
        SCE_0;                                                          //TFT片选
        DC_1;                                                           //数据写入
        if (data&(u8)0x80) Data_1;                           //为了让模拟SPI更快,这里没有用for循环
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x40) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x20) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x10) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x08) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x04) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x02) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        if (data&(u8)0x01) Data_1;
        else Data_0;
        CLK_0;
        CLK_1;
        SCE_1;

关于TFT,这个要配置的寄存器那真是太多了,这里只讲一个寄存器,有兴趣的可以自己去看看手册  ,寄存器地址为0X36,在手册122页


D7 D6 D5 三位只用于设置显示方向的,D4 设置液晶垂直刷新方向,D3用于颜色数据格式设置
我将其设置为0x36,用了第二种显示显示方向,有特殊需要的可以在初始化以及清行函数中更改(清行需要用另一种方向)。

#include <stm8s.h>
#include <Delay.h>
#include <TFT144.h>
u16 time=0;
int main( void )
{
   CLK->CKDIVR=0x00;   //内部高速时钟0分频
   TFT144_init();
   clear(0);//清屏,黑色
   adxy(60,40);
   Wstr("Success!",GREEN,0);
   ysm(3000);
   adxy(0,0);
   clear(0);//清屏,黑色
   while(1)
   {
       ysm(950);
       adxy(60,55);
       putnum(time++,BLUE,0);
   }

行,来看看运行效果吧




1.44Inc彩屏.zip (39.85 KB) ILI9163DS_V018_2008-08-15-14-13-43-798.zip (2.31 MB)

使用特权

评论回复
33
sjw1716094642|  楼主 | 2015-8-4 20:48 | 只看该作者
这次在上次的基础上,把模拟SPI改成用STM8的硬件SPI。
在上回的工程代码上稍作修改即可。

先创建一个空工程。


得到一个这样的工程


把上次工程的代码文件都拷至改工程下,右击工程名,添加文件 ,然后记得吧工程的一些必要配置都配置完,就可以准备改代码了。

写程序第一步:查看引脚位置,在数据手册中即可找到。
可以看到,SPI用到的引脚是PC5~7和PE5
STM8S的SPI引脚功能复用是不需要配置的,所以这里也省去了一个步骤。

第二步:查看STM8的SPI特性介绍


查看是否可以满足我们的使用要求,我这里只需要单片机给显示屏发送数据即可,速率没有硬性要求,越快越好。

第三步:查看资源配置介绍(略)

第四步:查看寄存器配置


帧格式  :     改显示屏用的是高位先发送,所以Bit7=0;
SPI使能:     这步在所有配置结束后再完成;
波特率控制:这里越快越好,所以Bit3~5=000;
主设备选择:是主机模式 所以Bit2=1;
时钟极性:   这里选择高电平状态。
时钟相位:   主模式不予考虑

最后得到:   SPI->CR1=0x06;

再看CR2

因为这里对TFT只有发送数据,所以这里将Bit6~7置1,单线双向模式,只发送,即可
CRC校验不使用,故其余位都置0即可;

SPI->CR2=0xc0;

再看SR


因为只用到了发送,所以只需关心Bit1就行,为1时发送区为空,可以写入

数据寄存器DR


由SR与DR寄存器,很容易就可以写出写数据函数
  • static void Wdata(u8 data)      //写入数据
  • {
  •   SCE_0;
  •   DC_1;
  •   SPI->DR=data;
  •   while(!(SPI->SR&0x2));
  • }
  • static void Wcom(u8 data)      //写入指令
  • {
  •   SCE_0;
  •   DC_0;
  •   SPI->DR=data;
  •   while(!(SPI->SR&0x2));
  • }

[color=rgb(51, 102, 153) !important]复制代码

SPI配置函数为
  • static void SPI_init(void)
  • {
  •   SPI->CR1=0x06;
  •   SPI->CR2=0xc0;
  •   SPI->CR1|=0x40;
  • }

[color=rgb(51, 102, 153) !important]复制代码

仅三句话,十分简易

最后通过刷屏测试,很明显可以看出硬件SPI比模拟的快很多,而且硬件还有一个好处是,字节发送过程不会被打断,数据传输的准确性更高。

谢谢阅读~


1.44Inc彩屏硬件SPI.zip (613.08 KB)

使用特权

评论回复
34
sjw1716094642|  楼主 | 2015-8-4 20:49 | 只看该作者
之前想每一个单独一个帖,现在准备连载了

使用特权

评论回复
35
lankeqiaosu| | 2015-8-5 16:37 | 只看该作者
跟楼主用一样的板

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则