个人项目:STM8S103 -> arduino
novakon2013/06/29电子技术 IP:广东
STM8S103几乎是系列最低端,最便宜的片子S103F3P6只要1.7元(S003系列同样封装同样针脚定义只要1.3元,不过限制稍多)。

实际上可以干很多事情,有3个TIMER(定时和PWM不愁),有休眠和看门狗功能,有硬件的UART I2C SPI,其中UART还有非常多的工作模式(比如IC卡读取,虽然没什么用)

由于缺少可靠的开源编译器,不能像Arduino那样普及。实际上STM8S103F3P6方案,整个板子(按照打样价格来算)成本不超过10元的。
目前唯一能用的就是IAR 和Cosmic Raisonance三家的编译器。

开发上面,官方编写了很细致的C固件库,所有操作都可以通过固件库来完成,用户不需要编写程序操作寄存器。

但是为了让它更易用,我尝试着编写了stmduino.h,希望将大部分的常用操作都arduino化,节省开发时间,缩短开发周期。

发一张图,这是目前的进度:

QQ截图20130629142705.jpg
+100  科创币    game00over    2013/06/30 支持!!
来自:电子信息 / 电子技术
11
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
11年0个月前 IP:未同步
541601
上面展示的,包括在片子自带的eeprom 0字节处读取/写入一个16位的整数。只需要用eeuint(0)就可以代表这个数,不需要复杂的指针操作等等。

每次上电,debug输出的数字就会加上1或者2,代表上电次数。

timer4是一个8位定时器,用标准固件库提供的初始化函数和设置函数很麻烦,这里直接用timer4(1ms)就能够让timer4开始计时,且每个毫秒中断一次。再用timer4()就可以知道timer4总共中断的次数,这样也就知道程序从开始到现在运行了多长时间。用一个模运算实现的状态机控制led的亮灭,即是每500毫秒,有250毫秒点亮led,250毫秒熄灭。

附上目前进度:

//stmduino.h

#include <stm8s.h>
#include <stm8s_tim1.h>
#include <stm8s_tim4.h>
#include <stm8s_clk.h>
#include <stm8s_gpio.h>
#include <stm8s_itc.h>
#include <stm8s_i2c.h>
#include <stm8s_exti.h>
//#include <stm8s_uart2.h>
#include <stm8s_uart1.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#ifndef _STMDUINO_H__
#define _STMDUINO_H__

#define interrupts(state) INTERRUPTSTATE_##state
#define INTERRUPTSTATE_ enableInterrupts()
#define INTERRUPTSTATE_OFF disableInterrupts()
#define INTERRUPTSTATE_ON INTERRUPTSTATE_

#define PINBIT(x) ((GPIO_Pin_TypeDef)(1<<x))

#define HIGH (!LOW)
#define LOW 0

#define PORTOF_A1 GPIOA
#define PINOF_A1 PINBIT(1)
#define PORTOF_A2 GPIOA
#define PINOF_A2 PINBIT(2)

#define PORTOF_A3 GPIOA
#define PINOF_A3 PINBIT(3)
#define PORTOF_B4 GPIOB
#define PINOF_B4 PINBIT(4)
#define PORTOF_B5 GPIOB
#define PINOF_B5 PINBIT(5)

#define PORTOF_C3 GPIOC
#define PINOF_C3 PINBIT(3)
#define PORTOF_C4 GPIOC
#define PINOF_C4 PINBIT(4)
#define PORTOF_C5 GPIOC
#define PINOF_C5 PINBIT(5)
#define PORTOF_C6 GPIOC
#define PINOF_C6 PINBIT(6)
#define PORTOF_C7 GPIOC
#define PINOF_C7 PINBIT(7)

#define PORTOF_D3 GPIOD
#define PINOF_D3 PINBIT(3)
#define PORTOF_D4 GPIOD
#define PINOF_D4 PINBIT(4)
#define PORTOF_D5 GPIOD
#define PINOF_D5 PINBIT(5)
#define PORTOF_D6 GPIOD
#define PINOF_D6 PINBIT(6)
#define PORTOF_D1 GPIOD
#define PINOF_D1 PINBIT(1)
#define PORTOF_D2 GPIOD
#define PINOF_D2 PINBIT(2)

#define MODEOF_OUTPUTSHARP GPIO_MODE_OUT_PP_LOW_FAST
#define MODEOF_OUTPUT GPIO_MODE_OUT_PP_LOW_SLOW
#define MODEOF_INPUT GPIO_MODE_IN_PU_NO_IT
#define MODEOF_INPUTFL GPIO_MODE_IN_PU_NO_IT

#define pinMode(pin_to_set,mode_to_set) GPIO_Init(PORTOF_##pin_to_set,PINOF_##pin_to_set,MODEOF_##mode_to_set)
#define digitalWrite(pin_to_write,value_to_write) ((value_to_write==0)?GPIO_WriteLow(PORTOF_##pin_to_write,PINOF_##pin_to_write):GPIO_WriteHigh(PORTOF_##pin_to_write,PINOF_##pin_to_write))
#define digitalRead(pin_to_read) GPIO_ReadInputPin(PORTOF_##pin_to_read,PINOF_##pin_to_read))
#define pinHigh(pin_to_set) GPIO_WriteHigh(PORTOF_##pin_to_write,PINOF_##pin_to_write)
#define pinLow(pin_to_set) GPIO_WriteLow(PORTOF_##pin_to_write,PINOF_##pin_to_write)
#define pinFlip(pin_to_set) GPIO_WriteReverse(PORTOF_##pin_to_write,PINOF_##pin_to_write)

#define clock(cmd) CLOCK_##cmd
#define CLOCK_16M CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1)
#define CLOCK_8M CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2)
#define CLOCK_4M CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4)
#define CLOCK_2M CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8)
#define CLOCK_1M {CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);}

#define cpudivider(divider) CPUDIVIDER_##divider
#define CPUDIVIDER_1 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1)
#define CPUDIVIDER_2 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2)
#define CPUDIVIDER_4 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4)  //pwr saving if clock cpu down.
#define CPUDIVIDER_8 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8)
#define CPUDIVIDER_16 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16)
#define CPUDIVIDER_32 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32)
#define CPUDIVIDER_64 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64)
#define CPUDIVIDER_128 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128)


#define flash(cmd) FLASH_##cmd
#define FLASH_EEPROM FLASH_Unlock(FLASH_MEMTYPE_DATA)
#define eeprom(offset) (offset+0x4000)
#define eewriteuint(value,offset) (eeint(offset)=value)
#define eereaduint(offset) eeint(offset)
#define eeuint(offset) (*(unsigned int*)(eeprom(offset)))
unsigned long timer4_ticks=0;
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
  //should timer4 tick every 1ms.
  timer4_ticks+=1;
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);//always clear pending bit!!!
}

#define TIMER4_SET_1ms timer4clock(64,250)
#define TIMER4_SET_100us timer4clock(16,100)
#define TIMER4_STATE_COUNT TIM4_Cmd(ENABLE)
#define TIMER4_STATE_STOP TIM4_Cmd(DISABLE)
#define TIMER4_STATE_TICK TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE)
#define TIMER4_STATE_NOTICK TIM4_ITConfig(TIM4_IT_UPDATE,DISABLE)
#define TIMER4_STATE_ (timer4_ticks) //32bit counter

#define timer4tick(interval) TIMER4_SET_##interval
#define timer4clock(prescaler,counter) {TIM4_TimeBaseInit(TIM4_PRESCALER_##prescaler,counter);timer4(COUNT);timer4(TICK);}
#define timer4(state) TIMER4_STATE_##state

void assert_failed(u8* file, u32 line){while(1){}}

#endif
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
mobius
11年0个月前 IP:未同步
541615
LZ真是速度啊!!!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
11年0个月前 IP:未同步
541631
LZ用STM32吧.库都帮你编好了.arduino优点在于不用会C也能上手.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
11年0个月前 IP:未同步
541633
LZ还可以考虑用SDCC编译.SDCC是开源的哦.
XXXXXXXXXXXXXXXXXXXXXt/projects/sdccstm/
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
11年0个月前 IP:未同步
541634
回 3楼(.........) 的帖子
价钱问题,1.7变成10.7,用户可受不了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
11年0个月前 IP:未同步
541635
回 5楼(warmonkey) 的帖子
要真是要做产品当我没说,要是娱乐下1.7和10.7的区别不大.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
世纪伯乐
11年0个月前 IP:未同步
541659
[s:333]人才啊,学习一下~~~
最近在学arm~~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
世纪伯乐
11年0个月前 IP:未同步
541684
[s:275]刚才没细看,细看发现预处理还没做完么……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年0个月前 IP:未同步
541759
回 6楼(.........) 的帖子
区别还是有的,毕竟用同样的价钱可以买更多的开发板。速度上一个是16M,一个是72M,一般电子制作不需要这么高的速度。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年0个月前 IP:未同步
541762
回 4楼(.........) 的帖子
啊,这里也要吐个槽。
SDCC for ST7 STM8这个俺一早就折腾过了,麻烦之处就在于这个版本是某人用SDCC改出来的(非官方,只是port到了STM8),不仅功能上有一些这个那个的问题,而且现在停止更新了。和avrgcc比,还是差的远了点

官方的SDCC,直到最近才把STM8放进计划,目前binary里面还没有forSTM8成品(但是有项目文件,估计还要等半年
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8385
学术分
16
2008/03/29注册,2年4个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}