STM8S-Discovery IDE läuft nicht

Gast #3287505
Lesenswert?

Moin,

ich meine bei ST gelesen zu haben das in Zukunft nur noch der IAR direkt 
unterstützt wird.
Ich habe mir Cosmic, Raisonance und IAR angeschaut und bin mit dem IAR 
am besten zurecht gekommen.
Alles aus einem Guss ohne Zuhilfenahme von 3rd party Beschreibungen 
problemlos in Betrieb zu nehmen.
(max. code size ??? Mein stm8s003 hat nur 8K)

Den Cosmic in die merkwürdige ST IDE einzubinden fand ich gruselig.
Wenn sich noch nicht mal die Examples ohne Fehlermeldung kompilieren 
lassen und in der sehr dürftigen Doku Schritte und Menues beschrieben 
werden die unauffindbar sind ... Weiß nicht ...

Raisonace hat eine ganz nette IDE wollte aber von dem STlink nichts 
wissen.

Für Lau, ohne Beschränkungen: http://sourceforge.net/projects/sdccstm/
Der STM8 Port ist soweit ich weiß recht neu.
Ich mag den SDCC habe aber nur auf 8051 Derivaten damit gearbeitet und 
kann zum STM8 Port nix sagen.

Stichwort ST Doku:
Tretet ein und lasset alle Hoffnung fahren.
Ganz schlimmer verquerer Kram den ST da raushaut, sofern man es 
geschafft hat das was überhaupt dokumentiert ist in den Tiefen der ST 
Server zu finden.

Die Peripheral Librarys sind eher so grobe Ideen wie Peripherie 
anzusprechen wäre. Nett um mal in den Code zu schauen wie die das 
machen.
Minimaler Nutzen mit maximaler Befehlsanzahl scheint die Devise zu sein.

Gruß
Michael
Gast #3288966
Lesenswert?

@Alex

Der 003 kostet gerade mal 30Cent. Darum werden die viel eingesetzt.

Pro:
- SEHR viel MCU fürs Geld
- Debugger / Programmer für 5 Euro
- Gute und durchdachte Peripherie

Der Wechsel auf die sehr populären STM32 soll relativ einfach sein.
So sagt man ...

ATmega:

Schwierig direkt zu vergleichen.
Risc statt Cisc und Harvard statt von Neumann.
Die Megas sind wirklich toll, die IDE und das Software Framework ist 
sehr anständig.
Megas sind älter, teurer und sehr gut beschrieben.

Ich persönlich finde die Xmegas Turbo gut, aber die haben zum Teil noch 
hässliche bugs wenn man versucht die nagelneue Peripherie in sehr 
speziellen Kombinationen zu betreiben. Muss man ja aber auch nicht tun.
Der unzuverlässige Debugger nervt da viel mehr.

Microchip Pics liegen irgendwo dazwischen.
Für wirklich jeden absurden Spezialfall gibt es einen ideal passenden 
PIC.
Zumeist ein sehr anständiges Preis Leistungsverhältniss.
Finde ich auch gut, aber man muss ordentlich extra Zeit einplanen um 
diese absurden PIC Bugs zu finden, oder den alles entscheidenden kleinen 
Satz in 1000 Seiten Fließtext der erklärt warum es nicht geht obwohl es 
gehen müsste.

Ein Kriterium ist auch wie leicht man ein MCU Model upgraden kann ohne 
den Code umzuschreiben. mega = gut, xmega = exzellent, PIC = mal so mal 
so,
ST = grusel. (stm8s003: TSSOP & QFN Gehäuse sind nicht 
softwarekompatibel)

Ergo:
Zeige mir die MCU bei der alles stimmt.
Es gibt einfache, schnelle, billige und vielseitige MCUs
Ich habe aber noch keine gefunden die alles zugleich wäre.

Gruß
Michael
#3288994
Lesenswert?

vielen Dank, dann mal ein konkretes problem:

bekomme den timer3 interrupt nicht zum laufen am stm8s105c6 
Discovery-Board.
Habe das Beispiel-Projekt für das STM8S-Discovery mit dem 
Touch-blink-Led umgeschrieben.
Aber der geht nach ein paar zyklen immer in exeption...
Woran kann das liegen`? Irgendwie passt was mit dem Interrupt vector 
nicht?!?...
1
/* Includes ------------------------------------------------------------------*/
2
#include "stm8s.h"
3
#include "stm8_tsl_rc_api.h"
4
#include "stm8s_tim3.h"
5

6
/* Private typedef -----------------------------------------------------------*/
7
/* Private define ------------------------------------------------------------*/
8
#define MilliSec       1
9
#define Sec           10
10
/* Private macro -------------------------------------------------------------*/
11
/* Private variables ---------------------------------------------------------*/
12
/* Private function prototypes -----------------------------------------------*/
13
void CLK_Configuration(void);
14
void GPIO_Configuration(void);
15
void ExtraCode_Init(void);
16
void ExtraCode_StateMachine(void);
17
void Delay(void action(void), int NumberofTIMCycles);
18
void Toggle(void);
19

20
#pragma vector = TIM3_IER_CC2IE
21
__interrupt void TIM3_Compare_vector(void)
22
{
23
  GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
24
}
25
#pragma vector = TIM3_SR1_UIF
26
__interrupt void TIM3_Update_vector(void)
27
{
28
  GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
29
}
30
/* Private functions ---------------------------------------------------------*/
31
/* Global variables ----------------------------------------------------------*/
32
u8 BlinkSpeed = 6;
33
int PWMvalue = 999;
34
int NumberOfStart;
35
int CheckFlag = 1;
36

37
/* Public functions ----------------------------------------------------------*/
38

39
/**
40
  ******************************************************************************
41
  * @brief Main function.
42
  * @par Parameters:
43
  * None
44
  * @retval void None
45
  * @par Required preconditions:
46
  * None
47
  ******************************************************************************
48
  */
49
void main(void)
50
{
51
  /* Configures clocks */
52
  CLK_Configuration();
53

54
  /* Configures GPIOs */
55
  GPIO_Configuration();
56
  
57
  /* Initialize Touch Sensing library */
58
  TSL_Init();
59
  
60
  /* Initialize all the Touch Sensing keys */
61
  ExtraCode_Init();
62

63
  /* Start the 100ms timebase Timer */
64
  TSL_Tick_Flags.b.User_Start_100ms = 1;
65
  
66
  /* Initialize Timer3 */
67
  TIM3_DeInit(); 
68
  TIM3_TimeBaseInit(TIM3_PRESCALER_1, 999);
69
  TIM3_OC2Init(TIM3_OCMODE_PWM2, TIM3_OUTPUTSTATE_DISABLE, 999, TIM3_OCPOLARITY_LOW);
70
  TIM3_Cmd(ENABLE);
71
  TIM3_ITConfig(TIM3_IT_CC2,ENABLE);
72
  TIM3_ITConfig(TIM3_IT_UPDATE,ENABLE);
73
  enableInterrupts();
74
  
75
  for (;;)
76
  {
77

78
    /* User code */
79
    ExtraCode_StateMachine();
80
   
81
    /* Main function of the Touch Sensing library */
82
    TSL_Action();
83

84
  }
85

86
}
Gast #3289008
Lesenswert?

>Es soll 2 C compiler geben Cosmic und Raisonance.
Raisonance hat wohl eine modernere IDE.

>Der 003 kostet gerade mal 30Cent.
Ja, wenn man damit hinkommt.
Die CPU ist oft schneller als AVR, aber STM8 haben auch Nachteile.
Ua sind nur wenige IOPins schnell schaltbar und haben höheren I (weshalb 
man das jedesmal extra nachprüfen muss). Auch gibt es da mMn (noch) 
wenige Derivate.
Gast #3289097
Lesenswert?

Hab ich auch erst so gemacht.
Hat auch nicht geklappt und da hab ich mich an das ST Konzept gehalten.


stm8s_it.h / .c einbinden

in der .c den richtigen Abschnitt suchen und editieren.
Bei mir z.B. der Timer1 overflow


/**
  * @brief Timer1 Capture/Compare Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  TIM1_OCx_IRQ_Routine();  // das ist meine Routine in der main()
}


in der main()

void TIM1_OVF_IRQ_Routine(void)
{
//
}

Wo ist Dein " enableInterrupts(); "  ?
#3289136
Lesenswert?

Meine Interrupt-Routine für Timer 2 ist wie folgt:
1
//=====================================
2
// TIM2   Update/Overflow/Trigger Interrupt routine.
3
//=====================================
4
INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler,19)
5
{
6
  tim2_10us++;
7
  TIM2->SR1 = (uint8_t)(~(uint8_t)TIM2_IT_Update);
8
  timer_status.f10us_task_request = true;
9
}

Du scheinst das Flag nicht zurückzusetzen.
#3289137
Lesenswert?

vielen Dank.

Ich habs nun so gelöst mit hilfe der iostm8s105c6.h habe ich die nummern 
der Vectoren ausgelesen.(Die Header lässt sich nicht compileren warum 
auch immer...)
und direkt reingeschrieben. Jetzt springt er in den TimerInterrupt.

richtig die Flags hab ich auch zurücksetzten müssen.
1
/* Includes ------------------------------------------------------------------*/
2
#include "stm8s.h"
3
#include "stm8_tsl_rc_api.h"
4
#include "stm8s_tim3.h"
5
//#include "iostm8s105c6.h"
6

7
/* Private typedef -----------------------------------------------------------*/
8
/* Private define ------------------------------------------------------------*/
9
#define MilliSec       1
10
#define Sec           10
11
/* Private macro -------------------------------------------------------------*/
12
/* Private variables ---------------------------------------------------------*/
13
/* Private function prototypes -----------------------------------------------*/
14
void CLK_Configuration(void);
15
void GPIO_Configuration(void);
16
void ExtraCode_Init(void);
17
void ExtraCode_StateMachine(void);
18
void Delay(void action(void), int NumberofTIMCycles);
19
void Toggle(void);
20

21
#pragma vector = 0x12
22
__interrupt void TIM3_Compare_vector(void);
23
#pragma vector = 0x11
24
__interrupt void TIM3_Update_vector(void);
25

26
/* Private functions ---------------------------------------------------------*/
27
/* Global variables ----------------------------------------------------------*/
28
u8 BlinkSpeed = 6;
29
u16 PWMvalue = 500;
30
u16 nowCounterTim3;
31
int NumberOfStart;
32
int CheckFlag = 1;
33

34
/* Public functions ----------------------------------------------------------*/
35

36
/**
37
  ******************************************************************************
38
  * @brief Main function.
39
  * @par Parameters:
40
  * None
41
  * @retval void None
42
  * @par Required preconditions:
43
  * None
44
  ******************************************************************************
45
  */
46
void main(void)
47
{
48
  /* Configures clocks */
49
  CLK_Configuration();
50

51
  /* Configures GPIOs */
52
  GPIO_Configuration();
53
  
54
  /* Initialize Touch Sensing library */
55
  TSL_Init();
56
  
57
  /* Initialize all the Touch Sensing keys */
58
  ExtraCode_Init();
59

60
  /* Start the 100ms timebase Timer */
61
  TSL_Tick_Flags.b.User_Start_100ms = 1;
62
  
63
  /* Initialize Timer3 */
64
  TIM3_DeInit(); 
65
  TIM3_TimeBaseInit(TIM3_PRESCALER_1, 16535);
66
  TIM3_OC2Init(TIM3_OCMODE_PWM2, TIM3_OUTPUTSTATE_DISABLE, 999, TIM3_OCPOLARITY_LOW);
67
  TIM3_Cmd(ENABLE);
68
  TIM3_ITConfig(TIM3_IT_CC2,ENABLE);
69
  TIM3_ITConfig(TIM3_IT_UPDATE,ENABLE);
70
  enableInterrupts();
71
  
72
  for (;;)
73
  {
74

75
    /* User code */
76
    ExtraCode_StateMachine();
77
   
78
    /* Main function of the Touch Sensing library */
79
    TSL_Action();
80

81
  }
82

83
}
84

85
/* Interrupt functions */
86
__interrupt void TIM3_Compare_vector(void)
87
{
88
  TIM3_ClearITPendingBit(TIM3_IT_CC2);
89
  nowCounterTim3 = TIM3_GetCounter();
90
  GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
91
}
92
__interrupt void TIM3_Update_vector(void)
93
{
94
  TIM3_ClearITPendingBit(TIM3_IT_UPDATE);
95
  nowCounterTim3 = TIM3_GetCounter();
96
  GPIO_WriteLow(GPIOD, GPIO_PIN_0);
97
}

Jetzt kommen aber die Interrupts immer an unterschiedlichen stellen.
Normalerweise sollte ja einer nach Timer überlauf und der andere am 
Vergleichsergebnis kommen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren