کار با پورت USB در دسته Device در خوشه ی CDC با درایو VCP
پورت USB خود دارای چند خوشه است. موس، کیبرد، مودم، پرینتر، گیم پد و ... از خوشه های یکسانی استفاده نمی کنند. 256 خوشه وجود دارد! در ادامه چند تاش ذکر شده است
کد:
ADC ==> Audio Device Class
CDC ==> Communications Device Class
HID ==> Human Interface Device
MSC ==> Mass storage Class
PDC ==> Printer Device Class
PHD ==> Personal Healthcare device
PID ==> Physical Interface Device
SID ==> Still Imaging Device
VDC ==> Video Device Class
هر دستگاه USB جز یکی از 3 دسته زیر است
1- ابزار Device
2- مهمان Host
3- همزمان ابزار و مهمان Dual
دو راه برای ارتباطی برای USB وجود دارد
1- ارتباط مستقیم یک به یک (یکی مهمان و دیگری ابزار)
2- ارتباط چند به یک ( یک مهمان و بقیه با هاب به مهمان وصل می شوند)
همان طور که دیده می شود به علت تنوع خوشه ها ، دسته ها و راه ارتباطی نوشتن برنامه کار USB کار هر کس نیست. همچنین علاوه بر نوشتن برنامه میکرو ، لازم است برای کامپیوتر نیز درایور نوشت!!!
مزیت زبان سی پلاس پللاس نسبت به اسمبلی وجود کتابخانه ها، کلاس ها و توابع است. پس با استفاده از کتابخانه مناسب مشکل برنامه نویسی کاملا حل می شود.
به علت تنوع روش ها و ... کتابخانه استانداردی وجود ندارد.
هر چند نرم افزار CooCox CoIDE کتابخانه های برای کار با USB قرار داده، اما کار نمی کند و مشکلات کد نویسی دارد!
چهار ماه پیش کاربر xenovacivus در یکی از سایت ها ! کد اصلاح شده کتابخانه کار با پورت USB در دسته Device در خوشه ی CDC با درایو VCP را منتشر کرد! کتابخانه را می توانید از لینک زیر دانلود کنید.
302 Found
درایور آن را هم می توانید از سایت ST دانلود کنید:
کد:
STSW-STM32102
STM32 Virtual COM Port Driver
http://www.st.com/web/en/catalog/tools/PF257938
ابتدا درایور را نصب کنید و سپس رایانه یتان را ریستارت نماید
برنامه نویسی میکروکنترلر جهت کار پورت USB در دسته Device در خوشه ی CDC با درایو VCP
اکنون یک پروژه جدید بسازید ، در مخزن تیک های CooCox CoIDE تیک های GPIO - EXTI - USART - MISC را فعال کنید.
کتابخانه را در پوشه ی پروژه کپی نمایید. سپس آن را به پروژه خود بیافزایید.
قبل تابع اصلی (main) دستورات زیر را وارد کنید.
کد:
#define HSE_VALUE ((uint32_t)8000000) // STM32 discovery uses a 8Mhz external crystal
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
#include "usbd_cdc_core.h"
#include "usbd_usr.h"
#include "usbd_desc.h"
#include "usbd_cdc_vcp.h"
#include "usb_dcd_int.h"
//The USB data must be 4 byte aligned if DMA is enabled. This macro handles the alignment, if necessary.
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
// The conditional "extern" ensures the weak declarations from startup_stm32f4xx.c are overridden.
#ifdef __cplusplus
extern "C" {
#endif
void OTG_FS_IRQHandler(void)
{
USBD_OTG_ISR_Handler (&USB_OTG_dev);
}
void OTG_FS_WKUP_IRQHandler(void)
{
if(USB_OTG_dev.cfg.low_power)
{
*(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
SystemInit();
USB_OTG_UngateClock(&USB_OTG_dev);
}
EXTI_ClearITPendingBit(EXTI_Line18);
}
#ifdef __cplusplus
}
#endif
دستور زیر به میکروکنترلر می گوید که کریستال خارجی ات 8 مگا هرتز است. این دستور برای افزایش دقت (زمانی) برنامه اضافه کردیم. از این به بعد در تمامی برنامه های که می نویسید از این دستور استفاده کنید.
کد:
#define HSE_VALUE ((uint32_t)8000000)
کتاب خانه های زیر به ترتیب شناسایی میکرو، پروت های ورودی خروجی، کلاک و وقفه (اینتراپت) است.
کد:
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
کتابخانه های زیر همان کتاب خانه های پورت USB هستند.
کد:
#include "usbd_cdc_core.h"
#include "usbd_usr.h"
#include "usbd_desc.h"
#include "usbd_cdc_vcp.h"
#include "usb_dcd_int.h"
چون شما مبتدی هستید بهتر است چند خطی که بعد از سرامد ها آمده است را بدون این که بدانید چه کار می کنند کپی کنید. وقتی که کاملا حرفه ای شدید بعدا به سراغشان بیاید.
SystemInit
تابع زیر جهت فعال سازی کلاک سیستم است و کاربرد آن منحصر به USB نمی شود
از این به بعد این تایع را در تمامی برنامه های که می نویسید اضافه کنید. (در ایتدای تابع اصلی)
USBD_Init
تابع زیر برنامه می فهماند که شما می خواهد از بین کلیه روش های موجود در USB فقط و فقط از دسته Device در خوشه ی CDC با درایو VCP استفاده کنید
کد:
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
put_char
تابع زیر یک کاراکتر را ارسال می کند.
به عنوان مثال:
کد:
uint8_t chr = 'R';
VCP_put_char(chr);
------------------
VCP_put_char('G');
------------------
uint8_t *chr = 'B';
VCP_put_char(*chr);
put_char
تابع زیر یک کاراکتر را می گیرد می کند.
به عنوان مثال:
کد:
uint8_t chr;
VCP_get_char(&chr);
------------------
uint8_t *chr;
VCP_get_char(chr);
send_str
تابع زیر رشته را می فرستد
به عنوان مثال:
کد:
uint8_t str[]="Robotics Engineering";
VCP_send_str(str);
------------------
VCP_send_str("CooCox CoIDE");
get_string
تابع زیر یک رشته را می خواند.
به عنوان مثال:
کد:
uint8_t Name[20];
VCP_get_string(Name);
برنامه نویسی کامپیوتر جهت کار پورت USB در دسته Device در خوشه ی CDC با درایو VCP
VCP برگرفته از عبارت Virtual COM Port است. یعنی ویندوز فکر می کند که پورت USB اش حذف شده است و پورت COM به سیستم اضافه شده است.
شما می توانید برنامه های بنویسید (با استفاده از کتاب خانه های دیگر یا با استفاده از اسمبلی) که کامپیوتر فکر کند پورت موازی دارد یا فکر کند USB به موس وصل شده است و ...
چون این جا به برنامه نویسی کامپیوتر و زبان های گوناگون آن بستگی دارد نمی توانم تمام روش هایش را بگویم. معمولا این جور کار ها (برنامه با سرعت اجرای پایین) را با زبان پایتون می نویسند. در ادامه فقط به برنامه نویسی متلب اشاره می کنم
کد:
s6 = serial('COM6','BaudRate',9600,'DataBits',8,'Timeout',5,'Terminator' ,' ');
fopen(s6);
fprintf(s6,'Robotics');
fscanf(s6)
fclose(s6);
خط اول تعریف می کند که سخت افزار چیست. تنظیماتش در کنترل پنل قسمت دیوایس منیجر موجود است.
خط دوم پورت را باز می کند.
حط سوم کلمه ی Robotics می کند
خط چهارم پورت را می خواند.
خط آخر پورت را می بندد.
در برنامه نویسی متلب بستن پورت ضروری است. اگر برنامه یتان وسطش خطا داد به تنهایی این دستور را اجرا کنید تا بتوانید مجددا از این دستورات فوق استفاده کنید.
در کامپیوتر من پورت COM6 نامیده شد. شما باید شماره پورت را در کنترل پنل قسمت دیوایس منیجر ببینید و از آن استفاده کنید.
مثال
برنامه ای بنویسید که با ارسال اول حرف هر رنگ (به در حرف درشت) از طریق کامپیوتر، مقدار LED متناظر آن روی برد تغییر وضعیت دهد.
[PHP]
#define HSE_VALUE ((uint32_t)8000000) // STM32 discovery uses a 8Mhz external crystal
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
#include "usbd_cdc_core.h"
#include "usbd_usr.h"
#include "usbd_desc.h"
#include "usbd_cdc_vcp.h"
#include "usb_dcd_int.h"
//The USB data must be 4 byte aligned if DMA is enabled. This macro handles the alignment, if necessary.
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
// The conditional "extern" ensures the weak declarations from startup_stm32f4xx.c are overridden.
#ifdef __cplusplus
extern "C" {
#endif
void OTG_FS_IRQHandler(void)
{
USBD_OTG_ISR_Handler (&USB_OTG_dev);
}
void OTG_FS_WKUP_IRQHandler(void)
{
if(USB_OTG_dev.cfg.low_power)
{
*(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
SystemInit();
USB_OTG_UngateClock(&USB_OTG_dev);
}
EXTI_ClearITPendingBit(EXTI_Line18);
}
#ifdef __cplusplus
}
#endif
int main(void)
{
uint8_t charac;
SystemInit(); // Set up the system clocks
//SysTick_Config(SystemCoreClock / 1000); // Setup SysTick
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIOD->MODER=0x55000000;
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb); // Setup USB
while (1)
{
VCP_get_char(&charac);
VCP_put_char(charac);
switch(charac)
{
case 'G':
GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
break;
case 'O':
GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
break;
case 'R':
GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
break;
case 'B':
GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
}
}
return 0;
}
[/PHP]
تمرین
در تمرینات زیر علاوه بر برنامه میکرو ، برنامه کامپیوتر را نیز بنویسید:
1- برنامه ای بنویید که رشته "Robotics Engineering" را به کامپیوتر ارسال کند. سپس کامپیوتر آن را مجدد به میکرو ارسال کند، در صورتی که عبارت درست ارسال شده بود چراغ سبز روشن شود و در صورتی که اشتباه شده بود چراغ قرمز روشن شود و دوباره رشته ارسال شود و این کار ادامه پیدا کند تا رشته درست ارسال شود.
2- برنامه شماره 1 را طوری بنویسید که حرف به حرف ارسال و تایید شود. برای تایید حرف به حرف می توانید از کارکتر های - و = برای اطمینان از صحت ارسال استفاده کنید.
3- برنامه ای بنویسید که با ارسال رشته "Traffic Lights" برد عمل چراغ راهنمایی اجرا دهد. در صورت ارسال رشته "Flashing Red" چراغ قرمز چشمک زن، در صورت ارسال رشته "Flashing Yellow" چراغ قرمز چشمک زن و در صورت ارسال "Off" همه ی LED ها خاموش شوند.
4- برنامه بات را بنویسید. در این برنامه برد به رشته ها جواب می دهد. مثلا اگر "Salam" در یافت کرد رشته ی "Salam Alaykom" را ارسال کند و یا مثلا وقتی "smkdgjnspkrjg" در یافت کند عبارت "I do not know" را ارسال کند و ...
5- برنامه شبیه ساز ربات تعقیب خط با پنج سنسور را بنویسید. در این شبیه ساز داده ها (اطلاعات سنسور) ار کامپیوتر ارسال می شوند و ربات پس از تحیلی سرعت هر موتور را به کامپیوتر ارسال می کند.