经不住诱惑,今天开始玩STM8!麻烦过来人进来讲讲心得

2019-12-26 18:53发布

1、买的STM8 value line discovery板刚到手,从最简单的STM8S003开始吧。
2、下载了STVD/COSMIC。COSMIC_32K坛里有和谐好的,不过要先下载原版安装。
3、争取今晚把LED点亮。
4、其实我很看好STM8L152,之后要测试一下耗电和ADC性能。
5、纯业余玩的,还没想好弄点啥……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
76条回答
millwood0
1楼-- · 2019-12-29 14:13
I use a template + modules for pretty much all of my projects.

the following is for iar ewstm8.

here is the template for main.c
  1. #include <iostm8.h>
  2. #include "gpio.h"
  3. //#include "tmr2.h"                                                        //we use tim2
  4. //#include "tmr3.h"                                                        //we use tim3
  5. //#include "tmr4.h"                                                        //we use tim3

  6. //hardware configuration
  7. //end hardware configuration

  8. void mcu_init(void) {
  9. }

  10. int main( void ) {
  11.     mcu_init();                                       //reset the mcu

  12.     while (1) {
  13.     }
  14.     return 0;
  15. }
复制代码
millwood0
2楼-- · 2019-12-29 15:48
here is gpio.h


  1. #ifndef __GPIO_H
  2. #define __GPIO_H

  3. //port-related macros for stm8s
  4. //DEFAULT: OPEN DRAIN OUTPUT
  5. //set Px_CR1 and clear Px_CR2 to turn to push_pull output

  6. #define IO_SET(port, bits)        port |= (bits)                                //set bits on port
  7. #define IO_CLR(port, bits)        port &=~(bits)                                //clear bits on port
  8. #define IO_FLP(port, bits)        port ^= (bits)                                //flip bits on port

  9. #define IO_GET(port, bits)        ((port) & (bits))                        //return bits on port

  10. #define IO_OUT(ddr, bits)        ddr |= (bits)                                //set bits as output. stm8s: sets a bit to make it an output
  11. #define IO_IN(ddr, bits)        ddr &=~(bits)                                //set bits as input. stm8s: clears a bit to make it an input

  12. #define NOP()                         asm("nop")                            //nop
  13. #define NOP2()                                {NOP(); NOP();}
  14. #define NOP4()                                {NOP2(); NOP2();}
  15. #define NOP8()                                {NOP4(); NOP4();}
  16. #define NOP16()                                {NOP8(); NOP8();}

  17. #ifndef ei
  18.         #define ei()                        asm("rim")                                        //enable all interrupts
  19. #endif

  20. #ifndef di
  21.         #define di()                        asm("sim")                                        //disable all interrupts
  22. #endif
  23. #define __enable_interrupt()        ei()
  24. #define __disable_interrupt()        di()

  25. //fmaster = 16Mhz / 8 -> 2Mhz
  26. //fcpu = fmaster / 1 -> 2Mhz
  27. #define F_MASTER                        (16000000ul / 8)                                        //fmaster -> default to hsi (16mhz), divided by 8
  28. #define F_CPU                                (F_MASTER)                                        //fcpu

  29. //define ld1 on stm8sdiscovery board
  30. #define LED1_PORT                        PD_ODR
  31. #define LED1_DDR                        PD_DDR
  32. #define LED1                                (1<<0)

  33. //#define LED1_ON()                  IO_CLR(LED1_PORT, LED1)     //turn on the leds, assuming output mode
  34. //#define LED1_OFF()                 IO_SET(LED1_PORT, LED1)     //turn off the leds, assuming output mode
  35. //#define LED1_FLP()                IO_FLP(LED1_PORT, LED1)                //flip leds

  36. //void (*mcu_reset)(void) = 0x0000;                                         //jump to 0x0000 -> software reset

  37. //simple multiples
  38. #define x1(val)                                (val)                                                                //multiply val by 1
  39. #define x2(val)                                (((val) << 1))                                                //multiply val by 2
  40. #define x3(val)                                (x2(val) + (val))                                        //multiply val by 3
  41. #define x4(val)                                (((val) << 2))                                                //multiply val by 4
  42. #define x5(val)                                (x4(val) + (val))                                        //multiply val by 5
  43. #define x6(val)                                (x4(val) + x2(val))                                        //multiply val by 6
  44. #define x7(val)                                (x6(val) + (val))                                        //multiply val by 7
  45. #define x8(val)                                ((val) << 3)                                                //multiply val by 8
  46. #define x9(val)                                (x8(val) + (val))                                        //multiply val by 9

  47. //multiples of 10s
  48. #define x10(val)                        (x8(val) + x2(val))                                        //multiply val by 10
  49. #define x100(val)                        (x10(x10(val)))                                                //multiply val by 100
  50. #define x1000(val)                        (x100(x10(val)))                                        //multiply val by 1000
  51. #define x1k(val)                        x1000(val)                                                        //multiply val by 1000
  52. #define x10k(val)                        (x100(x100(val)))                                        //multiply val by 10000

  53. #define x20(val)                        (x2(x10(val)))
  54. #define x30(val)                        (x3(x10(val)))
  55. #define x40(val)                        (x4(x10(val)))
  56. #define x50(val)                        (x5(x10(val)))
  57. #define x60(val)                        (x6(x10(val)))
  58. #define x70(val)                        (x7(x10(val)))
  59. #define x80(val)                        (x8(x10(val)))
  60. #define x90(val)                        (x9(x10(val)))

  61. //multiples of 100s
  62. #define x200(val)                        (x2(x100(val)))
  63. #define x300(val)                        (x3(x100(val)))
  64. #define x400(val)                        (x4(x100(val)))
  65. #define x500(val)                        (x5(x100(val)))
  66. #define x600(val)                        (x6(x100(val)))
  67. #define x700(val)                        (x7(x100(val)))
  68. #define x800(val)                        (x8(x100(val)))
  69. #define x900(val)                        (x9(x100(val)))

  70. //custom definitions
  71. #define x34(val)                        (x30(val) + x4(val))                                //multiply val by 34
  72. #define x97(val)                        (x90(val) + x7(val))                                //multiply val by 97x

  73. #endif //__gpio_h_
复制代码you don't need to have all of it. it predefines LED1 (on PD0).

as well as F_CPU (running at 16Mhz / 8).
millwood0
3楼-- · 2019-12-29 21:13
to blink an led, you will need to introduce delay.

here is the software delay routines I use:

delay.h:


  1. #ifndef __DELAY_H
  2. #define __DELAY_H

  3. void delay(unsigned char dly);

  4. void delay_us(unsigned short us);

  5. void delay_ms(unsigned short ms);

  6. #endif //delay_h
复制代码delay.c


  1. //simple example
  2. /* Includes ------------------------------------------------------------------*/
  3. //#include <iostm8.h>
  4. //#include <stdio.h>                          //because we used printf
  5. #include "gpio.h"                                //we use _nop_(), F_CPU
  6. #include "delay.h"                                //we use software delays
  7. /* Global variables ----------------------------------------------------------*/
  8. //cpu running at 2Mhz

  9. //#define _DLY_MS                                158                                //delay for EWAVR (USB1286)
  10. //#define _DLY_MS                                40                                //delay for WINAVR debug mode(USB1286, no optimization)
  11. //#define _DLY_MS                                158                                //delay for WINAVR release (USB1286)
  12. //#define _DLY_MS                                120                                //delay for C51
  13. //#define _DLY_MS                                329                                //delay for avr
  14. //#define _DLY_MS                                160                                //delay for PIC18F46K20 @ 4Mhz
  15. //#define _DLY_MS                                200                                //delay for PIC16F886
  16. //#define _DLY_MS                                984                                //delay for LPC2106
  17. //#define _DLY_MS                                226                                //lpc1343 on keil
  18. #define _DLY_MS                                        215                                //stm8s@2Mhz

  19. //delay routines
  20. void delay(unsigned char dly) {              //waste some cycle
  21.         while (dly--)
  22.                 continue;
  23. }

  24. //delay_us(1000) = 10ms
  25. //delay_us(1) = 10us
  26. void delay_us(unsigned short us) {            //delay a us
  27.         delay(us);                                                //delay the lsb
  28.         us = us >> 8;                                        //retain the msb
  29.         while (us--) delay(0xff);                //delay the msb
  30. }

  31. void delay_ms(unsigned short ms) {        //delay ms
  32.         while (ms--) delay_us(_DLY_MS * (F_CPU / 2000000ul));
  33. }
复制代码
millwood0
4楼-- · 2019-12-29 23:39
an led blinky would be something like this:


  1. #include <iostm8.h>
  2. #include "gpio.h"
  3. #include "delay.h" //we use software delay
  4. //#include "tmr2.h"                                                        //we use tim2
  5. //#include "tmr3.h"                                                        //we use tim3
  6. //#include "tmr4.h"                                                        //we use tim3

  7. //hardware configuration
  8. #define LED1_DLY  500 //led1 delay, in ms
  9. //end hardware configuration

  10. void mcu_init(void) {
  11.   IO_CLR(LED1_PORT, LED1); //clear led1
  12.   IO_OUT(LED1_DDR, LED1); //led1 as output
  13. }

  14. int main( void ) {
  15.     mcu_init();                                       //reset the mcu

  16.     while (1) {
  17.       delay_ms(LED1_DLY); //waste some time
  18.       IO_FLP(LED1_PORT, LED1);  //flip led1
  19.     }
  20.     return 0;
  21. }
复制代码it should work  once you have it downloaded onto your chip.
n_mos
5楼-- · 2019-12-30 00:49
 精彩回答 2  元偷偷看……
hellosky
6楼-- · 2019-12-30 01:17
我也在学

一周热门 更多>