Starting STM8 Microcontrollers

|
Analog Watchdog (AWD)
The AWD is one additional feature that most microcontrollers in the market do not have. AWD is more like a comparator but with the exception that we can set both the upper and lower limits of this comparator as per our requirement unlike fixed levels in other micros. The region between the upper and lower limits is called guarded zone. Beyond the boundaries of the guarded zone, the AWD unit kicks off.
The AWD unit is very useful in situations where we need to monitor the output of a sensor for example and take quick actions. For instance, consider a temperature controller. We would want the controller to turn on a heater should temperature fall below some level and turn it off when temperature rises to some high value without complex calculations and constant monitoring in our application firmware. In other microcontrollers, we would have accomplished this simple task using conditional IF-ELSE statements.
Hardware Connection
Code Example
#include "STM8S.h"
void clock_setup(void);
void GPIO_setup(void);
void ADC1_setup(void);
void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);
void main()
{
unsigned int a1 = 0x0000;
clock_setup();
GPIO_setup();
ADC1_setup();
LCD_init();
LCD_clear_home();
LCD_goto(0, 0);
LCD_putstr("STM8 AWD");
LCD_goto(0, 1);
LCD_putstr("A1");
while (TRUE)
{
ADC1_ClearFlag(ADC1_FLAG_EOC);
ADC1_StartConversion();
while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == 0);
a1 = ADC1_GetConversionValue();
lcd_print(4, 1, a1);
if(ADC1_GetFlagStatus(ADC1_FLAG_AWD))
{
GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
ADC1_ClearFlag(ADC1_FLAG_AWD);
}
else
{
GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
}
delay_ms(90);
};
}
void clock_setup(void)
{
CLK_DeInit();
CLK_HSECmd(DISABLE);
CLK_LSICmd(DISABLE);
CLK_HSICmd(ENABLE);
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);
CLK_ClockSwitchCmd(ENABLE);
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,
DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);
}
void GPIO_setup(void)
{
GPIO_DeInit(GPIOB);
GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
}
void ADC1_setup(void)
{
ADC1_DeInit();
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,
ADC1_CHANNEL_1,
ADC1_PRESSEL_FCPU_D10,
ADC1_EXTTRIG_GPIO,
DISABLE,
ADC1_ALIGN_RIGHT,
ADC1_SCHMITTTRIG_CHANNEL1,
DISABLE);
ADC1_AWDChannelConfig(ADC1_CHANNEL_1, ENABLE);
ADC1_SetHighThreshold(600);
ADC1_SetLowThreshold(200);
ADC1_Cmd(ENABLE);
}
void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)
{
char chr = 0x00;
chr = ((value / 1000) + 0x30);
LCD_goto(x_pos, y_pos);
LCD_putchar(chr);
chr = (((value / 100) % 10) + 0x30);
LCD_goto((x_pos + 1), y_pos);
LCD_putchar(chr);
chr = (((value / 10) % 10) + 0x30);
LCD_goto((x_pos + 2), y_pos);
LCD_putchar(chr);
chr = ((value % 10) + 0x30);
LCD_goto((x_pos + 3), y_pos);
LCD_putchar(chr);
}
Explanation
The code for the AWD example is just as the one demonstrated in the ADC example. However, this time the ADC channel is channel 1 (PB1). Setting up the AWD is simple. We just need to set the limits, specify which channel to be monitored and enable the AWD unit.
ADC1_AWDChannelConfig(ADC1_CHANNEL_1, ENABLE);
ADC1_SetHighThreshold(600);
ADC1_SetLowThreshold(200);
Here we have set 600 and 200 ADC counts as upper and lower limits respectively.
In the main function, we are simply polling AWD flag. If an AWD (beyond boundary zone) event on PB1 pin occurs the LED on PD0 starts flashing. If PB1 senses voltage between 200 and 600 ADC counts, the LED is turned off, indicating guarded zone.
if(ADC1_GetFlagStatus(ADC1_FLAG_AWD))
{
GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
ADC1_ClearFlag(ADC1_FLAG_AWD);
}
else
{
GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
}
Demo
JLCPCB: Prototype 10 PCBs for $2 (2-layer,100*100mm) |
|
Hi
I am using stm8s003f3 pin out board and with this code I am just testing output at micro controller pin 2 i.e. TX
I am testing this using an oscilloscope.
but not able to get any output
Can you please help?
Thanks
Did you recompile the code for your target chip?
Yes I did.
But Not getting expected output
Apart from the scope is there anything else connected with this pin? It should work as I have shown…. Can you try with a different board?
hi
nothing else is connected to that pin. yes I did try another board. but the results are same.
TX pin is just going HIGH.
hi
In STVD , STM8S003F3 MCU is not available but I am using this same so from the MCU selection list I have selected STM8S003F3P.
So does it make any difference??
no it doesn’t….
Hello
I have followed the code as per the explanation.
but I’m getting garbage values on serial port.
Can you suggest any debugging steps??
Thanks in advanced.
PS: Great tutorial. It’s helping me a lot.
1. Check wiring for loose connections….
2. Use a stable and noise-free power source like a battery-bank to power up the board…. Noise from PC port may cause unwanted issues….
3. Use CP2102 or FT232-based USB-TTL converter…. Don’t use PL2303-based ones because most are clones or fakes….
4. Use a short USB cable….
5. Use external pull-up resistors for both TX and RX pins….
6. Try with another board if these don’t solve the issue…. It should not behave as you are saying because the code has no issues….
Serial receiving program is not working
It should be unless something else is connected to the receive pin…. Please tell me about your hardware setup….
Hello sir
Do you tell me how generate pwm in pin no. B5 & B5
in Stm8 board
Which STM8 chip? Because different chips have different pin mapping and sometimes there are alternative pins for such purposes…. Check with STM8CubeMX if that pin is available for that purpose….
i have done code for multi channel adc but its not working ????
when i use single channel adc its working properly…………
Which channels are you using?
Hello guys
here i’m again for ask your help. I wrote a very easy program but when i try to send to stm8 the light programmer give me this error :
Programming…
PROGRAM MEMORY:
>Erase not feasible
>Programming
Error: Device not recognized !
some idea ?
Thank you
Sergio
Unlock it first with light programmer…. It seems you locked it probably….
First thank you so much for this wonderful tutorial, i’m new with STM8 i follow all you steps but i still have a problem and here i’m please can you help me this is the error message.
Thank you
Sergio
———– Project test_prov – STM8 Cosmic – Configuration Debug ————-
Compiling main.c…
cxstm8 -i..\..\en.stsw-stm8069\stm8s_stdperiph_lib\project\stm8s_stdperiph_template -igpio -iinc +debug -pxp -no -l +mods0 -pp -i”C:\Program Files (x86)\COSMIC\FSE_Compilers\CXSTM8\Hstm8″ -clDebug\ -coDebug\ main.c
#error cpstm8 gpio\inc\stm8s.h:74 “Please select first the target STM8S/A device used in your application (in stm8s.h file)”
main.c:
The command: “cxstm8 -i..\..\en.stsw-stm8069\stm8s_stdperiph_lib\project\stm8s_stdperiph_template -igpio -iinc +debug -pxp -no -l +mods0 -pp -i”C:\Program Files (x86)\COSMIC\FSE_Compilers\CXSTM8\Hstm8″ -clDebug\ -coDebug\ main.c ” has failed, the returned value is: 1
exit code=1.
test_prov.elf – 2 error(s), 0 warning(s)
It seems that you didn’t select the chip family or category….
Yes it’s true really i don’t know why i find another stm8s.h inside External Dependencies folder maybe i make some mistake in the beginning.
Tank you
Sergio
Hi Shawon ,
Excellent article on stms8.
within 3 days i was able to understand STMS8 very clearly.
can you send me delay library files please.
i tried to create my own without any success.
warm regards
Firstly thanks…. All library files and materials can be found here https://libstock.mikroe.com/projects/view/2056/stm8-microcontroller-tutorials
Please search for stm8s_delay.c and stm8s_delay.h in projects like TFT display demo, OLED demo, LCD libraries, etc….
hi sir now also getting problem in compilation time …..’
so plz can u send me the soft copy of software wat properly working at u…??
my emain id…
imran.vectorindia@gmail.com
I’m using the same software you are using – the latest one out there…. and so someone sending it has no meaning…. I suggest that you uninstall it and give it fresh retry, following all the steps carefully…. No one can help you with licensing issue unless to do it correctly….
hi geting poroblem while click on programmer ten my softare automatically close tab
The latest version of STVD has this issue…. I’m also facing this issue and so are many other like us…. Hope STM fixes this issue fast…. For now use STVD for coding and STVP for flashing….
thanks sir
hi sir…
i getting problem for license configured……………. at compile time getting error like that…………. plz help out
#error cpstm8 C:\Program Files (x86)\COSMIC\FSE_Compilers\CXSTM8\HSTM8\mods0.h:1 FlexLM Cannot find license file.
main.c:
The command: “cxstm8 -iinc +debug -pxp -no -l +mods0 -pp -i”C:\Program Files (x86)\COSMIC\FSE_Compilers\Hstm8″ -clDebug\ -coDebug\ main.c ” has failed, the returned value is: 1
exit code=1.
alpha_lcd.elf – 3 error(s), 0 warning(s)
Did you follow the procedure as I showed?
YES SIR
helo…we hav stm8svl discovery..i need embedded c program for the glowing of led,connecting ir receiver and also powersupply…for connecting these things i need code can u please guide me
Thanks for this article..
I am looking for microsd card interface with STM8s discovery board. can you please provide the tutorial for microsd card?
It is on my plan but not possible recently….
In relation to disabling unused peripheral clocks as suggested by you:
I found the following list of peripherals in the STM8S105 Discovery Board: Advanced control timer (TIM1), General-purpose timers (TIM2 and TIM3), Basic timer (TIM4), SPI, I2C, UART2, Window WDG, Independent WDG, ADC1,
AWU timer, Beeper.
Is this all?
I could not find the clock peripheral configuration function for Window WDG, Independent WDG, Beeper in the Standard Peripheral Library.
Is it not required?
P.S. I am new to MCU programming with a little experience on Arduino. So please forgive me if the question is foolish.
1. STM8S003K3 Discovery – the one I use for the blog is different from STM8S105…. They have different peripherals and so there will be differences in peripheral clocks…. Please check the device datasheet/STM8CubeMX for available hardware….
2. WWDG and IWDG are set in option bytes and they don’t use peripheral/CPU clock…. Their oscillator is separate…. Due to these they don’t have clock configurations like other peripherals….
P.S: No question is a noob question…. every question is allowed no matter how silly it may look….
Thank You
Hi please someone tel me where can i find stm8s_delay.h and stm8s_delay.c
Thanks
Check the inc and src folders….
There is not . Could you send me please if you have it.
Aminassadi.og@gmail.com
mail sent….
please, send me too the library delay
Hi , please someone tel me . Where can i find stm8s_delay.h and stm8s_delay.c
Thanks ..
i am using stms003f3p6 controller..i have done as u told exactly but tim1 input capture is not displaying any value …according to your article it should display 10…i dont have any errors everything is fine…pulse on tim2 is ok ..it is coming as u said…but capture not working..please help me …thank you…
In STM8S003F3P6, TIM1 input capture CH1 is located in PC6 instead of PC1. Did you check this out?
i changed that too..but no response tim2- 50hz as u said..but tim1 ch1 pc6 not capturing …still 000000 on lcd..
Send me your full code so that I can check and debug it….
Hi Sir,
i have just follwed your instruction provied in yout tutorial in main.c
#include “stm8s.h”
main()
{
while (1);
}
This error comes, can you please check why this error come, i am new and learn the controller programming.
main.c:
The command: “cxstm8 -i”d:\other datasheet\new folder\lib\stm8s_stdperiph_lib\libraries\stm8s_stdperiph_driver\inc” +debug -pxp -no -l +mods0 -pp -i”C:\Program Files (x86)\COSMIC\FSE_Compilers\CXSTM8\Hstm8″ -clDebug\ -coDebug\ main.c ” has failed, the returned value is: 1
exit code=1.
main.o – 2 error(s), 0 warning(s)
Thanks,
Perhaps you should recheck according to this video: https://www.youtube.com/watch?v=sqCuSVjevrY
Hi there, i solve the previous ADC problem. Anyway, u make some good tutorial on stm8 chips. Nice work
What was causing that issue? How did you solve it?
because i put all these
ADC_DeInit(ADC1);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_4Cycles);
ADC_SchmittTriggerConfig(ADC1, ADC_Channel_7, DISABLE);
ADC_ChannelCmd(ADC1, ADC_Channel_7, ENABLE);
ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);
ADC_Cmd(ADC1, ENABLE);
ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_None, ADC_ExtTRGSensitivity_All);
in ‘while(1)’. It keeps looping.
Once i put it before ‘while (1)’, it becomes normal.
lol, sorry im noob
Hi there, thanks for sharing. I learn alot thru your example, but I have encounter a problem with adc. Im currently using stm8l151k4t6. I wanna use the pin D7 as to read the voltage from my battery and monitor it (display on LCD). Can u please check where it goes wrong on my code?
ADC_DeInit(ADC1);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_4Cycles);
ADC_SchmittTriggerConfig(ADC1, ADC_Channel_7, DISABLE);
ADC_ChannelCmd(ADC1, ADC_Channel_7, ENABLE);
ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);
ADC_Cmd(ADC1, ENABLE);
ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_None, ADC_ExtTRGSensitivity_All);
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
battery = ADC_GetConversionValue(ADC1);
The adc library is here. Really appreciate your help
http://www.codelooker.com/codea/21515470915STM8L15xrefrencecode/stm8l15x_adc.c.html
What error or issue are you encountering?
Thanks.
LOL my bad, i did not mentioned what error. Basically the lcd is still displaying 4095 which is (2^12)-1, no matter what my voltage is at. I think the pin d7 is not read by the microcontroller
That’s because you are not clearing ADC conversion complete flag after reading the ADC data….
actually i did. U mean this line ?
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
It is still the same. I not really sure why. Can ADC1 works with several input ?
Did you enable the clock for the ADC module?
CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC1, ENABLE);
yes I did enable the clock for the ADC module too. Basically i noticed that the pin is like not read by the microC. It just display the bits that I set. when I put 8 bit, it shows 255, 10 bits it show 1023 and so on.
hi shawon great tutorials it would be nice too if you covered the coide compiler for arm it’s a good free compiler
I have plans to cover STM32 with STM32 System Workbench and STM32CubeMX….
hi shawon thanks for your response and support it turns out that my problem was a license issue I stupidly thought i use one license on multiple pc’s I used the license for a particular computer for mine that’s why I’ve been having compilation issues you have to use the license file stm8 sends you that is generated by your own pc else it won’t compile it’ll jus kip throwing you errors
It seems that you didn’t follow my instructions completely…. I found some issues:
1. You have included header and source files of ADC2, CAN, UART2, etc which are unavailable in STM8S103…. Add only files for the peripherals available in your target MCU…. Exclude the rest….
2. You have not included stm8s_delay header and source files…. Either disable it from stm8s_conf.h header file if you are not going to use it or add both the header and the source files for it in your project….
Resolve these and you are good to go….
Thanks….
I haven’t compiled any of the examples yet I just tried to compile the main source file just for test purpose n it just keeps showing me the same errors
yes the comic compiler was installed properly i even received a license file from my mail with the instructions to copy the license file to the license folder in the install directory if you fail to do this it will keep popping up for you to put in the license file. iincluded all the source files and header files as instructed i am working with the cheap stm8s103f i uncommented the stm8s103f in the stm8.h header file as you instructed and just to compile the main file it just throws me errors
Send me your project files and folder…. Let me see what’s going on….
no I just followed your instructions I just compiled it after setup i did not write any code yet just compiled the default main file
Need more details….
1. The version of STVD and Cosmic
2. Which example is giving this issue?
3. The chip you are using if it other than STM8S003
4. Have you tried to compile something else other than my examples?
5. Are the paths to libraries and other folders properly added?
6. Is the Cosmic compiler registered properly?
it throws this line The command: “cxstm8 -iinc +debug -pxp -no -l +mods0 -pp -i”C:\Program Files (x86)\COSMIC\FSE_Compilers\Hstm8″ -clDebug\ -coDebug\ main.c ” has failed, the returned value is: 1
exit code=1.
It is because you are making a simple silly mistake like a missing argument or semicolon somewhere in your code….
hi I’m having compilation issues when I compile it just throws me error about comic compiler located in the program file ialso excluded unwanted header files but my problems still weren’t solved
hi thanks for the tutorials but i am having compiler error issues even when I remove unnecessary header files it say comic compiler error
Hi. What does the error state?
I am new to STM8S003k3 Discovery board.I have done UART communication using STM standard peripheral library example. Now I want to define any other GPIO pin for UART communication. Is it possible to use d0 and d1 pin for the UART communication? If yes, then please let me know how?
It is possible to use any GPIO for UART communication using software UART. You’ll need to take care of character timings on your own using a timer.
thank you very much for this article!
Thank you for your time and effort.
Good job bro
Thank you for this exceptionally comprehensive article, much appreciated
Rando!
You are welcome….