标题:
STM8S系列单片机开发环境应用快速入门
[打印本页]
作者:
51黑fan
时间:
2016-1-29 23:24
标题:
STM8S系列单片机开发环境应用快速入门
本帖最后由 51黑fan 于 2016-1-29 23:39 编辑
最近ST在国内大力推广他的8位高性价比单片机STM8S系列,感觉性能上还是非常不错的,网上稍微看了点资料,打算有机会还是学习一下,先入门为以后做好技术积累。好了,长话短说。手上拿到一套ST最近做活动赠送的三合一学习套件,上面包括STM32F小板、ST LINK小板、STM8S小板,做工很精致,相信很多朋友也收到了。既然当初去申请了,人家也送了,总得把用起来吧,放着吃灰尘是很可惜的^_^ 。
好,步入正题,刚开始在论坛上逛了一圈,感觉STM8S的资料实在太少,都是官方的应用资料,没有什么入门介绍,连需要安装什么软件都搞不清楚。偶的电脑光驱坏了,所以也读不出光盘里有什么东西,所以只能到处瞎摸,还是ourdev论坛好,嘿嘿,仔细看了几个帖子,总算明白大概是什么样的开发环境了。用C语言开发STM8S,需要安装两个软件:1、STVD IDE开发环境;2、COSMIC for STM8 C编译器。
STVD可以到官网下载,下载地址:
http://www.51hei.com/bbs/dpj-43003-1.html
COSMIC 需要申请LICENSE,比较繁琐,刚好坛子有人传了一个免安装无限制版本的,偶就赶紧下载了,大家可以去下载,仅做为个人学习使用。
下载地址:
http://www.51hei.com/bbs/dpj-43001-1.html
软件下载后,只需安装STVD。从上面地址下载的COSMIC不用安装,只要解压到硬盘即可。后面建立工程的时候设置好路径即可。
下面一步一步开始啦~
一、安装好STVD后,桌面上建立了两个快捷图标,ST Visual Develop就是STVD了。ST Visual Programmer是编程软件,可以配合ST LINK对STM8S进行编程烧录。
二、双击运行ST Visual Develop,启动STVD开发环境。执行 File \ New Workspace,在New Workspace窗口里选择Create workspace and projects,点击“确定”建立工作组和工程
三、在Workspace filename里输入Workspace名称,由于最终我们要测试一个现成的LED程序,所以偶写了led,随你喜欢了,呵呵。在Workspace里设置好文件当前要存放的路径。然后点“OK”确定。
四、在Project filename里输入工程的名称,在Project location里设置好工程的存放路径。因为我们是要用C语言来开发的,所以在Toolchain里要选择 STM8 Cosmic 编译器;在Toolchain root里就要填写你刚才下载解压后的那个无限制的Cosmic的存放路径就可以了。都填好后,点“OK”。
怕大家搞不清楚上面的那个Toolchain root的存放路径,特截图一张。我是放在那里的,你看你放哪里就填哪里的路径。
五、在MCU Selection里,需要选择实际的MCU型号了,ST送的套件板上的芯片型号是STM8S207SBT6C,而下列的型号中却是STM8S207S8,没对上号,不知道是不是STVD弄错了。反正偶选下面的STM8S207S8是可以用的,先用着咯,呵呵。双击型号后,点“OK”。
六、下面工程就建立好了,呵呵,自动生成main.c 、stm8_interrupt_vector.c 、mods0.h。试试compile、build,一切顺利,因为现在main.c只有一个主程序,所以还是可以编译通过的,没有什么错误提示,如下下图:
好了,以上就是使用STVD建立工程的详细步骤了。
由于上面的main.c没什么实质的程序运行,所以下面我们要运行一个ADC电压采集,并把采集值赋给定时器,实现定时器PWM的变化输出,驱动LED亮度发生变化的程序,这个程序我是从一个论坛上下载的,应该也是这个套件板的光盘里的内容。
我先把这个程序工程里的3个文件(main.c 、 tm8_interrupt_vector.c 、 STM8S207R.h)传上来,其实这个工程也是可以直接运行的,但为了让我们上面辛苦建立的工程发挥下作用,所以还是继续沿用上面的工程,然后把我上传的3个文件名里的main.c 、 tm8_interrupt_vector.c 里的内容复制到我们刚才建立好的工程对应的文件里;并把STM8S207R.h这个文件复制到我们工程目录下,并添加到工程里,这个头文件是必须的。
大家先下载这3个文件:
led.rar
(5.84 KB, 下载次数: 36)
2016-1-29 23:23 上传
点击文件名下载附件
下载积分: 黑币 -5
/*============================================================================*/
/* PROJECT: LED Control by timer OC */
/* MODULE: main.c */
/* COMPILER: STM8 Cosmic C Compiler */
/* DATE: Feb 2009 */
/*----------------------------------------------------------------------------*/
/* DESCRIPTION: Demonstration firmware for STM8 Mini Kit */
/* Control LED blink, on/off/, brightness. */
/*============================================================================*/
/******************************************************************************
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2008 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm8s207r.h" /* Registers and memory mapping file. */
/******************************************************************************/
/* Macro definitions
/******************************************************************************/
/******************************************************************************/
/* RAM SEGMENT variables */
/******************************************************************************/
/* Global variable used to store the ADC result. */
unsigned int AD_Value;
/******************************************************************************/
/* Function definitions */
/******************************************************************************/
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: LED_Control */
/* INPUT/OUTPUT: Note duration (4bit MSB information) / None. */
/* DESCRIPTION: 1) Sample AIN voltage and store in AD_Value. */
/* 2) Polling wait routine for note duration(based on 3ms delay).*/
/* duration: Quaver (2), crotchet (4) or minim (8) selection. */
/* ---------------------------------------------------------------------------*/
void LED_Control(unsigned char duration)
{
int i = 0;
unsigned char uc = 0;
unsigned long Temp;
/* Sample AIN voltage in ADC single mode */
ADC_CR1 |= 0x01; /* First set ADON to power on the ADC module. */
i = 6; /* Wait >7us to ensure the ADC power on finished.*/
while(i--);
ADC_CR1 |= 0x01; /* Set ADON again to start AD convert. */
while(!(ADC_CSR & 0x80));/* Waiting for AD convert finished (EOP=1). */
/* Store ADC value to AD_Value */
AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL);
/* The new duty cycle value is written in CCR. */
TIM2_CCR2H=0x00;
TIM2_CCR2L=(unsigned char)(AD_Value>>2);
if (AD_Value>0x10)
{
Temp=(unsigned char)(AD_Value>>8);
if ((TIM3_ARRH>Temp+0x05)||(TIM3_ARRH<Temp-0x05))
{
TIM3_ARRH = Temp;
TIM3_ARRL = (unsigned char)(AD_Value&0xff);
TIM3_CCR1H = (unsigned char)(AD_Value>>9);
TIM3_CCR1L = (unsigned char)((AD_Value>>1)&0xff);
}
}
/* Delay time = duration * Y */
while ( uc < duration ) /* The following loop is run "duration" times. */
{
while ( i < 1200 ) /* This loop "Y" waits approximately 4.3ms. */
{
i++;
}
i = 0;
uc++;
}
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: GPIO_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize GPIOs. */
/* IN: None. */
/* OUT: None. */
/* -------------------------------------------------------------------------- */
void GPIO_Init(void)
{
/* LED IO Configuration */
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
PD_DDR |= 0x0D; /* Output. */
PD_CR1 |= 0x0D; /* PushPull. */
PD_CR2 = 0x00; /* Output speed up to 2MHz. */
/* PD7 external interrupt */
EXTI_CR1 = 0x00;
EXTI_CR2 = 0x00;
PD_DDR &=~0x80;
PD_CR2 |= 0x80;
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: CLK_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the clock source */
/* -------------------------------------------------------------------------- */
void CLK_Init(void)
{
/* Configure HSI prescaler*/
CLK_CKDIVR &= ~0x10; /* 01: fHSI= fHSI RC output/2. */
/* Configure CPU clock prescaler */
CLK_CKDIVR |= 0x01; /* 001: fCPU=fMASTER/2. */
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: ADC_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the AD converter. */
/* -------------------------------------------------------------------------- */
void ADC_Init(void)
{
ADC_CR2 = 0x00;
ADC_CR1 = 0x00;
ADC_CSR = 0x03;
ADC_TDRL = 0x20;
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: TIM_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the TIM2 TIM3. */
/* -------------------------------------------------------------------------- */
void TIM_Init(void)
{
/* TIM2 CC2 control LED Brightness */
TIM2_CCMR2 |= 0x70; /* Output mode PWM2. */
TIM2_CCER1 |= 0x30; /* CC polarity low,enable PWM output */
TIM2_ARRH = 0x00;
TIM2_ARRL = 0xff; /* Freq control register: ARR */
TIM2_CCR2 = 0x00; /* Dutycycle control register: CCR */
TIM2_PSCR = 0x00; /* Configure TIM2 prescaler =1 */
TIM2_CR1 |= 0x01;
/* TIM3 CC1 control LED Blinking */
TIM3_CCMR1 |= 0x78; /* Output mode PWM2. */
TIM3_CCER1 |= 0x03; /* CC polarity low,enable PWM output */
TIM3_ARRH = 0x03;
TIM3_ARRL = 0xff; /* Freq control register: ARR */
TIM3_CCR1H = 0x02; /* Dutycycle control register: CCR */
TIM3_CCR1L = 0x00;
TIM3_PSCR |= 0x0d; /* Configure TIM3 prescaler = 8192 */
TIM3_CR1 |= 0x81;
}
/* -------------------------------------------------------------------------- */
/* ROUTINE: main */
/* main entry */
/* -------------------------------------------------------------------------- */
void main ( void )
{
unsigned int j;
_asm("sim"); /* Disable interrupts */
CLK_Init();
GPIO_Init();
TIM_Init();
ADC_Init();
_asm("rim");
while ( 1 )
{
LED_Control(0x08);
}
}
/*---------------------------- End of file -----------------------------------*/
复制代码
然后编译程序,成功!
嘿嘿,下面要把实验板连接到电脑调试了。
不过在连机调试前,要先设置下Debug instrument的Target Settings…,实验板配套的是ST LINK,所以就选ST LINK就可以了。
还有一个重要的,差点忘了,那就是STM8S小板需要接独立的外部电源,DC9~12V,插座是内正外负,别搞错正负极了。
接上电源,板上的D4电源指示灯应该亮起,用USB连接线把ST LINK连接到电脑的USB。
然后点击DEBUG按钮,进入仿真调试界面
中间有一个确定窗口需要确定下就可以了。
进入仿真界面后,执行RUN按钮运行程序,这时候实验板进入全速运行的状态,可以看到实验板上的LD2发光二极管以一定的频率在闪烁,LD1微亮,这时候顺时针旋转板上的那个电位器,可以发现LD2的闪烁频率变慢,同时LD1的亮度增强。逆时针旋转电位器则反之。
OK,至此STM8S的基础入门到此结束,由于工作繁忙,更深入的了解学习请大家多多探讨,这样才能进步得更快。谢谢~
本工程里的这个ST公司写的测试程序里有详细的英文注释,看看基本都能看懂。中断函数需要在tm8_interrupt_vector.c里写,大家注意下就可以了。现在没有用到什么ST的函数库,所以感觉像在用C语言开发AVR,差别不大。
作者:
John
时间:
2017-6-28 13:19
小白到此一游,以后会用到的,谢谢分享
作者:
htzsz
时间:
2017-8-17 08:02
想学习STM8,先收藏了,谢谢分享!
作者:
stm8899
时间:
2017-12-26 23:07
学习
作者:
jmabc88
时间:
2018-5-26 23:46
stm8很厉害,但入门难度比较大
作者:
QQ卖萌者
时间:
2018-5-27 09:37
学到了
作者:
L-login
时间:
2018-6-6 22:36
谢谢分享,正好用到,感谢~
作者:
hbthgsli
时间:
2019-7-13 09:57
谢谢楼主分享!
作者:
小刀单片机
时间:
2019-7-13 10:46
谢谢分享,另外B站上正点原子视频,推荐新手去入门
作者:
hbthgsli
时间:
2019-7-13 10:51
谢谢分享,正好用到,感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1