STM32 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдХ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛

рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ? рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ! рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдпрд╣ USB рд╣реЛрд╕реНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде STM32 рдФрд░ рдбрдбрдЧреЗрдЯ рд╕реЗ рд╕реАрдХ рдерд░реНрдорд▓ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рд╣реИ!


рд╕реАрд░рдордерд░реНрдорд▓ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреА рдЖрдВрдЦреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрд▓реНрдбрд░рд┐рдВрдЧ рдЖрдпрд░рди

рдкрд░рд┐рдЪрдп


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧреИрдЬреЗрдЯреНрд╕ рдореЗрдВ рдЖрдпрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ рд╣реИред рдФрд░ рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ, рдЧреИрдЬреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрдкрд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдВрдкреНрдпреВрдЯрд░ рдпрд╛ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХреЗ рд╕реЗрдЯ-рдЯреЙрдк рдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЖрдЬ рд╣рдо рд╕реАрдХ рдерд░реНрдорд▓ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдПрд╕рдЯреАрдПрдо 32 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдХрдВрдкрдиреА рдбрдбрдЧреЗрдЯ рдиреЗ рдореБрдЭреЗ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред Geektimes рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░, рдЗрд╕ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛: рдЗрд╕рдиреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдПрдХ рдкреАрд╕реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦред рдореЗрд░реА рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ, рдореИрдВ USB рд╣реЛрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ STM32 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рд╕реАрдХ рдерд░реНрдорд▓ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ


рдЗрддрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ! рдЖрдкрдХреЗ рд╕рднреА STM32 рдореЗрдВ USB рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣реЛрд╕реНрдЯ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдФрд░ рдПрд▓рд╕реАрдбреА рд╕реНрдХреНрд░реАрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк STM32F4 - рдбрд┐рд╕реНрдХрд╡рд░реА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ STM32F746G-Discovery рдмреЛрд░реНрдб рдерд╛ред рддрджрдиреБрд╕рд╛рд░, рд╡рд┐рд╡рд░рдг рдЗрд╕ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди! рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб CubeMX рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдФрд░ EVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рднреБрдЧрддрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ


рдпрд╣ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реАрдзреЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд▓реНрдХ-рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдХрдВрдЯреНрд░реЛрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рдХрдорд╛рдВрдб (рдЕрдиреБрд░реЛрдз) рднреЗрдЬрдХрд░, рдЖрдк рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреИрд▓рд┐рдмреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдлреНрд░реЗрдо, рдпрд╛ рдХрдИ рдлреНрд░реЗрдо рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реАрдХ рдерд░реНрдорд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рдХрд╛рдо рдЗрд╕ рдордВрдЪ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреЗ рд▓рд┐рдП рдПрд╕рдЯреАрдПрдо 32 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

1) рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА USB рд╣реЛрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ (рдореИрдВрдиреЗ STM32 USB рд╣реЛрд╕реНрдЯ CDC рдЙрджрд╛рд╣рд░рдг STM32F7 CubeMX рдирдореВрдирд╛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд▓рд┐рдпрд╛);
2) рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ;
3) рдПрдВрдбрдкреЙрдЗрдВрдЯ рдФрд░ рдбреЗрдЯрд╛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реИрдкрд░ рд▓рд┐рдЦреЗрдВ;
4) рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦреЗрдВ;
5) рд░рдВрдЧ рдореЗрдВ рдПрдХ рдореЛрдиреЛрдХреНрд░реЛрдо рдЫрд╡рд┐ рдХреЛ рд░рдВрдЧрдиреЗ рдХреЗ рд▓рд┐рдП LUT (рдХрд▓рд░ рд▓реБрдХ рдЕрдк рдЯреЗрдмрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдлрд╝рд┐рдЪ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рдПрд╕рдЯреАрдПрдо 32 рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдПрд▓рд╕реАрдбреА рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо libusb рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ HAL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

Libusb рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдб
int libusb_control_transfer(libusb_device_handle* dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char* data, uint16_t wLength, unsigned int timeout) { hUSBHost.Control.setup.b.bmRequestType = request_type; hUSBHost.Control.setup.b.bRequest = bRequest; hUSBHost.Control.setup.b.wValue.w = wValue; hUSBHost.Control.setup.b.wIndex.w = wIndex; hUSBHost.Control.setup.b.wLength.w = wLength; int status; do { status = USBH_CtlReq(&hUSBHost, data, wLength); } while (status == USBH_BUSY); if (status != USBH_OK) { hUSBHost.RequestState = CMD_SEND; return 0; } else { return wLength; } } 


рддрдм рд╣рдо рдпрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ seller_transfer рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЛрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

seller_transfer рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдб
 int vendor_transfer(bool direction, uint8_t req, uint16_t value, uint16_t index, uint8_t * data, uint8_t size, int timeout) { int res; uint8_t bmRequestType = (direction ? LIBUSB_ENDPOINT_IN : LIBUSB_ENDPOINT_OUT) | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_INTERFACE; uint8_t bRequest = req; uint16_t wValue = value; uint16_t wIndex = index; uint8_t * aData = data; uint16_t wLength = size; if (!direction) { // to device #ifdef LOG_DEBUG USBH_UsrLog("ctrl_transfer(0x%x, 0x%x, 0x%x, 0x%x, %d)", bmRequestType, bRequest, wValue, wIndex, wLength); printf(" ["); for (int i = 0; i < wLength; i++) { printf(" %02x", data[i]); } printf(" ]\n"); #endif res = libusb_control_transfer(handle, bmRequestType, bRequest, wValue, wIndex, aData, wLength, timeout); #ifdef LOG_DEBUG if (res != wLength) { USBH_UsrLog("Bad returned length: %d\n", res); } #endif } else { // from device #ifdef LOG_DEBUG USBH_UsrLog("ctrl_transfer(0x%x, 0x%x, 0x%x, 0x%x, %d)", bmRequestType, bRequest, wValue, wIndex, wLength); #endif res = libusb_control_transfer(handle, bmRequestType, bRequest, wValue, wIndex, aData, wLength, timeout); #ifdef LOG_DEBUG if (res != wLength) { USBH_UsrLog("Bad returned length: %d\n", res); } printf(" -> ["); for (int i = 0; i < res; i++) { printf(" %02x", data[i]); } printf(" ]\n"); #endif } return res; } 


рдЕрдЧрд▓рд╛, рд╣рдо рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕реАрдбреАрд╕реА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬрд╛рд╕реВрд╕реА, рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред

USB рдбреЗрдЯрд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛
 int CAM_ProcessReception(USBH_HandleTypeDef *phost) { USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; uint16_t length = 0; uint8_t data_rx_state = CDC_RECEIVE_DATA; size = FRAME_WIDTH * FRAME_HEIGHT; int bufsize = size * sizeof(uint16_t); int bsize = 0; while (data_rx_state != CDC_IDLE) { switch(data_rx_state) { case CDC_RECEIVE_DATA: USBH_BulkReceiveData (phost, &rawdata[bsize], 512, InPipe); data_rx_state = CDC_RECEIVE_DATA_WAIT; break; case CDC_RECEIVE_DATA_WAIT: URB_Status = USBH_LL_GetURBState(phost, InPipe); /*Check the status done for reception*/ if(URB_Status == USBH_URB_DONE ) { length = USBH_LL_GetLastXferSize(phost, InPipe); bsize+= length; if(((bufsize - length) > 0) && (bsize < bufsize)) //TODO { data_rx_state = CDC_RECEIVE_DATA; } else { data_rx_state = CDC_IDLE; } #if (USBH_USE_OS == 1) osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); #endif } break; default: break; } } return data_rx_state; } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ 20 рд╡реЗрдВ рдмрд╛рдЗрдЯ рдореЗрдВ, рдЬреЛ 16-рдмрд┐рдЯ рд╕рд░рдгреА рдХрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИ, рдлреНрд░реЗрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдлреНрд░реЗрдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЕрдВрд╢рд╛рдВрдХрди рдлреНрд░реЗрдо рдФрд░ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдлреНрд░реЗрдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдПрдХ рдЕрдВрд╢рд╛рдВрдХрди рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдкрд░реНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ "рдЕрдВрдзреЗрд░реЗ" рдХреА рддрд╕реНрд╡реАрд░ рд▓реЗрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдлреНрд░реЗрдо рдХреА рд╢реВрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рд╢рдЯрд░ рдЦреБрд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╣рдореЗрд╢рд╛ рд╕реБрдирддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рд╢рдЯрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреНрд░реАрди рдбреНрд░рд╛рдЗрдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛
 void BSP_LCD_DrawArray(uint32_t Xpos, uint32_t Ypos, uint32_t width, uint32_t height, uint8_t bit_pixel, uint8_t *pbmp) { uint32_t index = 0; uint32_t index2 = 0; // uint32_t address; //uint32_t input_color_mode = 0; //uint32_t Color; static int pixel; static int calib_pixel=0; uint8_t Component; static int v; uint8_t frame_type; frame_type = *(__IO uint8_t *) (pbmp + 20); switch (frame_type) { case 6: calib_pixel = (*(uint16_t*)pbmp); minpixel = calib_pixel; //calib_pixel = bswap_16(calib_pixel); break; case 3: /* Convert picture to ARGB8888 pixel format */ for(index=0; index < height; index++) { for(index2=0; index2 < width; index2++) { pixel = (*(uint16_t*)pbmp); //pixel = bswap_16(pixel); //v = pixel - calib_pixel; //v += 0x8000; if (maxpixel < pixel) maxpixel = pixel; if (minpixel > pixel) minpixel = pixel; if (pixel < 0) { pixel = 0; } if (pixel > 0xFFFF) { pixel = 0xFFFF; } v = map(pixel, 6000, 13000, 0, 255); //v = (v - MAX) * 255 / (MIN - MAX); if (v < 0) v = 0; if (v > 255) v = 255; BSP_LCD_DrawPixel(index2+270, index+100, (0xFF << 24) | (uint8_t)v << 16 | (uint8_t)v << 8 | (uint8_t)v); pbmp += 2; } } break; case 4: break; } } 


рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рдЪрдХреНрд░, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╛рдЯрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдХреБрдЫ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред

рдореБрдЦреНрдп рдЪрдХреНрд░
 #define DELAY1 10 #define USB_PIPE_NUMBER 0x81 #define FRAME_WIDTH 208 #define FRAME_HEIGHT 156 uint8_t OutPipe, InPipe; uint8_t usb_device_state; uint8_t rawdata[FRAME_HEIGHT*FRAME_WIDTH*2]; uint8_t data[64]; USBH_StatusTypeDef status; uint8_t transf_size; int size; int main(void) { /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* STM32F7xx HAL library initialization: - Configure the Flash ART accelerator on ITCM interface - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the System clock to have a frequency of 200 MHz */ SystemClock_Config(); /* Init CDC Application */ CDC_InitApplication(); /* Init Host Library */ USBH_Init(&hUSBHost, USBH_UserProcess, 0); /* Add Supported Class */ //USBH_RegisterClass(&hUSBHost, USBH_CDC_CLASS); /* Start Host Process */ USBH_Start(&hUSBHost); /* Run Application (Blocking mode) */ while (1) { /* USB Host Background task */ USBH_Process(&hUSBHost); if (hUSBHost.gState == HOST_CHECK_CLASS) { switch (usb_device_state) { case 1: status = USBH_Get_StringDesc(&hUSBHost,hUSBHost.device.DevDesc.iManufacturer, data , 64); if (status == USBH_OK) { USBH_UsrLog("## Manufacturer : %s", (char *)data); HAL_Delay(1000); usb_device_state = 1; } break; case 2: status = USBH_Get_StringDesc(&hUSBHost, hUSBHost.device.DevDesc.iProduct, data , 64); if (status == USBH_OK) { USBH_UsrLog("## Product : %s", (char *)data); HAL_Delay(1000); usb_device_state = 2; } break; case 0: InPipe = USBH_AllocPipe(&hUSBHost, 0x81); status = USBH_OpenPipe(&hUSBHost, InPipe, 0x81, hUSBHost.device.address, hUSBHost.device.speed, USB_EP_TYPE_BULK, USBH_MAX_DATA_BUFFER); if (status == USBH_OK) usb_device_state = 3; break; case 3: HAL_Delay(1); const uint8_t data0[2] = {0x00, 0x00}; vendor_transfer(0, SET_OPERATION_MODE, 0, 0, data0, 2); vendor_transfer(0, SET_OPERATION_MODE, 0, 0, data0, 2); vendor_transfer(0, SET_OPERATION_MODE, 0, 0, data0, 2); data[0] = 0x01; vendor_transfer(0, TARGET_PLATFORM, 0, 0, data, 1); data[0] = 0x00; data[1] = 0x00; vendor_transfer(0, SET_OPERATION_MODE, 0, 0, data); transf_size = vendor_transfer(1, GET_FIRMWARE_INFO, 0, 0, data, 4); transf_size = vendor_transfer(1, READ_CHIP_ID, 0, 0, data, 12); const uint8_t data1[6] = { 0x20, 0x00, 0x30, 0x00, 0x00, 0x00 }; vendor_transfer(0, SET_FACTORY_SETTINGS_FEATURES, 0, 0, data1, 6); transf_size = vendor_transfer(1, GET_FACTORY_SETTINGS, 0, 0, data, 64); const uint8_t data2[6] = { 0x20, 0x00, 0x50, 0x00, 0x00, 0x00 }; vendor_transfer(0, SET_FACTORY_SETTINGS_FEATURES, 0, 0, data2, 6); transf_size = vendor_transfer(1, GET_FACTORY_SETTINGS, 0, 0, data, 64); const uint8_t data3[6] = { 0x0c, 0x00, 0x70, 0x00, 0x00, 0x00 }; vendor_transfer(0, SET_FACTORY_SETTINGS_FEATURES, 0, 0, data3, 6); transf_size = vendor_transfer(1, GET_FACTORY_SETTINGS, 0, 0, data, 24); const uint8_t data4[6] = { 0x06, 0x00, 0x08, 0x00, 0x00, 0x00 }; vendor_transfer(0, SET_FACTORY_SETTINGS_FEATURES, 0, 0, data4, 6); vendor_transfer(1, GET_FACTORY_SETTINGS, 0, 0, data, 12); const uint8_t data5[2] = { 0x08, 0x00 }; vendor_transfer(0, SET_IMAGE_PROCESSING_MODE, 0, 0, data5, 2); vendor_transfer(1, GET_OPERATION_MODE, 0, 0, data,2); const uint8_t data6[2] = { 0x08, 0x00 }; vendor_transfer(0, SET_IMAGE_PROCESSING_MODE, 0, 0, data6, 2); const uint8_t data7[2] = { 0x01, 0x00 }; vendor_transfer(0, SET_OPERATION_MODE, 0, 0, data7, 2); vendor_transfer(1, GET_OPERATION_MODE, 0, 0, data, 2); USBH_UsrLog("SeeK Thermal Init Done.\n"); size = FRAME_WIDTH * FRAME_HEIGHT; int bufsize = size * sizeof(uint16_t); status = CDC_IDLE; usb_device_state = 4; break; case 4: //while(1 ){ // request a frame data[0] = (uint8_t)(size & 0xff); data[1] = (uint8_t)((size>>8)&0xff); data[2] = 0; data[3] = 0; if (status == CDC_IDLE) vendor_transfer(0, 0x53, 0, 0, data, 4); status = CAM_ProcessReception(&hUSBHost); if (status == CDC_IDLE) BSP_LCD_DrawArray(10, 10, FRAME_WIDTH, FRAME_HEIGHT, 16, rawdata); usb_device_state = 4; break; } } } } 


рдирд┐рд╖реНрдХрд░реНрд╖


рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рде рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддрд╛рдкреАрдп рддрд╕реНрд╡реАрд░ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдбреИрдЬреЗрдЯ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдореЗрдВ рдПрдХ рд╕рдорд╛рдпреЛрдЬреНрдп рдлреЛрдХрд▓ рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдмреЛрд░реНрдб рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ! рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдк рдерд░реНрдорд▓ рдЗрдореЗрдЬрд░ рдХреА рдЧрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд╣реАрдВ-рдХрд╣реАрдВ 8-9 рдПрдлрдкреАрдПрд╕)



рд╕рдВрднрд╛рд╡рд┐рдд рдЦрд░реАрджрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА

Source: https://habr.com/ru/post/hi402083/


All Articles