سلام
من از هدر برد فروشگاه استفاده می کنم.
با استفاده از کتابخانه CMSYS برخی از قسمت های میکرو را راه اندازی کردم. ولی جند مشکل برام پیش اومده:
من برنامه رو کامپایل و در میکرو پروگرام می کنم و بدون مشکل برنامه اجرا می شه، اما گاهی اوقات که چند خط کد به برنامه اضافه می کنم، برنامه بدون خطا کامپایل می شه ولی اصلا اجرا نمی شه. به عنوان مثال به کد زیر نگاه کنید:
وقتی در حلقه for خط
اضافه می شود، برنامه دیگر اجرا نمی شود،یعنی پس از پزوگزام کزدن، دستور پرینت اول برنامه نیز اجرا نمی شود. اما با حذف این خط برنامه و پروگرام کردن میکرو، برنامه اجرا می شود. البته نا گفته نماند که دستورات دیگری نیز در برنامه وجود دارد که در اینجا ذکر نشده است. از وقفه DMA هم استفاده شده است.
در یک حالت دیگر هم این مشکل را دیدم و این بود که در وقفه اتمام ترانسفر DMA ، برای دیباگ کردن از دستور چاپ کردم استفاده کردم و برنامه به درستی اجرا می شد. با پاک کردن دستور چاپ کردن، برنامه اجرا نشد و با کمی تغییرات و جابجا کردن کد در تابع main دوباره برنامه اجرا شد. مقدار stack و heap را هم در فایل startup به ترتیب از 400 , 100 به 800 , 200 افزایش دادم اما مشکل برطرف نشد. لطفا راهنمایی بفرمایید که مشکل از کجاست.
مشکل دیگری که دارم در مورد ADC است. ADC را در حالت تریگر با تایمر 3 فعال کردم و نتیجه تبدیل را با استفاده از DMA در یک آرایه قرار می دهم. مشکل اینجاست که با فعال کردن تایمر، ADC تریگ نمی شود و حتما باید یک بار به صورت نرم افزاری (با استفاده از تابع زیر) مقدار ADC خوانده شود تا پس از آن با بایمر تریگ شود.
با تشکر
من از هدر برد فروشگاه استفاده می کنم.
با استفاده از کتابخانه CMSYS برخی از قسمت های میکرو را راه اندازی کردم. ولی جند مشکل برام پیش اومده:
من برنامه رو کامپایل و در میکرو پروگرام می کنم و بدون مشکل برنامه اجرا می شه، اما گاهی اوقات که چند خط کد به برنامه اضافه می کنم، برنامه بدون خطا کامپایل می شه ولی اصلا اجرا نمی شه. به عنوان مثال به کد زیر نگاه کنید:
کد:
#include "stm32f10x.h" #include <string.h> #include <stdio.h> #include <math.h> #include "main.h" #define ADC_BUFFER_LEN 5000 #define VREF 3.3 uint8_t Buffer[] = "Hello word. This is me."; //uint16_t CCR1_Val = 1000; //uint16_t capture = 0; //uint8_t gDMAFlag = 0; uint16_t gADC1[ADC_BUFFER_LEN], gADC2[ADC_BUFFER_LEN]; uint8_t gRDY = 0; int main (void) { uint16_t i, frq; //int32_t sum; char str[65]; double flickerFrq, fsum, power, sum, avg; int16_t d1, d2, df, ramp, lastramp; double volt[ADC_BUFFER_LEN]; init_mcu(); print(UART4, "Start\r\n"); for (i = 0; i < 10; i++) gADC1[i] = gADC2[i] = 0; /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); avg = read_adc(); while(1) { if (gRDY) { gRDY = 0; /* average of samples */ sum = 0.0; for (i = 0; i < ADC_BUFFER_LEN; i++) { //volt[i] = (double)gADC2[i] * 3; volt[i] = volt[i]; sum += volt[i]; } /* ... */ } } }
کد:
//volt[i] = (double)gADC2[i] * 3;
در یک حالت دیگر هم این مشکل را دیدم و این بود که در وقفه اتمام ترانسفر DMA ، برای دیباگ کردن از دستور چاپ کردم استفاده کردم و برنامه به درستی اجرا می شد. با پاک کردن دستور چاپ کردن، برنامه اجرا نشد و با کمی تغییرات و جابجا کردن کد در تابع main دوباره برنامه اجرا شد. مقدار stack و heap را هم در فایل startup به ترتیب از 400 , 100 به 800 , 200 افزایش دادم اما مشکل برطرف نشد. لطفا راهنمایی بفرمایید که مشکل از کجاست.
مشکل دیگری که دارم در مورد ADC است. ADC را در حالت تریگر با تایمر 3 فعال کردم و نتیجه تبدیل را با استفاده از DMA در یک آرایه قرار می دهم. مشکل اینجاست که با فعال کردن تایمر، ADC تریگ نمی شود و حتما باید یک بار به صورت نرم افزاری (با استفاده از تابع زیر) مقدار ADC خوانده شود تا پس از آن با بایمر تریگ شود.
کد:
uint16_t read_adc (void) { uint16_t adc; /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* wait for conversion complete */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)){} /* read ADC value */ adc=ADC_GetConversionValue(ADC1); /* clear EOC flag */ ADC_ClearFlag(ADC1, ADC_FLAG_EOC); return adc; }
دیدگاه