قبلا توی مقاله ای تحت عنوان ” کدام کامپایلر برای میکروکنترلر STM8 بهتر است ؟ ” به بررسی کامپایلر های موجود برای میکروکنترلر STM8 پرداختیم ؛ از مجموع مباحث مطرح شده در خصوص یک کامپایلر خوب به جمع بندی رسیدیم که کامپایلر SDCC با توجه به امکانات و قابلیت هایی که دارد برای کار با این میکروکنترلر یک کامپایلر خوب و قابل قبول است. اما سوالی که مطرح میشود این است که چطور می توانیم از این کامپایلر استفاده کنیم ؟ از این کامپایلر هم میتونیم مثل باقی کامپایلر ها استفاده کنیم با این تفاوت که برای این کامپایلر پلاگین خوبی با ادیتور های موجود ارائه نشده و مجبوریم که از Makefile برای کامپایل استفاده کنیم.
پس با سیسوگ همراه باشید که هم نحوه کار با کامپایلر SDCC را بیاموزید هم این که چطور از Makefile در کامپایل پروژه ها استفاده کنیم.
گام اول نصب کامپایلر SDCC
قبل از هر کاری برای شروع لازم است که ابزار های لازم را تهیه و بهینه سازی کنید ، منطقا چون قراره که از SDCC استفاده کنیم لازم است که اونو نصب کنیم ؛ برای دانلود این کامپایلر باید آخرین ورژنش رو از سایت sf.net دانلود کنید ؛ برای دانلود کامپایلر SDCC روی این لینک کلیک کنید ؛ اگر نتونستید از خود سایت sf دانلود کنید بدونید که بدلیل تحریم هاست و میتونید از سرویس شکن که برای دور زدن تحریم ها طراحی شده استفاده کنید.
همونطور که اطلاع دارید نصب نرم افزار کار سختی نداره و فقط کافیه چند تا Next بزنید و در آخر Finish مثل همه نصب های دیگه کامپایلر SDCC نیز هیچ چیز اضافه ای برای نصب نداره.
برای اطمینان از نصب صحیح کامپایلر SDCC خط فرمان رو باز کنید و دستور زیر رو داخل آن وارد کنید :
1 | sdcc -v |
و باید خروجی زیر رو دریافت کنید:
1 2 | SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.8.0 #10562 (MINGW64) published under GNU General Public License (GPL) |
اگر چنین خروجی را دریافت کردید ؛ یعنی نصب به خوبی انجام شده و الان آماده اید که به مرحله بعد بروید ؛ فقط دقت داشته باشید که از ورژن 3.8.0 کامپایلر SDCC استفاده کنید.
نصب و پیکربندی Eclipse :
برای این که بتونیم برنامه های بلند رو با کمترین دردسر بنویسیم و مدیریت کنیم لازم داریم که از یک ویرایشگر حرفه ای استفاده کنیم ؛ ویرایشگرهای زیادی وجود دارند که میتونیم برنامه رو با اونها بنویسیم ، اما در این پست قصد داریم از Eclipse برای این منظور استفاده کنیم ! همانطور که قبلا هم گفتم Eclipse یکی از بهترین ابزار های برنامه نویسی است که به کمک IBM ایجاد شد و هم اکنون در زمره بهترین ادیتورها است.
برای نصب eclipse لازمه که اول جاوا را نصب کنید بعد eclipse را از سایتش دانلود کنید و … ؛ آموزش تمام مراحل نصب eclipse را می توانید در سری آموزشی آموزش رزبری پای، پست ” آموزش برنامهنویسی با رزبری پای بدون سیستمعامل – قسمت چهارم ” در قسمت “چطور eclipse را نصب کنیم ” پیدا کنید.
بعد از نصب Eclipse لازمه که ابزار Make رو هم نصب کنید که آموزشش توی همون لینک هست با عنوان ” نصب ابزار های لینوکسی ” .
با نصب make در واقع سیکل نصب ابزار های لازم رو به اتمام رسوندیم و حالا لازمه که اولین برنامه خودمون رو بنویسیم !
MakeFile چیست و به چه دردی میخوره ؟
خوب اصلا این makefile که میگیم چی هست و دقیقا به چه دردی میخوره ؟ ؛ همونطور که میدونید قویترین ابزار برنامه نویسان برای جلوگیری از پیچیده شدن بیش از حد برنامه ؛ استفاده از روش برنامه نویسی ماژولار است ، در روش برنامه نویسی ماژولار برنامه به تیکه های کوچیک تقسیم میشه و در انتها با چسباندن این تیکه های کوچک برنامه اصلی ساخته میشه ؛ اما چسباندن و کامپایل کردن تیکه های مجزای برنامه کار سخت و پر اشتباهی است.
اینجاست که ابزار make وارد میشه ؛ در واقع این ابزار برای خودکار سازی این فرایند طراحی و ساخته شده ؛ در یک نگاه کلی، make فقط برای کامپایل برنامهها استفاده نمیشود. شما میتوانید در هر کاری که در آن نیاز به بروزرسانی بعضی فایلها متناسب با تغییر در فایلهای دیگر است از make استفاده کنید.
روند انجام تمام جزئیات رو توی یه فایل ذخیره میکنیم که بهش makefile گفته میشه ؛ به زبان ساده تر در واقع makefile یه سری دستور العمل است که برای داشتن خروجی لازمه که انجام بشه ؛ و ابزار make اون دستور ها رو پشت سر هم اجرا میکنه !
همونطور که می بینید makefile اصلا چیز ترسناکی نیست و خیلی هم دوست داشتنی است ، برای داشتن دید بهتر نسبت به makefile به صفحه wiki آن مراجعه کنید.
ساخت اولین برنامه برای STM8 با استفاده از SDCC :
اولین قدم برای ایجاد اولین برنامه ساخت پروژه است ؛ برای این کار از گزینه File در Eclipse زیر منوی New را انتخاب کنید و گزینه C Project را انتخاب کنید.
بعد از انتخاب C Project پنجره ای ظاهر می شود که باید در آن نام و نوع پروژه مورد نظر خود را انتخاب کنید. همانطور که مشخص است هر اسم دلخواهی را که دوست دارید انتخاب کنید و نوع پروژه را حتما باید از نوع Makefile انتخاب کنید.
برای اضافه کردن makefile نیاز نیست کار خاصی انجام دهید ؛ تنها کافیه بر روی اسم پروژه که به شکل یک پوشه نمایش داده میشه راست کلیک کنید و از گزینه New زیر منوی file را انتحاب کنید.
بعد از انتخاب file پنجره ای ظاهر می شود که در آن باید اسم فایل جدید را انتخاب کنید ، نام makefile را انتحاب کنید و دکمه finish را بزنید.
بعد از ساخت فایل makefile بر روی آن دابل کلیک کنید و محتوای زیر را در آن کپی کند :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | # Makefile for STM8 with SDCC compiler # Author: Zeus # Website: sisoog.com # Copyright 2019 # LICENSE: MIT .PHONY: all clean #Compiler CC = sdcc OBJCOPY = objcopy SIZE = stm8-size MKDIR = mkdir RM = rm -f #Platform PLATFORM = stm8 #Product name PNAME = main #Output directory for intermediate and final compiled file(s) ODIR = bin #Directory for helpers IDIR = StdPeriphLib/inc SDIR = StdPeriphLib/src # In case you ever want a different name for the main source file MAINSRC = $(PNAME).c ELF_SECTIONS_TO_REMOVE = -R DATA -R INITIALIZED -R SSEG -R .debug_line -R .debug_loc -R .debug_abbrev -R .debug_info -R .debug_pubnames -R .debug_frame # These are the sources that must be compiled to .rel files: EXTRASRCS = \ $(SDIR)/stm8s_clk.c \ $(SDIR)/stm8s_gpio.c \ HEADERS = # The list of .rel files can be derived from the list of their source files RELS = $(EXTRASRCS:.c=.rel) INCLUDES = -I$(IDIR) -DUSE_STDPERIPH_DRIVER CFLAGS = -m$(PLATFORM) -Ddouble=float --std-c99 --nolospre --opt-code-size ELF_FLAGS = --out-fmt-ihx --debug LIBS = # This just provides the conventional target name "all"; it is optional # Note: I assume you set PNAME via some means not exhibited in your original file all: $(PNAME) # How to build the overall program $(PNAME): $(MAINSRC) $(RELS) @$(MKDIR) -p $(ODIR) $(CC) $(INCLUDES) $(CFLAGS) $(ELF_FLAGS) $(LIBS) $(MAINSRC) -o $(ODIR)/ $(wildcard $(ODIR)/$(SDIR)/*.rel) # How to build any .rel file from its corresponding .c file # GNU would have you use a pattern rule for this, but that's GNU-specific %.rel: %.c $(HEADERS) @$(MKDIR) -p $(ODIR)/$(SDIR) $(CC) -c $(INCLUDES) $(CFLAGS) $(ELF_FLAGS) $(LIBS) -o$(ODIR)/$(SDIR)/ $< # Suffixes appearing in suffix rules we care about. # Necessary because .rel is not one of the standard suffixes. .SUFFIXES: .c .rel hex: $(OBJCOPY) -O ihex $(ELF_SECTIONS_TO_REMOVE) $(PNAME).elf $(PNAME).hex # flash: # stm8flash -cstlinkv2 -pstm8s105?6 -w$(PNAME).ihx clean: @echo "Cleaning files..." @$(RM) $(ODIR)/$(SDIR)/*.* @$(RM) $(ODIR)/*.* @echo "Done." |
در واقع محتوای فوق لیست کارهایی است که برای کامپایل پروژه لازم است انجام شود. حالا نوبت اضافه کردن main.c است ؛ برای این کار کافی است مطابق قبل بر روی نام پروژه راست کلیک کنید و گزینه new را انتخاب کنید اما این بار گزینه Source File را انتخاب کنید .
و در قسمت انتخاب نام main.c را بنویسید ؛
حالا درون فایل main.c کد زیر را وارد کنید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include "stm8s.h" #include <stdint.h> void main (void) { GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOC); GPIO_Init(GPIOC, GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOD, GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_FAST); for(;;) { GPIO_WriteReverse(GPIOC,GPIO_PIN_3); GPIO_WriteReverse(GPIOD,GPIO_PIN_3); for(uint32_t i=0;i<100000;i++); } } |
برای اضافه کردن کتابخانه های STM8 به پروژه ابتدا فایل StdPeriphLib را دانلود کرده و از حالت فشرده خارج کنید ؛ بر روی پوشه StdPeriphLib کلیک کرده رو آن را کپی کنید سپس بر روی نام پروژه در Eclipse راست کلیک کنید و از منوی ظاهر شده گزینه Paste را انتخاب کنید ؛ با این کار پوشه به پروژه اضافه خواهد شد ؛ و در نهایت تصویری مطابق تصویر زیر خواهید داشت :
🙂 واقعا کی فکرشو میکرد اضافه کردن کتابخانه به Eclipse اینقدر ساده باشه ؟! حالا نوبت اضافه کردن مسیر کتابخانه های استاندارد هستش برای این کار بر روی پروژه راست کلیک کنید و گزینه properties را انتخاب کنید ؛ در پنجره ظاهر شده منوی C/C++General را باز کنید و زیر گزینه Preprocessor Include path را انتخاب کنید سپس گزینه GNU C و بر روی CDT User Setting Entries کلیک کنید و سپس دکمه Add را بزنید.
اگر SDCC را در مسیر پیشفرض خود نصب کرده باشید ؛ آدرس کتابخانه های آن به شکل زیر خواهند بود :
1 | C:\Program Files\SDCC\include |
در پنجره باز شده ؛ مطابق عکس زیر تنظیمات را انجام دهید و کلید Ok را بزنید !
حالا همه چی برای کامپایل آماده است و تنها کافی است برای کامپایل پروژه کلید ctrl+B را بزنید ؛ در قسمت پایین Eclipse احتمالا پیام های زیر به نمایش در میآیند که نشان از کامپایل شدن پروژه دارند.
و اگر خطایی مشاهده نکردید یعنی تمام قسمت ها به درستی انجام شده اند و فایل خروجی ایجاد شده است.
فایل خروجی کجاست ؟
اما فایل خروجی با چه فرمتی و در کجا ایجاد می شود ؛ بعد از کامپایل پروژه پوشه bin به لیست پوشه های پروژه اضافه خواهد شد ؛ که فایل خروجی با فرمت hex در این پوشه قرار دارد و به سادگی با راست کلیک بر روی آن می توانید آن را کپی کنید.
سلام وقتتون بخیر
من دنبال یه آموزش خوب برای یادگیری makefile هستم. لینک “اگر علاقه مندید در خصوص نوشتن makefile مهارت کسب کنید این لینک را مطالعه کنید.” ظاهرا کار نمیکنه. اگه ممکنه آدرسش رو بروز کنید یا یک منبع معرفی کنید. باتشکر
سلام دوست عزیز روزتون بخیر
لینک رو به یک منبع خوب تغییر دادم 🙂
متشکرم برای تذکر شما 🙂
با درود.
سپاس بابت مطلالب خوبتان .
3 تا سوال .
1 – چطور میشه در کمپایلر sdcc توابع از نوع weak تعریف کرد ؟( ظاهرا __attribute _((weake)) رو نمیشناسه )
2- توی کتابخانه spl که شما ارائه دادی دو فایل مربوط به وقفه ها وجود داره stm8s_itc.h و stm8s_it.h که دومی توی یه نسخه هایی نیستش.
ماجرای این دومی چیه ؟
3 – آیا راهی هست که روتتینهای وقفه هار و در جایی به غیر از فایل main.c نوشت ؟
سلام
لطفا راه اندازی eclipse و SDCC رو توی لینوکس (من از ubuntu استفاده میکنم) آموزش بدین خیلی سعی کردم اما نتونستم.
یا راه دیگه ای که بشه توی لینوکس برای stm8 ها برنامه نویسی کرد.
تنها راهی که دیدم از طریق نصب SDCC توی ترمینال و برنامه نویسی توی خود ترمینال بود که برای پروژه های بزرگتر خیلی سخت و خسته کننده میشه.
ممنون
سلام دوست عزیز
فکر میکردم به سادگی بشه با استفاده از VScode ازش استفاده کرد.
طرف اش رو با جاش کپی کرده
لینک حذف شده است.
بله قبلا هم دیده بودم
و متاسفانه حاضر نبوده لینک منبع بزاره
سلام
ممنون جناب zeus برای آموزش خوبتون
من آخرش نتونستم با eclips کار کنم و مجبور شدم برم سراغ codeblocks
الان به کمک فایل spl که شما زحمت کشیدین بزارین تونستم کار کنم هم با 103k3 و هم با 105k4
الان دو تا مشکل هست
اول اینکه با توجه به اینکه ورژن spl شما 2.2.0 هست میخوام با کمک فایل patch که تو گیت هاب هست spl ورژن 2.3.0 رو اماده کار با sdcc کنم که هر چقدر تلاش کردم تو اوبونتو آخرش نتونستم این کار رو بکنم اگه ممکنه آموزش این کار رو بفرمایید یا خودتون زحمت patch کردن رو بکشین
دوم اینکه در مقایسه با iar و cosmic (البته در cosmic بعد از تغییرات در نوع ذخیره سازی توابع) حجم کد خروجی sdcc بشدت بیشتره من همه فلگهای لازمه رو هم فعال میکنم ولی مثلا یه کد در iar یا cosmic برای 105k4 کمتر از 16 کیلو میشه ولی همون کد در sdcc به حدی بیشتر میشه که دیگه رو میکرو جا نمیشه و باید برم سراغ 105k6 آیا نکته خاصی برای کاهش حجم کد وجود داره؟
با تشکر
سلام دوست عزیز خواهش میکنم
والا من خودم با این خانواده از میکروکنترلر چندان کار نکردم هر چند با قیمت های اخیر به نظر میرسه استفاده ازش اجتناب ناپذیر میشه
در مورد پچ کردن دقیقا چطور عمل می کنید و چه اتفاقی می افته که میگید نمیشه ؟ یعنی خطا میده موقع پچ کردن یا اتفاق دیگه ای می افته ؟
در مورد حجم کد خروجی فکر میکنم باید دنبال کلیدی بگردید که به لینکر بگه توابعی که مورد استفاده قرار نگرفته اند رو حذف کنه به شکل پیش فرض فعال نیست و همین باعث میشه حجم کد خیلی زیاد بشه
سلام ممنون از آموزش خوبتون
فقط اگه امکانش هست نحوه patch کردن نسخه ۲.۳ spl رو راهنمایی بکنید تو اوبوتو
چون به لینوکس آشنایی ندارم
با تشکر
سلام دوست عزیز
تاحالا خودم هم انجامش ندادم کاملا
سلام خسته نباشید
بنده کد رو اجرا کردم، تمام مراحل رو هم درست انجام دادم، اما با این خطا مواجه شدم.
Error: Program “make” not found in PATH
سلام – سیمولاتورش را چطوری میشه فعال کرد.
تا حالا فعال نکردم ولی فکر میکنم قابلیت دیباک با gdb داشته باشه 🙂
سلام .
سپاس بابت مطالب بسیار خوبتون.
این مطلب خیلی به دردم خورد . حتی همین مراحل رو من برای avr ( با میک فایل مخصوص AVR ) در یک نرم افزاری به اسم True studio ( که ide اون اکلیپس هست ) انجام دادم و به خوبی کار کرد .برای stm8 با میک فایل شما موفق نشدم چون خطا میداد . یک میک دیگه استفاده کردم و مسیر ها رو بهش اضافه کردم.به خوبی کمپایل شد .
اما الان بعد از مدتی که دوباره پروژه رو کمپایل میکنم یک خطای make میده .
make: *** [StdPeriphLib/src/stm8s_clk.rel] Error 2
چند ماه پیش این مشکل رو نداشت .
با خود اکلیپس ( نسخه مارس 2) امتحان کردم باز هم همین مشکل وجود داشت .
ممکنه از تنظیمات باشه ؟ راه حلش چیه ؟
در یکی از کامنتها نوشته بود علتش ویروس هست . آیا صحت داره ؟
من روی سیستمم نود32 لایسنس دار هست چیزی نشون نمیده.
سپاس .
فکر میکنم کتابخانه های st توی آپ دیت های جدیدش یه چیزی رو تغییر داده که با این کامپایلر هم خوان نیست
و باید پچش کرد تا هوخوان بشه – احتمالا در موردش باید یه مقاله بنویسم
از نسخه قدیمی کتابخانه استفاده کنید.
با درود برzeus عزیز .
راستش بعد از مدتی دوبار با make فایل همین مطلب کمپایل کردم و بدون خطا کمپایل شد .
منتها کد روی میکرو stm8105 کار نمیکنه . و حجمش هم زیاده حدود ۱۲۰۰ بایت .
برای اطمینان منوال sdcc رو خوندم و فایلها رو دانه دانه با خط فرمان لینوکس کمپایل کردم و سوییچ های مربوط به شروع سگمنت کد و رم را هم وارد کردم کد هگز بدون مشکل تولید شد . ولی باز هم روی میکرو کار نکرد و حجمش هم حدود ۱۲۰۰ بایت شد .
توی نت چرخیدم .و یک نمونه پروژه پیدا کردم که عالی کار کرد و حجم کد هگز هم ۲۵۰ بایت شد!!
منتها اصلا نفهمیدم چی کار کرده و ضمنا از یک اسکریپت لینوکسی هم استفاده کرده .
که من چون آشنا نیستم متوجه نشدم چیکار کرده !!
لینک پروژه اینه :https://github.com/riktw/stm8s_makefile
اگر ممکن هست یک نگاهی به بندازیدو راهنمایی بفرمایید .
۲− چطور میشه makefile رو در خ فرمان لینوکس اجرا کرد ؟
س\اس.
سلام مجدد وقتی از توابعgpio استفاده کردم بدون هیچ مشکلی برنامه کار میکنه اما وقتی تو برنامه اصلی میخوام از وقفه ها استفاده کنم به توابع ارور میده و کامپایل نمیشه مثلا به توابع زیر:
EXTI_SetExtIntSensitivity(GPIOA, EXTI_SENSITIVITY_FALL_ONLY);
حتی به makefile دستور $(SDIR)/stm8s_exti.c \ رو هم اضافه کردم اما مشکل حل نشد
ارور زیر رو میده
make: *** [Makefile:55: main] Error 1
error 78: incompatible types
سلام من همین کار رو برروی نرم افزارstm32cube ide انجام دادم که با makefile وsplشما بدون مشکل بود اما با splسال 2017موفق نشدم که خروجی بگیرم و یک ارور داد
make: *** No rule to make target ‘StdPeriphLib/src/stm8s_clk.rel’, needed by ‘main’. Stop.
میک فایل های متعددی هم تست کردم اما همچنان ارور میداد.
نکته دوم اینکه چجوری از داخل خود نرم افزار برایstm8 دیباگ و پروگرام رو انجام بدیم ..ممنونم
ممنون برای اطلاعاتتون :))
والا تا حالا انجامش ندادم ولی فکر میکنم با مقداری سرچ بتونید این کار رو انجام بدید.
دوستان یک تجربه برای کسانی که تو ویندوز با کامپایلر sdcc و eclipse کار میکنند .علت یکی از خطاهای make ,البته بعد از اینکه متوجه شدین همه چی مرتبه . ویروس read only است.چون make در حین کامپایل پوشه میسازه و پوشه های شما read only است make به مشکل میخوره.
و راه چاره هم استفاده از لینوکس است.البته میتونید تو ویندوز با cygwin ایکلیپس رو بالا بیارید.که جواب میده.
سلام .
من روی سیستمم نود32 با لایسنس معتبر دارم . ویروس شناسایی نمیکنه . چطور میشه این ویروس رو شناسایی کرد ؟
چط.ر میشه از بین بردش؟
سپاس.
فکر نمیکنم مشکل از ویروس باشه !احتمالا جایی داره چیز دیگه ای مساله ایجاد میکنه – از متن خطا میتونید متوجه بشید.
سلام زئوس گرامی .
راستش من توی یک کامنت ماجرا را کامل توضیح دادم ولی ظاهرا نمایش داده نشده !!!!
خلاصه ماجرا اینه که قبلا( چند ماه پیش) بدون مشکل کمپایل کردم و فایل هگز تولید شد . و الان دوباره همون پروژه رو باز کردم و بدون اینکه تغییری بدم فقط دوباره کمپایل کردم و این خطا رو میده
make: *** [StdPeriphLib/src/stm8s_clk.rel] Error 2 و فایل stm8s_clk.c هم توی پروژه هستش .
ظاهرا خطا توی میکفایل ایجاده شده ولی من اصلا میک رو تغییری ندادم !!!!!! همانطور که قبلا گفتم فقط دوباره کمپایل کردم. طبق فرمایش شما هم ک ویروس نیست !!
لطفا اگر ممکن هست یک مقدار توضیح بدید ؟
سپاسگزارم .
فکر کنم لازمه در این خصوص به مقاله دیگه بنویسم – ظاهرا دوستان زیادی با این مساله مشکل دارند 😐
سپاس لطف دارید .
شاید تنها کاری که انجام دادن این بود که طبق قسمت چهارم مطلب ” برنامه نویسی رزبری پای بدون سیستم عامل ” اکلیپس و اون ابزار لینوکسی رو نصب کردم !!!!
حالا نمیدونم میتونه ربط داشته باشه یا نه !
نه فکر نمیکنم ربطی داشته باشه
سلام .
بعد از کمپایل خطا میده و پوشه bin به حالت read only در میاد .
من چند بار دستی از اینحالت خارجش کردم ولی دوبار به حالت read only میره .
این که طبیعی نیست درسته ؟
سلام – آیا این فقط خواندنی شدن مشکل ایجاد میکنه به نحوی که دوباره نمیشه برنامه رو کامپایل کرد ؟ بله غیر طبیعی میشه ولی اگه میشه مجددا کامپایل کرد مشکلی نیست و منطقیه
من نمیدونم این مساله چه مشکلی برای شما پیش آورده که بتونم در مورد مشکل بودن یا نبودنش نظر بدم.
با سلام زئوس گرامی .
ظاهرا مشکل از ویروس ویندوز نیست من روی لینوکس عم تست کردم مشکل داشت .
در مورد readonly :
با mkdir از طریق خط فرمان windows7 یک پوشه درست کردم که ون هم readonly بود ولی داخلش یک فایل وورد ایجاد کردم .
احتمالا مشکل از جای دیگه است و به ویروس و این چیزا ربط نداره .
شما به نتیجه ای نرسیدی؟
سلام .
دقیقا مشکل اینجاست که چون read only میشه . فایل هگز کمپایل شده نمیتونه درون پوشه bin قرار بگیر .
من چند بار از حالت فقط خواندنی خارجش کردم ولی انگار موقع کمپایل کردن read only میشه !!!!.
سلام موقع استفاده از SDCC.
void timer1_CAP_isr(void) __interrupt(12) {
نمیتونم از اینتراپت استفاده کنم.خطای :
Unused declaration of function ‘timer1_CAP_isr’
رو گزارش میکنه.
البته تو فایل stm8s_it.c,stm8s_it.h هم همین مشکل رو دارم.
سلام فکر میکنم خطا مربوط به این باشه که تابع روتین که فراخوانی کردید تعریف نشده !!
سلام
من خطای زیر رو دریافت میکنم:
15:23:25 **** Incremental Build of configuration Default for project stm8_test ****
make all
makefile:55: *** missing separator. Stop.
“make all” terminated with exit code 2. Build might be incomplete.
15:23:25 Build Failed. 1 errors, 0 warnings. (took 118ms)
———————————————————–
چندین بار همه فایل رو کپی کردم ولی مشکلم بر طرف نشد.
اینم فایل های داخل makfile:
# Makefile for STM8 with SDCC compiler
# Author: Zeus
# Website: sisoog.com
# Copyright 2019
# LICENSE: MIT
.PHONY: all clean
#Compiler
CC = sdcc
OBJCOPY = objcopy
SIZE = stm8-size
MKDIR = mkdir
RM = rm -f
#Platform
PLATFORM = stm8
#Product name
PNAME = main
#Output directory for intermediate and final compiled file(s)
ODIR = bin
#Directory for helpers
IDIR = StdPeriphLib/inc
SDIR = StdPeriphLib/src
# In case you ever want a different name for the main source file
MAINSRC = $(PNAME).c
ELF_SECTIONS_TO_REMOVE = -R DATA -R INITIALIZED -R SSEG -R .debug_line -R .debug_loc -R .debug_abbrev -R .debug_info -R .debug_pubnames -R .debug_frame
# These are the sources that must be compiled to .rel files:
EXTRASRCS = \
$(SDIR)/stm8s_clk.c \
$(SDIR)/stm8s_gpio.c \
HEADERS =
# The list of .rel files can be derived from the list of their source files
RELS = $(EXTRASRCS:.c=.rel)
INCLUDES = -I$(IDIR) -DUSE_STDPERIPH_DRIVER
CFLAGS = -m$(PLATFORM) -Ddouble=float –std-c99 –nolospre –opt-code-size
ELF_FLAGS = –out-fmt-ihx –debug
LIBS =
# This just provides the conventional target name “all”; it is optional
# Note: I assume you set PNAME via some means not exhibited in your original file
all: $(PNAME)
# How to build the overall program
$(PNAME): $(MAINSRC) $(RELS)
@$(MKDIR) -p $(ODIR)
$(CC) $(INCLUDES) $(CFLAGS) $(ELF_FLAGS) $(LIBS) $(MAINSRC) -o $(ODIR)/ $(wildcard $(ODIR)/$(SDIR)/*.rel)
# How to build any .rel file from its corresponding .c file
# GNU would have you use a pattern rule for this, but that’s GNU-specific
%.rel: %.c $(HEADERS)
@$(MKDIR) -p $(ODIR)/$(SDIR)
$(CC) -c $(INCLUDES) $(CFLAGS) $(ELF_FLAGS) $(LIBS) -o$(ODIR)/$(SDIR)/ $<
# Suffixes appearing in suffix rules we care about.
# Necessary because .rel is not one of the standard suffixes.
.SUFFIXES: .c .rel
hex:
$(OBJCOPY) -O ihex $(ELF_SECTIONS_TO_REMOVE) $(PNAME).elf $(PNAME).hex
# flash:
# stm8flash -cstlinkv2 -pstm8s105?6 -w$(PNAME).ihx
clean:
@echo "Cleaning files…"
@$(RM) $(ODIR)/$(SDIR)/*.*
@$(RM) $(ODIR)/*.*
@echo "Done."
سلام دوست عزیز
خطا داره میگه که ظاهرا توی خط ۵۵ میکفایل سپریتور اشتباه شده – احتمالا موقع کپی مشکلی پیش اومده چک کنید.
با تشکر از تلاش شما. بنده هنوز وقت نکردم ihx رو روی stm8s بریزم چون برد شرکته اما نکته ای توجه منو جلب کرد. محتوی hex فایل تولید شده بسیار بیشتر از فرمت موتورلا s19 هست و حتی پس از لود کرد فایل جهت فلش میکرو توسط st visual programmer محتویات متفاوت بود. بنده فلگ –out-fmt-ihx رو به –out-fmt-s19 تغییر دادم اما باز هم نتونستم خروجی مشابه فایل s19 نرم افزار cosmic بگیرم. با توجه به رایگان بودن cosmic فقط برای یکسال نمیخام از از این کامپایلر استفاده کنم. تجربیات شما رو میخاستم بدونم که آیا Makefile ای هست که فرمت s19 مشابه cosmic کم حجم تولید کنه؟ البته از srec هم استفاده کردم اما S19 تولید شده متفاوت بود که نشون میده خود کامپایلر هست که متفاوته!
سلام دوست عزیز
فایل ihx در واقع فرمت hex اینتل رو داره و توی هر سطر از آدرس دهی دارای آدرسی و چک سام هست و البته دیتاها رو به شکل استرینگ ذخیره میکنه برای همین حجمش نسبت به فایل های باینری نظیر s19 موتورولا بیشتر ولی این بدان معنی نیست که حجم بیشتری رو روی فلش میکروکنترلر خواهد گرفت 😐
در نهایت هنگام پروگرام کردن تبدیل به فرمت باینری میشه – فرمت هگز برای جابجایی از کامپیوتر به کامپیوتر دیگر خیلی بهتره چون چک سام داره
و این که نمیشه انتظار داشت خروجی دو کامپایلر متفاوت مثل هم باشه چرا که الگورتیم های متفاوتی رو احتمالا رعایت میکنند
طلق مستندات sdcc برای گرفتن خروجی s19 باید دستور –out-fmt-s19 رو اضافه کنید و همین کفایت میکنه – اگر نمیشه باید خطایی بده بهتون – اون خطا چیه ؟
ممنون دوست عزیز. منظورم از حجم کد نه خود فایل بود. فایلی که توسط پروگرامر لود میشه تو محیطش بود.درواقع ihx و s19 فرمت ذخیره سازیشون فرق میکنه اما پس از لود تو محیط پراگرمر باید محتویات یکسان نشون داده بشه که محل ذخیره داده در حافظه فلشه. منم همون قسمت خروجی که گفتین رو قبلا اضافه کرده بودم طبق یوزرمنوال sdcc اما باز دو فرمت s19 در sdcc و cosmic فرق میکرد.یه مشکلی که دارم اینکه نمیدونم چطور تعریف کنم که کد اسمبلی رو کامپایل کنه. Cosmic راحت انجام میده اما تو eclipse تو قسمت کامپایلرها فکر کنم باید اضافه شه که بتونه انجام بده
بله خوب الان متوجه منظورتون شدم – این خیلی طبیعی است که خروجی دو کامپایلر متفاوت برای کامپایل یک کد خاص متفاوت باشه چون کامپایلرها ساختار های متفاوتی دارند و استاندارد های متفاوتی رو رعایت میکنند پس نمیشه انتظار داشت که خروجی یکسانی رو ببینید اصلا خوب و بد بودن یک کامپایلر به همین موارد هست دیگه
اگه توی makefile اسمبلی رو تعریف کرده باشید موقع کامپایل انجام میشه ربطی به eclipse نداره :/
قطعا همینطوره. البته کامپایلم کردم اما ریختم stm8 کار نکرد. برای led کار میکرد عالی نمیدونم چرا سورس اصلیم با کامپایل eclipse و کامپایلر sdcc کارنکرد. فقط nrf و سنسور دما و سریال بوده هر چند خودش سه پروتکله واچداگ و… هم هست! باید کمی کار کنم روش ببینم کجا گیر کرده! اما دمتون گرم! از این کارا بازم کنید و آموزش بزارید عالیه! نمونه انگلیسی هم هست اما خوب اینجا خیلی خوب شده
خواهش میکنم
امیدوارم بتونید زودتر مشکل رو پیدا کنید.
سلام خسته نباشید
sdcc حجم زیادی نداره محبت کنید رو خود سایت آپلود کنید.
سلام دوست گرامی
sdcc رو هم به دانلود سنتر اظافه میکنیم انشالله
سلام
موقع بیلد کردن با این اخطار مواجه میشوم:
make: *** No rule to make target ‘StdPeriphLib/src/stm8s_clk.rel’, needed by ‘main’. Stop.
احتمالا make مشکل داره ؛ برای جواب کاملتر محتوای makefile و لیست کامل خطا رو ارسال کنید.
با کتاب خانه های جدید تست کردم ، متاسفانه مثل این که دیگه از کامپایلر SDCC ساپورت نمیکنه .
امم بعید میدونم واقعا اینطور باشه احتمالا تنظیمات خاصی لازم داشته باشه
میشه بگید از چه کتابخونه هایی استفاده کردید که منم تست کنم !
کتاب خونه هایی که سایت خود ST ارائه میده
خوب اینجا هم از کتابخونه های خود شرکت استفاده کردیم 😐
البته از سری SPL استفاده کردیم
حاجی اینی که شما گذاشتید ماله 2014 هست . الان از سایت st بری ماله 2017 رو بهت میده
خوب بله درست می فرمایید کتابخونه مورد استفاده ما قدیمی است ؛ سعی میکنم یا کتابخونه جدید هم یه تستی بزنم ببینم چند چند میشه قضیه
متشکر برای پیگیری
منم همین مشکل رو دارم محبت میکنید اگر حل شده راه حلشو بگید
سلام با تشکر فراوان و خسته نباشید به خاطر آموزشی کامل و جامع تان و وقت و زمانی که بابت تولید این محتوا به زبان فارسی گذاشتید
بنده مراحل را دقیقا طبق همین محتوا انجام میدهم اما با خطای زیر در کامپایل برنامه مواجه میشوم
make all
makefile:55: *** missing separator. Stop.
16:25:13 Build Finished took 393ms
ایرادی که میگرد دقیقا از این خط 55 برنامه make file است که کد آن را از همین جا برداشتم خط روبه رو –> @$(MKDIR) -p $(ODIR)
برنامه MAKE FILE را به درستی از طریق از آموزش دیگر شما” برنامهنویسی با رزبری پای بدون سیستمعامل ” نصب کردم و در کامند ویندوز ورژن آن را طبق آموزش تست کردم و آدرس دهی لازم را در propertis my computer انجام دادم
یک روز باهاش ور رفتم تو وبسایت های خارجی نوشته مشکل از کد make file است و باید MAKE FILE را تغیر داد که درست شود اما MAKE FILE شما که مطمینا درست است پس مشکل چیست !؟! MAKEFILE های دیگر را هم در اینترنت پیدا کردم و جایگزین آن کردم خطا های دیگری داد لطفا راهنمایی فرمایید
با تشکر
سلام و درود
ببخشید که دیر دارم جواب میدم ؛ احتمالا توی کپی کردن کارکتری جابجا شده
امکانش هست که makefile مورد استفاده رو جایی آپلود کنید تا من هم با میک فایل شما تست بگیرم ببینم مشکل از کجاست.
سلام زئوس جانم
سر شما خیلی شلوغه همین که پاسخ دادید خیلی لطف کردید ، خیلی محبت کردید .
چند روز منتظر جواب بودم بعد چون هر کاری میکردم درست نمیشد همه برنامه ها را پاک کردم.
بنده stm8 در محیط توسعه نرم افزاری IAR برنامه نویسی میکنم که فقط با بخش debuger آن مشکل دارم که ضعیفه و به درد نخور .
کامپایلر SDVD خود شرکت ST هم تست کردم دنگ و فنگ داشت . همچنین محیط debuger آن که گفته میشد گرافیکیه ، به نظرم تفاوت چندانی نداشت .
دیباگر کامپایلر “IDE ، “eclipse , sdcc “متن باز” که شما معرفی کردید چطوره ، آیا اصلا دیباگر داره ?!? اگر هم داره آیا به قدرت محیط توسعه مجتمع keil u vision هست !؟!
سلام دوست عزیز ؛ باید ببخشید برای تاخیر های پیش اومده ؛ واقعا یک سر و هزار سودا !!!
Eclipse که به نظرم بی نظیره هم توی دیباگ کردن و هم توی محیط ادیتوری ! ولی این که تا چه اندازه با sdcc بشه دیباگ کرد رو اطلاع ندارم متاسفانه که احتمالا یه تست میگیرم این موضوع رو و اگر نتیجه رضایت بخش بود در موردش پست می نویسیم
یک نکته هم اینه که فایل stm8.h با حروف کوچک هست و تو کد نمونه شما با حروف بزرگ اینکود شده.
و یک سوال: چرا st کتابخونه های stdperiph را از سایتش برداشته؟
فکر کنم احتمالا شاید مثل سری stm32 کتابخونه جدید براش عرضه کرده !
+ متشکر برای این نکته توی پست اصلاحش میکنیم.
با سلام و تشکر بابت اینکه برای استفاده از اکلیپس اون هم STM8 و اونم sdcc مطلب میذارید.
بنده تو ابونتو اکلیپس cdt ورژن ۲۰۱۸ را دارم و مراحلی که فرمودید را انجام دادم ولی نمیدونم داخل main یا همین for که مثال زدین متغیر نمیشه تعریف کرد و فقط درصورتی که قبل از main متغیر را تعریف کنم ارور نمیده. در صورت تعریف محلی این اتفاق میفته:
syntax error: token -> ‘uint8_t’ ; column 7
make: *** [main] Error 1
makefile:55: recipe for target ‘main’ failed
یافتم. تعریف متغیر درون حلقه در استاندارد C99 امکان پذیره. مشکل از نسخه sdcc بنده بود که از مخازن ابونتو نصب کرده بودم (آخرین نسخه ۳.۵ بود!) در نسخه ۳.۵ استاندارد C99 هنوز کامل نبوده و از نسخه ۳.۷ به بعد این امر امکان پذیر شده. از sf نسخه ۳.۹ را دانلود و نصبیدم مشکل حل شد.
بسیار عالی 🙂
خوشحالم که مشکل حل شد.
میشه اون تیکه از برنامه رو بذارید که خطا رو داره ایجاد میکنه !
البته فکر میکنم کتابخونه stdint.h رو include نکرده باشید.
باسلام
پس بهترین راه کدنویسی برای stm8 ، استفاده از ecilipse هستش؟
واقعا بهترین برای آدم های متفاوت متفاوت خواهد بود ؛ به سیلیقه من که شاید به Eclipse عادت دارم بهترین سلوشن استفاده از eclipse هست
ولی فکر میکنم بهترین کامپایلری که میشه برای stm8 پیدا کرد همین sdcc باشه !
مگه این که چیز جدیدی اومده باشه
باسلام
به نظر شما حجم کد استخراج شده در برای stm8 با این روش بهینه هست ؟ چون به عنوان مثال یک پروژه led چشمک زن با atmelstudio برای به فرض atmga8a حدودا 300 بایت بیشتر حجم نمیگیره ولی همین روال برای stm8 سه کیلو بایت هست .
سلام ؛ قائدتا حجم زیادی هست برای این کد و گمان میکنم به این دلیله که از کتابخانه های خود st استفاده کردید
از رجیستر استفاده کنید احتمالا حجم بمراتب کمتر خواهد شد.
سلام و تشکر
شما گفتید که از ورژن 3.8.0 استفاده کنیم. الان که من دانلود کردم آخرین ورژن رو 3.9.0 هست. آیا منظور شما به طور خاص ورژن 3.8.0 هست یا اینکه ورژن 3.8.0 به بعد؟
تشکر
نه لذوما ، میخواستم بگم که من از کدوم ورژن استفاده کردم ولی فکر نمیکنم ورژن های بالاتر هم مشکلی داشته باشند ؛ ممکنه ورژن های پایین تر مشکل ایجاد کنه ولی بالاتر معمولا مشکلی نداره
درود برشما
تشکر برای پاسختان.
این خطا گرفته میشه . چگونه باید حل کرد؟
10:58:58 **** Incremental Build of configuration Default for project me ****
make all
Cannot run program “make”: Launching failed
Error: Program “make” not found in PATH
PATH=[C:/Program Files/Java/jre1.8.0_201/bin/server;C:/Program Files/Java/jre1.8.0_201/bin;C:/Program Files/Java/jre1.8.0_201/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\AMD\ATI.ACE\Core-Static;C:\Program Files\dotnet\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\SDCC\bin;C:\Users\aa\Desktop\eclipse-cpp-2018-12-R-win32-x86_64\eclipse]
10:58:58 Build Failed. 1 errors, 0 warnings. (took 63ms)
جاوا برای کار دیگر مشکلی هم ندارد.
خوب اول این که دارید از ایکیپس استفاده میکنید ؟
داره میگه make رو پیدا نمیکنم ، برای ویندوز باید تولز make رو نصب کنید ؛
برای این کار اول در مقاله “آموزش برنامهنویسی با رزبری پای بدون” قسمت “نصب ابزار های لینوکسی” رو انجام بدید احتمالا مشکل حل میشه
سلام
موقع کامپایل شدن این ارور رو داد : 12:07:10 **** Incremental Build of configuration Default for project Stm8_blink ****
make all
makefile:55: *** missing separator. Stop.
“make all” terminated with exit code 2. Build might be incomplete.
12:07:10 Build Failed. 1 errors, 0 warnings. (took 316ms)
————————————————————————————————————
خطوط ارورش هم همون هایی هست که کپی پیست کردم یعنی makefile
آیا توی میک فایل تغییر دادید ؟
makefile خودتون رو قرار بدید – جایی پیست کنید و لینکش رو قرار بدید
مشکل از بنده بود . حل شد .
خیلی ممنون
خواهش میکنم دوست عزیز
خوشحالم که مشکلتون حل شده
فقط یک سوال :
راهی هست که از اکلیپس مستقیم stlink رو راه بندازیم ؟
بله راه حل وجود داره
من از کامند لاین استفاده میکنم و یه بلید تارگت میسازم برای پروژه که با انتخابش میکرو پروگرام بشه 🙂
با
STVP و sdcc هم انجام داده اید؟
نه اینو انجام ندادم چون STVP اصلا ویرایشگر قابل قبولی نیست و ارزش وقت صرف کردن رو نداره اصلا
درود برشما
آیا میتوانید از ورژن جدید Eclipse و sdcc
این روش را باز تولید کنید ؟
چون دستورات و منوها جیز دیگری شده.
با تشکر
کدوم ورژن ایکلیپس مد نظرتونه اگر 2018 منظورتونه باید بگم آره مقداری جای منو ها عوض شده ولی عملکرد همونه و به سادگی میتونید استفاده کنید ازش
به این میگن یه سایت فعال و خوب!
برقرار باشید…..
متشکرم دوست عزیز
پاینده باشید 🙂
سلام
خسته نباشید
—————————————————————
برای کار با STM8 ها مگه نمیشه از ویزارد CubeMX استفاده کرد؟؟ اون فقط برا 32 بیتی هاست ؟؟ تاحالا دقت نکرده بودم…
—————————————————————
سایت ST برا ما باز نمیشه ؟؟ واقعا ؟؟ خیلی وقته سر نزدم ….
چه میکنه این تحریم ها !! به افتخارشون بزن زنگو !!!
سلام ؛ متشکرم
خوب فکر میکنم نرم افزار مخصوص خودش رو داره ؛ stm8 Cube که از سایت St میتونید دانلود کنید
منظور من sf بود نه st ؛ sf میشه sourceforge که ما رو تحریم کرده
سلام
موقع کامپایل شدن این ارور رو داد :
sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_clk.c
makefile:62: recipe for target ‘StdPeriphLib/src/stm8s_clk.rel’ failed
process_begin: CreateProcess(NULL, sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_clk.c, …) failed.
make (e=2): The system cannot find the file specified.
make: *** [StdPeriphLib/src/stm8s_clk.rel] Error 2
سلام
در واقع کامپایلر داره میگه که فایل رو پیدا نکرده ؛ احتمالا آدرس دهی اشتباه بوده یا فایل مورد نظر در پوشه مربطه پیدا نشده
داریم در مورد فایل StdPeriphLib/src/stm8s_clk.c صحبت میکنیم
سلام .لطف میکنید تغییرات لازم برای خروجی hex رو دراین makefile اعمال کنید.
ممنون.
# STM8 device (default is STM8 discovery board)
DEVICE=STM8S003
DEVICE_FLASH=stm8s003f3
TARGETNAME = dsds
# trap handling requires SDCC >=v3.4.3
SKIP_TRAPS = 0
# set output folder and target name
OUTPUT_DIR = ./build
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).elf
# set project folder and files (all *.c)
PRJ_ROOT = .
PRJ_SRC_DIR = $(PRJ_ROOT)/Src
PRJ_INC_DIR = $(PRJ_ROOT)/Inc
# all project sources included by default
PRJ_SOURCE = $(notdir $(wildcard $(PRJ_SRC_DIR)/*.c))
PRJ_OBJECTS := $(addprefix $(OUTPUT_DIR)/, $(PRJ_SOURCE:.c=.rel))
# set SPL paths
DRIVER_DIR = ./STM8S_StdPeriph_Driver/
SPL_INC_DIR = $(DRIVER_DIR)inc
OBJLIB = $(PRJ_INC_DIR)/stm8s003.lib
OBJLIBNDB = $(PRJ_INC_DIR)/stm8s003nodebug.lib
# set compiler path & parameters
CC = sdcc
AR = sdar
ifeq ($(NODEBUG), 1)
CFLAGS =-mstm8 -l$(OBJLIBNDB) –out-fmt-ihx -DUSE_STDPERIPH_DRIVER –all-callee-saves –verbose –stack-auto –fverbose-asm –no-peep
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).ihx
else
CFLAGS =-mstm8 -l$(OBJLIB) –debug –out-fmt-elf -DUSE_STDPERIPH_DRIVER –all-callee-saves –verbose –stack-auto –fverbose-asm –no-peep
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).elf
endif
# collect all include folders
INCLUDE = -I$(PRJ_INC_DIR) -I$(SPL_INC_DIR)
# collect all source directories
VPATH=$(PRJ_SRC_DIR):$(SPL_SRC_DIR)
.PHONY: clean
all: $(OBJLIB) $(TARGET)
$(OUTPUT_DIR)/%.rel: %.c
$(CC) $(CFLAGS) -D$(DEVICE) $(INCLUDE) -DSKIP_TRAPS=$(SKIP_TRAPS) -c $? -o $@
$(TARGET): $(PRJ_OBJECTS)
$(CC) $(CFLAGS) -o $(TARGET) $^
flash: $(TARGET)
stm8flash -c stlink -p $(DEVICE_FLASH) -s flash -w $(TARGET)
$(OBJLIB):
cd STM8S_StdPeriph_Driver/src/; \
./doit; \
mv stm8s003.lib ../../Inc; \
mv stm8s003nodebug.lib ../../Inc
clean:
rm $(OUTPUT_DIR)/*
احتمالا باید همچین چیزی باشه
# STM8 device (default is STM8 discovery board)
DEVICE=STM8S003
DEVICE_FLASH=stm8s003f3
TARGETNAME = dsds
# trap handling requires SDCC >=v3.4.3
SKIP_TRAPS = 0
# set output folder and target name
OUTPUT_DIR = ./build
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).elf
# set project folder and files (all *.c)
PRJ_ROOT = .
PRJ_SRC_DIR = $(PRJ_ROOT)/Src
PRJ_INC_DIR = $(PRJ_ROOT)/Inc
# all project sources included by default
PRJ_SOURCE = $(notdir $(wildcard $(PRJ_SRC_DIR)/*.c))
PRJ_OBJECTS := $(addprefix $(OUTPUT_DIR)/, $(PRJ_SOURCE:.c=.rel))
# set SPL paths
DRIVER_DIR = ./STM8S_StdPeriph_Driver/
SPL_INC_DIR = $(DRIVER_DIR)inc
OBJLIB = $(PRJ_INC_DIR)/stm8s003.lib
OBJLIBNDB = $(PRJ_INC_DIR)/stm8s003nodebug.lib
# set compiler path & parameters
CC = sdcc
AR = sdar
ifeq ($(NODEBUG), 1)
CFLAGS =-mstm8 -l$(OBJLIBNDB) –out-fmt-s19 -DUSE_STDPERIPH_DRIVER –all-callee-saves –verbose –stack-auto –fverbose-asm –no-peep
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).s19
else
CFLAGS =-mstm8 -l$(OBJLIB) –debug –out-fmt-elf -DUSE_STDPERIPH_DRIVER –all-callee-saves –verbose –stack-auto –fverbose-asm –no-peep
TARGET = $(OUTPUT_DIR)/$(TARGETNAME).elf
endif
# collect all include folders
INCLUDE = -I$(PRJ_INC_DIR) -I$(SPL_INC_DIR)
# collect all source directories
VPATH=$(PRJ_SRC_DIR):$(SPL_SRC_DIR)
.PHONY: clean
all: $(OBJLIB) $(TARGET)
$(OUTPUT_DIR)/%.rel: %.c
$(CC) $(CFLAGS) -D$(DEVICE) $(INCLUDE) -DSKIP_TRAPS=$(SKIP_TRAPS) -c $? -o $@
$(TARGET): $(PRJ_OBJECTS)
$(CC) $(CFLAGS) -o $(TARGET) $^
flash: $(TARGET)
stm8flash -c stlink -p $(DEVICE_FLASH) -s flash -w $(TARGET)
$(OBJLIB):
cd STM8S_StdPeriph_Driver/src/; \
./doit; \
mv stm8s003.lib ../../Inc; \
mv stm8s003nodebug.lib ../../Inc
clean:
rm $(OUTPUT_DIR)/*