找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9845|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

STM8S系列單片機(jī)開(kāi)發(fā)環(huán)境應(yīng)用快速入門(mén)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104287 發(fā)表于 2016-1-29 23:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 51黑fan 于 2016-1-29 23:39 編輯

最近ST在國(guó)內(nèi)大力推廣他的8位高性價(jià)比單片機(jī)STM8S系列,感覺(jué)性能上還是非常不錯(cuò)的,網(wǎng)上稍微看了點(diǎn)資料,打算有機(jī)會(huì)還是學(xué)習(xí)一下,先入門(mén)為以后做好技術(shù)積累。好了,長(zhǎng)話短說(shuō)。手上拿到一套ST最近做活動(dòng)贈(zèng)送的三合一學(xué)習(xí)套件,上面包括STM32F小板、ST LINK小板、STM8S小板,做工很精致,相信很多朋友也收到了。既然當(dāng)初去申請(qǐng)了,人家也送了,總得把用起來(lái)吧,放著吃灰塵是很可惜的^_^ 。

好,步入正題,剛開(kāi)始在論壇上逛了一圈,感覺(jué)STM8S的資料實(shí)在太少,都是官方的應(yīng)用資料,沒(méi)有什么入門(mén)介紹,連需要安裝什么軟件都搞不清楚。偶的電腦光驅(qū)壞了,所以也讀不出光盤(pán)里有什么東西,所以只能到處瞎摸,還是ourdev論壇好,嘿嘿,仔細(xì)看了幾個(gè)帖子,總算明白大概是什么樣的開(kāi)發(fā)環(huán)境了。用C語(yǔ)言開(kāi)發(fā)STM8S,需要安裝兩個(gè)軟件:1、STVD IDE開(kāi)發(fā)環(huán)境;2、COSMIC for STM8 C編譯器。
STVD可以到官網(wǎng)下載,下載地址:http://www.torrancerestoration.com/bbs/dpj-43003-1.html
COSMIC 需要申請(qǐng)LICENSE,比較繁瑣,剛好壇子有人傳了一個(gè)免安裝無(wú)限制版本的,偶就趕緊下載了,大家可以去下載,僅做為個(gè)人學(xué)習(xí)使用。
下載地址:http://www.torrancerestoration.com/bbs/dpj-43001-1.html

    軟件下載后,只需安裝STVD。從上面地址下載的COSMIC不用安裝,只要解壓到硬盤(pán)即可。后面建立工程的時(shí)候設(shè)置好路徑即可。

下面一步一步開(kāi)始啦~
一、安裝好STVD后,桌面上建立了兩個(gè)快捷圖標(biāo),ST Visual Develop就是STVD了。ST Visual Programmer是編程軟件,可以配合ST LINK對(duì)STM8S進(jìn)行編程燒錄。



二、雙擊運(yùn)行ST Visual Develop,啟動(dòng)STVD開(kāi)發(fā)環(huán)境。執(zhí)行 File \ New Workspace,在New Workspace窗口里選擇Create workspace and projects,點(diǎn)擊“確定”建立工作組和工程


三、在Workspace filename里輸入Workspace名稱,由于最終我們要測(cè)試一個(gè)現(xiàn)成的LED程序,所以偶寫(xiě)了led,隨你喜歡了,呵呵。在Workspace里設(shè)置好文件當(dāng)前要存放的路徑。然后點(diǎn)“OK”確定。



四、在Project filename里輸入工程的名稱,在Project location里設(shè)置好工程的存放路徑。因?yàn)槲覀兪且肅語(yǔ)言來(lái)開(kāi)發(fā)的,所以在Toolchain里要選擇 STM8 Cosmic 編譯器;在Toolchain root里就要填寫(xiě)你剛才下載解壓后的那個(gè)無(wú)限制的Cosmic的存放路徑就可以了。都填好后,點(diǎn)“OK”。



怕大家搞不清楚上面的那個(gè)Toolchain root的存放路徑,特截圖一張。我是放在那里的,你看你放哪里就填哪里的路徑。



五、在MCU Selection里,需要選擇實(shí)際的MCU型號(hào)了,ST送的套件板上的芯片型號(hào)是STM8S207SBT6C,而下列的型號(hào)中卻是STM8S207S8,沒(méi)對(duì)上號(hào),不知道是不是STVD弄錯(cuò)了。反正偶選下面的STM8S207S8是可以用的,先用著咯,呵呵。雙擊型號(hào)后,點(diǎn)“OK”。



六、下面工程就建立好了,呵呵,自動(dòng)生成main.c 、stm8_interrupt_vector.c 、mods0.h。試試compile、build,一切順利,因?yàn)楝F(xiàn)在main.c只有一個(gè)主程序,所以還是可以編譯通過(guò)的,沒(méi)有什么錯(cuò)誤提示,如下下圖:





好了,以上就是使用STVD建立工程的詳細(xì)步驟了。

由于上面的main.c沒(méi)什么實(shí)質(zhì)的程序運(yùn)行,所以下面我們要運(yùn)行一個(gè)ADC電壓采集,并把采集值賦給定時(shí)器,實(shí)現(xiàn)定時(shí)器PWM的變化輸出,驅(qū)動(dòng)LED亮度發(fā)生變化的程序,這個(gè)程序我是從一個(gè)論壇上下載的,應(yīng)該也是這個(gè)套件板的光盤(pán)里的內(nèi)容。

我先把這個(gè)程序工程里的3個(gè)文件(main.c 、 tm8_interrupt_vector.c 、 STM8S207R.h)傳上來(lái),其實(shí)這個(gè)工程也是可以直接運(yùn)行的,但為了讓我們上面辛苦建立的工程發(fā)揮下作用,所以還是繼續(xù)沿用上面的工程,然后把我上傳的3個(gè)文件名里的main.c 、 tm8_interrupt_vector.c 里的內(nèi)容復(fù)制到我們剛才建立好的工程對(duì)應(yīng)的文件里;并把STM8S207R.h這個(gè)文件復(fù)制到我們工程目錄下,并添加到工程里,這個(gè)頭文件是必須的。
大家先下載這3個(gè)文件: led.rar (5.84 KB, 下載次數(shù): 36)
  1. /*============================================================================*/
  2. /* PROJECT:   LED Control by timer OC                                         */
  3. /* MODULE:    main.c                                                          */
  4. /* COMPILER:  STM8 Cosmic C Compiler                                          */
  5. /* DATE:      Feb 2009                                                        */
  6. /*----------------------------------------------------------------------------*/
  7. /* DESCRIPTION:   Demonstration firmware for STM8 Mini Kit                    */
  8. /*                Control LED blink, on/off/, brightness.                     */
  9. /*============================================================================*/
  10. /******************************************************************************
  11.   *
  12.   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  13.   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  14.   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  15.   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  16.   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  17.   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  18.   *
  19.   *                     COPYRIGHT 2008 STMicroelectronics
  20.   ******************************************************************************
  21. */

  22. /* Includes ------------------------------------------------------------------*/
  23. #include "stm8s207r.h"          /* Registers and memory mapping file. */

  24. /******************************************************************************/
  25. /* Macro definitions
  26. /******************************************************************************/

  27. /******************************************************************************/
  28. /* RAM SEGMENT variables                                                      */
  29. /******************************************************************************/
  30. /* Global variable used to store the ADC result. */
  31. unsigned int AD_Value;

  32. /******************************************************************************/
  33. /* Function definitions                                                       */
  34. /******************************************************************************/
  35. /* -------------------------------------------------------------------------- */
  36. /* ROUTINE NAME: LED_Control                                                   */
  37. /* INPUT/OUTPUT: Note duration (4bit MSB information) / None.                 */
  38. /* DESCRIPTION: 1) Sample AIN voltage and store in AD_Value.                  */
  39. /*              2) Polling wait routine for note duration(based on 3ms delay).*/
  40. /*                 duration: Quaver (2), crotchet (4) or minim (8) selection. */
  41. /* ---------------------------------------------------------------------------*/
  42. void LED_Control(unsigned char duration)
  43. {
  44.     int i = 0;
  45.     unsigned char uc = 0;
  46.     unsigned long Temp;

  47.     /* Sample AIN voltage in ADC single mode */
  48.     ADC_CR1 |= 0x01;         /* First set ADON to power on the ADC module.    */
  49.     i = 6;                   /* Wait >7us to ensure the ADC power on finished.*/
  50.     while(i--);
  51.     ADC_CR1 |= 0x01;         /* Set ADON again to start AD convert.           */
  52.     while(!(ADC_CSR & 0x80));/* Waiting for AD convert finished (EOP=1).      */

  53.     /* Store ADC value to AD_Value */
  54.     AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL);

  55.     /* The new duty cycle value is written in CCR. */
  56.     TIM2_CCR2H=0x00;
  57.     TIM2_CCR2L=(unsigned char)(AD_Value>>2);

  58.     if (AD_Value>0x10)
  59.     {
  60.       Temp=(unsigned char)(AD_Value>>8);

  61.       if ((TIM3_ARRH>Temp+0x05)||(TIM3_ARRH<Temp-0x05))
  62.       {
  63.         TIM3_ARRH  = Temp;
  64.         TIM3_ARRL  = (unsigned char)(AD_Value&0xff);
  65.         TIM3_CCR1H = (unsigned char)(AD_Value>>9);
  66.         TIM3_CCR1L = (unsigned char)((AD_Value>>1)&0xff);
  67.       }
  68. }
  69.     /* Delay time = duration * Y */
  70.     while ( uc < duration )  /* The following loop is run "duration" times. */
  71.     {
  72.       while ( i < 1200 )     /* This loop "Y" waits approximately 4.3ms.      */
  73.       {
  74.         i++;
  75.       }
  76.       i = 0;
  77.       uc++;
  78.     }
  79. }


  80. /* -------------------------------------------------------------------------- */
  81. /* ROUTINE NAME: GPIO_Init                                                    */
  82. /* INPUT/OUTPUT: None.                                                        */
  83. /* DESCRIPTION:  Initialize GPIOs.                                            */
  84. /* IN:           None.                                                        */
  85. /* OUT:          None.                                                        */
  86. /* -------------------------------------------------------------------------- */
  87. void GPIO_Init(void)
  88. {
  89.     /* LED IO Configuration        */
  90.     /* LD3: PD3             */
  91.     /* LD2: PD1             */
  92.     /* LD1: PD0             */
  93.     PD_DDR |= 0x0D;              /* Output.                  */
  94.     PD_CR1 |= 0x0D;              /* PushPull.                */
  95.     PD_CR2  = 0x00;              /* Output speed up to 2MHz. */

  96.     /* PD7 external interrupt */
  97.     EXTI_CR1  = 0x00;            
  98.     EXTI_CR2  = 0x00;
  99.     PD_DDR   &=~0x80;
  100.     PD_CR2   |= 0x80;
  101. }


  102. /* -------------------------------------------------------------------------- */
  103. /* ROUTINE NAME: CLK_Init                                                     */
  104. /* INPUT/OUTPUT: None.                                                        */
  105. /* DESCRIPTION:  Initialize the clock source                                  */
  106. /* -------------------------------------------------------------------------- */
  107. void CLK_Init(void)
  108. {
  109.     /* Configure HSI prescaler*/
  110.     CLK_CKDIVR &= ~0x10;          /* 01: fHSI= fHSI RC output/2. */

  111.     /* Configure CPU clock prescaler */
  112.     CLK_CKDIVR |= 0x01;           /* 001: fCPU=fMASTER/2. */
  113. }

  114. /* -------------------------------------------------------------------------- */
  115. /* ROUTINE NAME: ADC_Init                                                     */
  116. /* INPUT/OUTPUT: None.                                                        */
  117. /* DESCRIPTION:  Initialize the AD converter.                                 */
  118. /* -------------------------------------------------------------------------- */
  119. void ADC_Init(void)
  120. {
  121.     ADC_CR2  = 0x00;
  122.     ADC_CR1  = 0x00;
  123.     ADC_CSR  = 0x03;
  124.     ADC_TDRL = 0x20;
  125. }

  126. /* -------------------------------------------------------------------------- */
  127. /* ROUTINE NAME: TIM_Init                                                     */
  128. /* INPUT/OUTPUT: None.                                                        */
  129. /* DESCRIPTION:  Initialize the TIM2 TIM3.                                    */
  130. /* -------------------------------------------------------------------------- */
  131. void TIM_Init(void)
  132. {
  133.     /* TIM2 CC2 control LED Brightness */
  134.     TIM2_CCMR2 |= 0x70;           /* Output mode PWM2.                      */
  135.     TIM2_CCER1 |= 0x30;           /* CC polarity low,enable PWM output      */
  136.     TIM2_ARRH   = 0x00;
  137.     TIM2_ARRL   = 0xff;           /* Freq control register: ARR             */
  138.     TIM2_CCR2   = 0x00;           /* Dutycycle control register: CCR        */

  139.     TIM2_PSCR   = 0x00;           /* Configure TIM2 prescaler =1            */
  140.     TIM2_CR1   |= 0x01;

  141.     /* TIM3 CC1 control LED Blinking */
  142.     TIM3_CCMR1 |= 0x78;           /* Output mode PWM2.                      */
  143.     TIM3_CCER1 |= 0x03;           /* CC polarity low,enable PWM output      */
  144.     TIM3_ARRH   = 0x03;
  145.     TIM3_ARRL   = 0xff;           /* Freq control register: ARR             */
  146.     TIM3_CCR1H  = 0x02;           /* Dutycycle control register: CCR        */
  147.     TIM3_CCR1L  = 0x00;

  148.     TIM3_PSCR  |= 0x0d;           /* Configure TIM3 prescaler = 8192        */
  149.     TIM3_CR1   |= 0x81;
  150. }

  151. /* -------------------------------------------------------------------------- */
  152. /* ROUTINE: main                                                              */
  153. /*          main entry                                                        */
  154. /* -------------------------------------------------------------------------- */
  155. void main ( void )
  156. {
  157.     unsigned int j;

  158.     _asm("sim");                 /* Disable interrupts */

  159.     CLK_Init();

  160.     GPIO_Init();

  161.     TIM_Init();

  162.     ADC_Init();

  163.     _asm("rim");

  164.     while ( 1 )
  165.     {
  166.       LED_Control(0x08);
  167.     }
  168. }  
  169. /*---------------------------- End of file -----------------------------------*/
  170.    
復(fù)制代碼



然后編譯程序,成功!



嘿嘿,下面要把實(shí)驗(yàn)板連接到電腦調(diào)試了。
不過(guò)在連機(jī)調(diào)試前,要先設(shè)置下Debug instrument的Target Settings…,實(shí)驗(yàn)板配套的是ST LINK,所以就選ST LINK就可以了。





還有一個(gè)重要的,差點(diǎn)忘了,那就是STM8S小板需要接獨(dú)立的外部電源,DC9~12V,插座是內(nèi)正外負(fù),別搞錯(cuò)正負(fù)極了。
接上電源,板上的D4電源指示燈應(yīng)該亮起,用USB連接線把ST LINK連接到電腦的USB。

然后點(diǎn)擊DEBUG按鈕,進(jìn)入仿真調(diào)試界面


中間有一個(gè)確定窗口需要確定下就可以了。



進(jìn)入仿真界面后,執(zhí)行RUN按鈕運(yùn)行程序,這時(shí)候?qū)嶒?yàn)板進(jìn)入全速運(yùn)行的狀態(tài),可以看到實(shí)驗(yàn)板上的LD2發(fā)光二極管以一定的頻率在閃爍,LD1微亮,這時(shí)候順時(shí)針旋轉(zhuǎn)板上的那個(gè)電位器,可以發(fā)現(xiàn)LD2的閃爍頻率變慢,同時(shí)LD1的亮度增強(qiáng)。逆時(shí)針旋轉(zhuǎn)電位器則反之。




OK,至此STM8S的基礎(chǔ)入門(mén)到此結(jié)束,由于工作繁忙,更深入的了解學(xué)習(xí)請(qǐng)大家多多探討,這樣才能進(jìn)步得更快。謝謝~

本工程里的這個(gè)ST公司寫(xiě)的測(cè)試程序里有詳細(xì)的英文注釋,看看基本都能看懂。中斷函數(shù)需要在tm8_interrupt_vector.c里寫(xiě),大家注意下就可以了,F(xiàn)在沒(méi)有用到什么ST的函數(shù)庫(kù),所以感覺(jué)像在用C語(yǔ)言開(kāi)發(fā)AVR,差別不大。



評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
前行者 + 5 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:36060 發(fā)表于 2017-6-28 13:19 | 只看該作者
小白到此一游,以后會(huì)用到的,謝謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:142383 發(fā)表于 2017-8-17 08:02 | 只看該作者
想學(xué)習(xí)STM8,先收藏了,謝謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:267439 發(fā)表于 2017-12-26 23:07 | 只看該作者
學(xué)習(xí)            
回復(fù)

使用道具 舉報(bào)

5#
ID:330935 發(fā)表于 2018-5-26 23:46 | 只看該作者
stm8很厲害,但入門(mén)難度比較大
回復(fù)

使用道具 舉報(bào)

6#
ID:334915 發(fā)表于 2018-5-27 09:37 | 只看該作者
學(xué)到了
回復(fù)

使用道具 舉報(bào)

7#
ID:346544 發(fā)表于 2018-6-6 22:36 | 只看該作者
謝謝分享,正好用到,感謝~
回復(fù)

使用道具 舉報(bào)

8#
ID:323453 發(fā)表于 2019-7-13 09:57 | 只看該作者
謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

9#
ID:583160 發(fā)表于 2019-7-13 10:46 | 只看該作者
謝謝分享,另外B站上正點(diǎn)原子視頻,推薦新手去入門(mén)
回復(fù)

使用道具 舉報(bào)

10#
ID:323453 發(fā)表于 2019-7-13 10:51 | 只看該作者

謝謝分享,正好用到,感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表