اخیراً در پروژهای برای راه اندازی USB Device در میکروکنترلر STM32 به مشکل بر خوردم. این کار را قبلاً هم انجام داده بودم و قاعدتاً باید این بار هم به راحتی راه میفتاد. اما مشکلی که داشتم این بود که با وجود شناسایی USB توسط کامپیوتر، پس از مدتی خطای “error code 10” برگردانده میشد و امکان برقراری با USB Device ممکن نبود.اگر شما هم با چنین مشکلی مواجه شدید، احتمالاً خواندن ادامهی مطلب به کارتون بیاد 🙂
بطور خلاصه باید بگم مشکل، از کافی نبودن حافظهی Heap یود که باعث میشد در خط
hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef));
از تابع USBD_CDC_Init به مشکل بخوریم.
برای حل این مشکل، در صورتی که از CubeMX استفاده میکنید، باید در تَب
Project Manager->Project->Linker Setting
مقدار حافظهی Heap را افزایش دهید. به طور معمول مثلاً 0x800 مقدار خوبی هست. اگر این کار را انجام داده باشید، احتمالاً باید تا الان مشکل حل شده باشد. مگر اینکه مثل من فایل لینکر را دست کاری کرده باشید. که در این صورت لازمه از همانجا-فایل لینکر پروژه- مستقیم فضای Heap را افزایش دهید.
البته راه دیگری هم هست و آن اینکه کلا کاری به Heap نداشته باشیم و یک حافظه استاتیک مثلاً:
static uint8_t usbd_buf[sizeof(USBD_CDC_HandleTypeDef)];
در تابع USBD_CDC_Init تعریف کنیم و آدرس آن را به hcdc بدهیم. مشکلی که این روش دارد این است که در صورت regenerate کردن پروژه توسط کیوب متاسفانه این کد پاک خواهد شد و باید دوباره آن را بنویسید.
دیجیلاگیست محلی برای کسانی که به دنیای دیجیتال و آنالوگ علاقه دارند