X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=Src%2Fmain.c;h=9d3dbb8905792a7ba4634cfea9b5e7177b88bb3f;hb=f0a255055982a16d6d0a3f58ef959a2389edbbd7;hp=22395ad86d356881ca7fa3e3b3ef1de5dc3ec1b4;hpb=965866e0a41d46c9aeb3d7a6ddbab2fa4106cccc;p=home-hw.git diff --git a/Src/main.c b/Src/main.c index 22395ad..9d3dbb8 100644 --- a/Src/main.c +++ b/Src/main.c @@ -39,6 +39,7 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" +#include "usb.h" /* USER CODE BEGIN Includes */ @@ -50,7 +51,7 @@ PCD_HandleTypeDef hpcd_USB_FS; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ -USBD_HandleTypeDef USBD_Device; +struct usb usb; /* USER CODE END PV */ @@ -68,6 +69,168 @@ static void MX_USB_PCD_Init(void); /* USER CODE BEGIN 0 */ +#include +#include +#include + +void semi_put_char(char c) +{ + // This is tricky, we need to work around GCC bugs + volatile char cc = c; + asm volatile ( + "mov r0, #0x03\n" /* SYS_WRITEC */ + "mov r1, %[msg]\n" + "bkpt #0xAB\n" + : + : [msg] "r" (&cc) + : "r0", "r1" + ); +} + +void semi_write_string(char *c) +{ + asm volatile ( + "mov r0, #0x04\n" /* SYS_WRITE0 */ + "mov r1, %[msg]\n" + "bkpt #0xAB\n" + : + : [msg] "r" (c) + : "r0", "r1" + ); +} + +void debug_putc(int c) +{ + static char debug_buf[16]; + static int debug_i; + debug_buf[debug_i++] = c; + if (c == '\n' || debug_i >= sizeof(debug_buf) - 1) + { + debug_buf[debug_i] = 0; + semi_write_string(debug_buf); + debug_i = 0; + } +} + +void debug_puts(const char *s) +{ + while (*s) + debug_putc(*s++); +} + +enum printf_flags { + PF_ZERO_PAD = 1, + PF_SIGNED = 2, + PF_NEGATIVE = 4, + PF_UPPERCASE = 8, + PF_LEFT = 16, +}; + +static void printf_string(const char *s, uint width, uint flags) +{ + uint len = strlen(s); + uint pad = (len < width) ? width - len : 0; + char pad_char = (flags & PF_ZERO_PAD) ? '0' : ' '; + + if (flags & PF_LEFT) + debug_puts(s); + while (pad--) + debug_putc(pad_char); + if (!(flags & PF_LEFT)) + debug_puts(s); +} + +static void printf_number(uint i, uint width, uint flags, uint base) +{ + char buf[16]; + char *w = buf + sizeof(buf); + + if (flags & PF_SIGNED) + { + if ((int) i < 0) + { + i = - (int) i; + flags |= PF_NEGATIVE; + } + } + + *--w = 0; + do + { + uint digit = i % base; + if (digit < 10) + *--w = '0' + digit; + else + *--w = ((flags & PF_UPPERCASE) ? 'A' : 'a') + digit - 10; + i /= base; + } + while (i); + + if (flags & PF_NEGATIVE) + *--w = '-'; + + printf_string(w, width, flags); +} + +void debug_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + while (*fmt) + { + int c = *fmt++; + if (c != '%') + { + debug_putc(c); + continue; + } + + uint width = 0; + uint flags = 0; + + if (*fmt == '-') + { + fmt++; + flags |= PF_LEFT; + } + + if (*fmt == '0') + { + fmt++; + flags |= PF_ZERO_PAD; + } + + while (*fmt >= '0' && *fmt <= '9') + width = 10*width + *fmt++ - '0'; + + c = *fmt++; + switch (c) + { + case 'd': + printf_number(va_arg(args, int), width, flags | PF_SIGNED, 10); + break; + case 'u': + printf_number(va_arg(args, int), width, flags, 10); + break; + case 'X': + flags |= PF_UPPERCASE; + // fall-thru + case 'x': + printf_number(va_arg(args, int), width, flags, 16); + break; + case 's': + printf_string(va_arg(args, char *), width, flags); + break; + default: + debug_putc(c); + continue; + } + } + + va_end(args); +} + /* USER CODE END 0 */ /** @@ -103,17 +266,20 @@ int main(void) MX_I2C2_Init(); MX_USB_PCD_Init(); /* USER CODE BEGIN 2 */ + usb_init(&usb, &hpcd_USB_FS); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ + int cnt = 0; while (1) { LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin); - LL_mDelay(1000); + LL_mDelay(500); LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin); - LL_mDelay(1000); + LL_mDelay(500); + debug_printf("Counter = %d\n", cnt++); /* USER CODE END WHILE */ @@ -263,7 +429,6 @@ static void MX_I2C2_Init(void) /* USB init function */ static void MX_USB_PCD_Init(void) { - hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 8; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; @@ -275,7 +440,6 @@ static void MX_USB_PCD_Init(void) { _Error_Handler(__FILE__, __LINE__); } - } /** Configure pins as