Browse Source

blinky: Better serial logging, and at 115200 baud

Keir Fraser 5 years ago
parent
commit
cd06e583a2
4 changed files with 41 additions and 27 deletions
  1. 1 1
      Makefile
  2. 4 0
      blinky_test/Makefile
  3. 34 26
      src/blinky.c
  4. 2 0
      src/console.c

+ 1 - 1
Makefile

@@ -29,7 +29,7 @@ dist:
 	cp -a $(PROJ)-$(VER).hex $(PROJ)-$(VER)/
 	cp -a $(PROJ)-$(VER).upd $(PROJ)-$(VER)/
 	$(MAKE) clean
-	$(MAKE) -C blinky_test -f $(ROOT)/Rules.mk \
+	debug=y $(MAKE) -C blinky_test -f $(ROOT)/Rules.mk \
 		Blinky.elf Blinky.bin Blinky.hex
 	cp -a blinky_test/Blinky.hex $(PROJ)-$(VER)/alt/Blinky_Test-$(VER).hex
 	$(MAKE) clean

+ 4 - 0
blinky_test/Makefile

@@ -5,3 +5,7 @@ OBJS += stm32f10x.o
 OBJS += blinky.o
 OBJS += util.o
 OBJS += fpec.o
+OBJS += console.o
+OBJS += string.o
+
+console.o: CFLAGS += -DBAUD=115200

+ 34 - 26
src/blinky.c

@@ -15,20 +15,19 @@
  * See the file COPYING for more details, or visit <http://unlicense.org>.
  */
 
+#define FLASH_KB 64
+#define SRAM_KB  20
+
 int EXC_reset(void) __attribute__((alias("main")));
 
 void IRQ_30(void) __attribute__((alias("IRQ_tim4")));
 #define IRQ_TIM4 30
 
-#ifndef NDEBUG
-/* Keep the linker happy. */
-int printk(const char *format, ...) { return 0; }
-#endif
-
 static void FAIL(void)
 {
     /* Light the LED(s) and hang. */
     IRQ_global_disable();
+    printk("FAILED\n");
     gpio_write_pin(gpiob, 12, LOW);
     gpio_write_pin(gpioc, 13, LOW);
     for (;;) ;
@@ -47,7 +46,7 @@ static void IRQ_tim4(void)
     x ^= 1;
 
     /* Write to the serial line. */
-    usart1->dr = '.';
+    printk(".");
 }
 
 /* Pseudorandom LFSR. */
@@ -62,8 +61,9 @@ static uint32_t rand(void)
     return x;
 }
 
-static void i2c_test(I2C i2c)
+static void i2c_test(I2C i2c, int nr)
 {
+    printk("Testing I2C%d... ", nr);
     i2c->cr1 = 0;
     i2c->oar1 = 0x10;
     i2c->cr2 = (I2C_CR2_FREQ(36) |
@@ -73,10 +73,12 @@ static void i2c_test(I2C i2c)
     i2c->cr1 = I2C_CR1_ACK | I2C_CR1_PE;
     if ((i2c->oar1 != 0x10) || (i2c->cr1 != (I2C_CR1_ACK | I2C_CR1_PE)))
         FAIL();
+    printk("Done\n");
 }
 
-static void spi_test(SPI spi)
+static void spi_test(SPI spi, int nr)
 {
+    printk("Testing SPI%d... ", nr);
     spi->cr2 = (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
     spi->cr1 = (SPI_CR1_MSTR | /* master */
                 SPI_CR1_SSM | SPI_CR1_SSI | /* software NSS */
@@ -86,11 +88,13 @@ static void spi_test(SPI spi)
                 SPI_CR1_BR_DIV4);
     if (spi->cr2 != (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN))
         FAIL();
+    printk("Done\n");
 }
 
-static void tim_test(TIM tim)
+static void tim_test(TIM tim, int nr)
 {
     /* Configure to overflow at 2Hz. */
+    printk("Testing TIM%d... ", nr);
     tim->psc = sysclk_us(100)-1;
     tim->arr = 5000-1;
     tim->dier = TIM_DIER_UIE;
@@ -98,6 +102,7 @@ static void tim_test(TIM tim)
     tim->cr1 = TIM_CR1_URS | TIM_CR1_CEN;
     if (tim->arr != (5000-1))
         FAIL();
+    printk("Done\n");
 }
 
 int main(void)
@@ -111,13 +116,11 @@ int main(void)
     memset(_sbss, 0, _ebss-_sbss);
 
     stm32_init();
+    console_init();
 
-    /* Configure USART1: 9600,8n1. */
-    rcc->apb2enr |= RCC_APB2ENR_USART1EN;
-    gpio_configure_pin(gpioa, 9, AFO_pushpull(_10MHz));
-    gpio_configure_pin(gpioa, 10, GPI_pull_up);
-    usart1->brr = SYSCLK / 9600;
-    usart1->cr1 = (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
+    printk("\n** Blinky Test **\n");
+    printk("** Keir Fraser <keir.xen@gmail.com>\n");
+    printk("** https://github.com/keirf/Greaseweazle\n");
 
     /* Configure LED pin(s). LED is connected to VDD. */
     gpio_configure_pin(gpiob, 12, GPO_opendrain(_2MHz, HIGH));
@@ -125,31 +128,34 @@ int main(void)
 
     /* Test I2C peripherals. */
     rcc->apb1enr |= RCC_APB1ENR_I2C1EN;
-    i2c_test(i2c1);
+    i2c_test(i2c1, 1);
     rcc->apb1enr |= RCC_APB1ENR_I2C2EN;
-    i2c_test(i2c2);
+    i2c_test(i2c2, 2);
 
     /* Test SPI peripherals. */
     rcc->apb2enr |= RCC_APB2ENR_SPI1EN;
-    spi_test(spi1);
+    spi_test(spi1, 1);
     rcc->apb1enr |= RCC_APB1ENR_SPI2EN;
-    spi_test(spi2);
+    spi_test(spi2, 2);
 
     /* Test TIM peripherals, set up to overflow at 2Hz. */
-    tim_test(tim1);
-    tim_test(tim2);
-    tim_test(tim3);
-    tim_test(tim4);
+    tim_test(tim1, 1);
+    tim_test(tim2, 2);
+    tim_test(tim3, 3);
+    tim_test(tim4, 4);
 
     /* Enable TIM4 IRQ, to be triggered at 2Hz. */
+    printk("Testing TIM4 IRQ... ");
     IRQx_set_prio(IRQ_TIM4, TIMER_IRQ_PRI);
     IRQx_clear_pending(IRQ_TIM4);
     IRQx_enable(IRQ_TIM4);
+    printk("Enabled\n");
 
     /* Erase and write the last page of Flash below 64kB. Check it reads 
      * back okay. */
+    printk("Testing %ukB Flash... ", FLASH_KB);
     fpec_init();
-    fp = (uint32_t)(_stext + 64*1024 - FLASH_PAGE_SIZE);
+    fp = (uint32_t)(_stext + FLASH_KB*1024 - FLASH_PAGE_SIZE);
     fpec_page_erase(fp);
     memset(_ebss, 0xff, FLASH_PAGE_SIZE);
     if (memcmp((void *)fp, _ebss, FLASH_PAGE_SIZE))
@@ -160,16 +166,18 @@ int main(void)
     fpec_write(_ebss, FLASH_PAGE_SIZE, fp);
     if (memcmp((void *)fp, _ebss, FLASH_PAGE_SIZE))
         goto fail; /* didn't write ok */
+    printk("Done\n");
 
     /* Endlessly test SRAM by filling with pseudorandom junk and then 
      * testing the values read back okay. */
+    printk("Testing %ukB SRAM (endless loop)...", SRAM_KB);
     for (;;) {
         uint32_t *p = (uint32_t *)_ebss, sr = srand;
-        while (p < (uint32_t *)(0x20000000 + 20*1024))
+        while (p < (uint32_t *)(0x20000000 + SRAM_KB*1024))
             *p++ = rand();
         srand = sr;
         p = (uint32_t *)_ebss;
-        while (p < (uint32_t *)(0x20000000 + 20*1024))
+        while (p < (uint32_t *)(0x20000000 + SRAM_KB*1024))
             if (*p++ != rand())
                 goto fail;
     }

+ 2 - 0
src/console.c

@@ -9,7 +9,9 @@
  * See the file COPYING for more details, or visit <http://unlicense.org>.
  */
 
+#ifndef BAUD
 #define BAUD 3000000 /* 3Mbaud */
+#endif
 
 #define USART1_IRQ 37