打印

STM8S驱动求教!

[复制链接]
3410|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lxiao|  楼主 | 2013-8-29 00:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近一个小项目,需要用到个简单的小单片机,本来用的是STC11F04的,后来看到STM8S003F价格比较低,就直接的买了几个片子,做了块板子。本来以为会比较容易的(毕竟我也用过不少8位的片子,对STM32也比较熟,以为STM8S应该也比较容易)。谁知道现在调试驱动的时候很郁闷,先是IAR STM8与ST LINK和ST LINK V2将连不上,如图, 在网上查了半天也没找到解决办法。不得已直好装了STVD和COMMIC,一开始可以用STVP下载,可是仍然进不了仿真界面,后来把DEVICES改成STM8S103K,终于可以仿真了。然后程序运行的结果却不对,GPIOB口电平始终不变, ,单片发寄存器的值也已修改成功,或是用万用表去测B口,却没有任何变化,但是C口和D口却可以正常操作。求熟悉STM8S的大侠们指点,谢谢!
沙发
Lxiao|  楼主 | 2013-8-29 00:53 | 只看该作者
贴段代码:
#include "STM8S103F.h"

#define uchar        unsigned char
#define uint         unsigned int
#define ulong        unsigned long int

#define OpenSW1()        PB_ODR = PB_ODR | 0x010
#define CloseSW1()        PB_ODR = PB_ODR & 0xef
#define OpenSW2()        PC_ODR = PC_ODR | 0x08
#define CloseSW2()        PC_ODR = PC_ODR & 0xF7
#define OpenSW3()        PC_ODR = PC_ODR | 0x10
#define CloseSW3()        PC_ODR = PC_ODR & 0x7F
#define OpenSW4()        PC_ODR = PC_ODR | 0x20       
#define CloseSW4()        PC_ODR = PC_ODR & 0xDF

#define OpenPUMP() PB_ODR = PB_ODR | 0x20
#define ClosePUMP()         PB_ODR = PB_ODR & 0xDF


void IO_Init(void)
{
    PB_DDR |= 0X30;
    PB_CR1 |= 0X30;
    PB_ODR |= 0x30;

    PC_DDR = 0X38;
    PC_CR1 = 0X38;
    PC_ODR = 0x38;

    PD_DDR = 0X00;
    PD_CR1 = 0XFF;  
               
    CloseSW1();
    CloseSW2();
    CloseSW3();
    CloseSW4();
    ClosePUMP();               
}

void CLK_Init(void)
{
    CLK_ICKR = 0X01;//HSI使能
    CLK_SWR = 0XE1;
    CLK_CKDIVR = 0X18;//2MHZ
}


void main(void)
{
    CLK_Init();
   DelayNus(5000);
    IO_Init();
   Data_Init();
    TIM4_Init();
    _asm("rim");              /* Enable interrupts. */
    while(1)
    {
        SystemLogic();       
    }
}

使用特权

评论回复
板凳
feilusia| | 2013-8-29 08:42 | 只看该作者
我以前刚玩STM8的时候,把ST-LINK的SWIM口接反了,也出现LZ的提示,结果调试了我两天才发现这个错误。

使用特权

评论回复
地板
Lxiao|  楼主 | 2013-8-29 10:10 | 只看该作者
接反是肯定不会的,我STLINK插在板子上,用IAR就是这样,用STVD就可以!

使用特权

评论回复
5
机电先锋| | 2013-8-29 11:07 | 只看该作者
本帖最后由 机电先锋 于 2013-8-29 21:57 编辑

         STLINK V2    真是的     鱼龙混杂

使用特权

评论回复
6
Xflyan| | 2013-8-29 15:02 | 只看该作者
因为ST-LINK 和 ST-LINK V2的驱动是不一样的,所以新版的IAR只支持V2...

使用特权

评论回复
7
Lxiao|  楼主 | 2013-8-29 20:51 | 只看该作者
我现在ST-LINK 和 ST-LINK V2都试了,在IAR下都连接不上

使用特权

评论回复
8
Lxiao|  楼主 | 2013-8-29 23:47 | 只看该作者
现在我对STM8S003F3的IO口进行操作,发现C口和D口都正确,可是B口设为输出时,IO电平却没有任何变化!

使用特权

评论回复
9
Lxiao|  楼主 | 2013-8-29 23:55 | 只看该作者
#define OpenSW1()                PB_ODR |= (1 << 4)
#define CloseSW1()        PB_ODR &= ~(1 << 4)
#define OpenSW2()                PC_ODR |= (1 << 3)
#define CloseSW2()        PC_ODR &= ~(1 << 3)
#define OpenSW3()                PC_ODR |= (1 << 4)
#define CloseSW3()        PC_ODR &= ~(1 << 4)
#define OpenSW4()                PC_ODR |= (1 << 5)
#define CloseSW4()        PC_ODR &= ~(1 << 5)

#define OpenPUMP()        PB_ODR |= (1 << 5)
#define ClosePUMP()        PB_ODR &= ~(1 << 5)
void IO_Init(void)
{
    PB_DDR = 0Xff;
    PB_CR1 = 0Xff;
   PB_CR2 = 0XFF;
    PB_ODR = 0x00;

    PC_DDR = 0XF8;
    PC_CR1 = 0XF8;
    PC_ODR = 0x00;

    PD_DDR = 0X00;
    PD_CR1 = 0XFF;  
    OpenSW1();
    OpenSW2();
    OpenSW3();
OpenSW4();
OpenPUMP();
CloseSW1();
CloseSW2();
CloseSW3();
CloseSW4();
ClosePUMP();
}

单步,观看Peripheral registers可以看到B口寄存值也正确,可是用表测IO电平却无变化!其它口IO
却正确!




使用特权

评论回复
10
Lxiao|  楼主 | 2013-9-6 00:08 | 只看该作者
唉,看来想在这里找答案还是不靠近谱,这几天忙别的项目去了,今天忽然想到是不是OD的问题,可是STM8S微控制器参考手册上明明写了:当PX_DDR设为1时,相应脚置为输出模式,PX_CR1设为1则为推挽输出,此时摆率由PX_CR2来控制。据此,我已将B口设为输出推挽,可是为什么仿真观测寄存值已改变为我要的,实际输出却一直为低呢。我试着在B跳线接上拉电阻,结果就好了。看来是OD的问题。手册上竟然没说清楚。

使用特权

评论回复
11
sabaka| | 2013-9-28 00:09 | 只看该作者
103f的那两个PB好像是需要外部上拉的。

使用特权

评论回复
12
戈卫东| | 2013-9-28 07:19 | 只看该作者
SCL/SDA是完全的OD口,不管使用什么配置都没有上拉元件. 需要使用外部的上拉.

使用特权

评论回复
13
Lxiao|  楼主 | 2013-9-30 16:59 | 只看该作者
可是我已经设成推挽输出了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:做人要厚道!

5

主题

70

帖子

0

粉丝