打印
[STM8]

一天天学用STM8

[复制链接]
34019|128
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dadodo|  楼主 | 2010-7-28 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一天,搞定了IAR + STLINK的download an debug

很郁闷的是买到手的STM三合一开发板上的STLINK居然不能连机,为此走了很多弯路。
折腾半天,直到IAR和STVP都不能连机STLINK时才怀疑这板上的STLINK有问题。
最后好在用STLINK upgrade升级后,一切正常。
IAR下写个最简代码:
void main(void)
{
  while(1);
}
编译,下载到芯片,调试运行,终于OK了。
这里还有个小插曲,三合一板上的芯片是STM8S207SB,IAR下载时STLINK居然说不支持该型号,只能改成STM8S207S8来用了。而STVP下可以对207SB编程。搞不懂什么原因。
沙发
stm8s103| | 2010-7-28 13:56 | 只看该作者
STLINK upgrade哪有下载?

使用特权

评论回复
板凳
dadodo|  楼主 | 2010-7-28 14:03 | 只看该作者
STLINK upgrade在安装完sttoolset就有了,就是那个STVD

使用特权

评论回复
地板
香水城| | 2010-7-28 14:10 | 只看该作者
ST网站也有啊:在http://www.st.com/mcu/familiesdocs-110.html搜索ST-Link firmware upgrade。

使用特权

评论回复
5
dadodo|  楼主 | 2010-7-28 14:37 | 只看该作者
  第二天,从最基本的IO操作开始学习。在STM上IO绝大多数是GPIO。

刚开始学习,测试程序不要搞复杂,越简单越不容易出错。下面是代码,没有使用STM8官方固件库。

#include <iostm8s207sb.h>

#define LED1_FLASH  PD_ODR_ODR3 =  !PD_ODR_ODR3  // 开发板上的LED1接在PD3上

void delay(unsigned int count)
{
  while(count--);
}

void GPIO_init(void)
{
  PD_DDR = 0x08;  // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0x08;  // 设置PD3为推挽输出
}

void init_devices(void)
{
  GPIO_init();
}

void main( void )
{
  init_devices();
  while(1)
  {
    delay(50000);
    LED1_FLASH;
  }
}
编译,下载,运行,LED1开始闪了,哈哈

使用特权

评论回复
6
ybing| | 2010-7-28 20:37 | 只看该作者
每天跟进

使用特权

评论回复
7
xsgy123| | 2010-7-28 23:19 | 只看该作者
楼主是在写学习笔记吗

使用特权

评论回复
8
xsgy123| | 2010-7-28 23:20 | 只看该作者
写的不错,希望能多些一点

使用特权

评论回复
9
dadodo|  楼主 | 2010-7-29 02:38 | 只看该作者
俺不会写啥,典型的木讷工程师一个,只会埋头苦干。
实际上今天一天(白天+晚上)已经把STM8的GPIO操作、修改系统时钟、TIM1定时中断、TIM2的PWM、UART的中断收发、EXTI外部中断、ADC通通都搞了一遍,没有用ST官方固件库和例程,全部对照STM8手册自己写的代码。细节上也遇到了一些问题,借助STLINK最终逐一解决了。

使用特权

评论回复
10
huangqi412| | 2010-7-29 07:32 | 只看该作者
MARK,LZ继续更新。

使用特权

评论回复
11
lpcfans| | 2010-7-30 09:01 | 只看该作者
顶。辛苦。

使用特权

评论回复
12
dadodo|  楼主 | 2010-7-30 12:45 | 只看该作者
昨天忙了一下午,终于把一个AVR上的程序移植到STM8上,编译通过。原bin文件6K多,重新编译后3.5K。
很满意,庆祝一下:lol

使用特权

评论回复
13
dadodo|  楼主 | 2010-7-30 12:56 | 只看该作者
  STM8上电运行时默认使用内部16M的RC振荡器经8分频后的2M时钟频率作为系统时钟。程序开始运行后可以通过设置相关寄存器来修改主时钟源,可以选择外部晶振作为主时钟源和CPU时钟分频。那么这里就选择比较简单的操作,修改内部RC时钟预分频器获得8M系统时钟。

增加内部RC时钟预分频后的代码如下:

#include <iostm8s207sb.h>

#define LED1_FLASH  PD_ODR_ODR3 =  !PD_ODR_ODR3  // 开发板上的LED1接在PD3上

void delay(unsigned int count)
{
  while(count--);
}

void CLK_init(void)
{
  CLK_CKDIVR = 0x08;         // 16M内部RC经2分频后系统时钟为8M
}

void GPIO_init(void)
{
  PD_DDR = 0x08;  // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0x08;  // 设置PD3为推挽输出
}

void init_devices(void)
{
  CLK_init();
  GPIO_init();
}

void main( void )
{
  init_devices();
  while(1)
  {
    delay(50000);
    LED1_FLASH;
  }
}
编译后运行一下看看,LED1是不是闪得更快了

使用特权

评论回复
14
dadodo|  楼主 | 2010-7-30 13:03 | 只看该作者
STM8的TIM1是16位高级控制定时器,作为新手不要急着玩高级功能,先从简单的定时溢出中断开始。那么这个简单的目标就定为LED1亮500ms,灭500ms,循环往复,如此而已。

#include <iostm8s207sb.h>

#define LED1_FLASH  PD_ODR_ODR3 =  !PD_ODR_ODR3  // 开发板上的LED1接在PD3上

void CLK_init(void)
{
  CLK_CKDIVR = 0x08;         // 16M内部RC经2分频后系统时钟为8M
}

void GPIO_init(void)
{
  PD_DDR = 0x08;  // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0x08;  // 设置PD3为推挽输出
}

void TIM1_init(void)
{
  TIM1_PSCRH = 0x1F;  // 8M系统时钟经预分频f=fck/(PSCR+1)
  TIM1_PSCRL = 0x3F;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
  TIM1_ARRH = 0x01;  // 自动重载寄存器ARR=0x01F4=500
  TIM1_ARRL = 0xF4;  // 每记数500次产生一次中断,即500ms
  TIM1_IER = 0x01;    // 允许更新中断
  TIM1_CR1 = 0x01;  // 计数器使能,开始计数
}

#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
  LED1_FLASH;
  TIM1_SR1 = 0;  // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}

void init_devices(void)
{
  asm("sim");  // 关全局中断
  CLK_init();
  GPIO_init();
  TIM1_init();
  asm("rim");  // 开全局中断
}

void main( void )
{
  init_devices();

// 主循环里没有程序需要执行
  while(1);
}

好了,同样编译、下载、运行,看结果吧。

使用特权

评论回复
15
baidudz| | 2010-7-30 13:05 | 只看该作者
这应该属于学习心得吧

使用特权

评论回复
16
jinkeqi| | 2010-8-1 10:50 | 只看该作者
楼主辛苦了。

使用特权

评论回复
17
airwill| | 2010-8-2 13:40 | 只看该作者
这么快就把个 STM8 搞熟套了啦, 楼主真牛! 两天没有更新了, 每兴趣了?

使用特权

评论回复
18
dadodo|  楼主 | 2010-8-3 01:51 | 只看该作者
花了两天时间自编了一个bootloader,懒的记笔记了,呵呵

使用特权

评论回复
19
无冕之王| | 2010-8-8 08:54 | 只看该作者
楼主还挺谦虚的,写的不错嘛

使用特权

评论回复
20
火箭球迷| | 2010-8-8 09:36 | 只看该作者
楼主挺有耐心的,值得学习

使用特权

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

本版积分规则

29

主题

1286

帖子

5

粉丝