From 8491f4bf9094547086545f3b9e6e83a4288fb4c9 Mon Sep 17 00:00:00 2001 From: eddyem Date: Wed, 18 Sep 2019 16:41:35 +0300 Subject: [PATCH] Change USART1 to LEDs for T0/T1 presence indication (@ Tcalc_screen_ver2) --- STM32/Tcalc_screen_ver2/Makefile | 2 +- STM32/Tcalc_screen_ver2/hardware.c | 4 +- STM32/Tcalc_screen_ver2/hardware.h | 9 + STM32/Tcalc_screen_ver2/main.c | 34 +--- STM32/Tcalc_screen_ver2/proto.c | 25 +-- STM32/Tcalc_screen_ver2/proto.h | 4 +- STM32/Tcalc_screen_ver2/spi.c | 2 +- STM32/Tcalc_screen_ver2/ssd1306.c | 3 +- STM32/Tcalc_screen_ver2/tcalc_screen.bin | Bin 25272 -> 24716 bytes STM32/Tcalc_screen_ver2/usart.c | 213 ----------------------- STM32/Tcalc_screen_ver2/usart.h | 52 ------ STM32/Tcalc_screen_ver2/usb.c | 2 +- STM32/Tcalc_screen_ver2/usb_lib.c | 1 - 13 files changed, 42 insertions(+), 309 deletions(-) delete mode 100644 STM32/Tcalc_screen_ver2/usart.c delete mode 100644 STM32/Tcalc_screen_ver2/usart.h diff --git a/STM32/Tcalc_screen_ver2/Makefile b/STM32/Tcalc_screen_ver2/Makefile index ac97d17..5c5557d 100644 --- a/STM32/Tcalc_screen_ver2/Makefile +++ b/STM32/Tcalc_screen_ver2/Makefile @@ -1,6 +1,6 @@ BINARY = tcalc_screen BOOTPORT ?= /dev/ttyUSB0 -BOOTSPEED ?= 9600 +BOOTSPEED ?= 115200 # MCU FAMILY FAMILY = F0 # MCU code diff --git a/STM32/Tcalc_screen_ver2/hardware.c b/STM32/Tcalc_screen_ver2/hardware.c index 87468c1..0d5ba24 100644 --- a/STM32/Tcalc_screen_ver2/hardware.c +++ b/STM32/Tcalc_screen_ver2/hardware.c @@ -26,9 +26,11 @@ static I2C_SPEED curI2Cspeed = LOW_SPEED; void gpio_setup(void){ + // PA9, PA10 - LEDs T0/T1 RCC->AHBENR |= RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOAEN; // Set LEDS (PA14/15) - GPIOA->MODER = GPIO_MODER_MODER14_O | GPIO_MODER_MODER15_O; + GPIOA->MODER = GPIO_MODER_MODER9_O | GPIO_MODER_MODER10_O | + GPIO_MODER_MODER14_O | GPIO_MODER_MODER15_O; // PC13 - digital output - poweron GPIOC->OTYPER = 1 << 13; // opendrain GPIOC->MODER = GPIO_MODER_MODER13_O; diff --git a/STM32/Tcalc_screen_ver2/hardware.h b/STM32/Tcalc_screen_ver2/hardware.h index 361c38a..0919267 100644 --- a/STM32/Tcalc_screen_ver2/hardware.h +++ b/STM32/Tcalc_screen_ver2/hardware.h @@ -36,6 +36,12 @@ #define LED1_port GPIOA #define LED1_pin (1<<15) +// LEDs for T0/T1 (PA9/PA10) +#define LEDT0_port GPIOA +#define LEDT0_pin (1<<9) +#define LEDT1_port GPIOA +#define LEDT1_pin (1<<10) + #define CONCAT(a,b) a ## b #define STR_HELPER(s) #s #define STR(s) STR_HELPER(s) @@ -46,6 +52,9 @@ #define LED_blink(x) pin_toggle(x ## _port, x ## _pin) #define LED_on(x) pin_clear(x ## _port, x ## _pin) #define LED_off(x) pin_set(x ## _port, x ## _pin) +#define LEDT_on(x) pin_set(LEDT ## x ## _port, LEDT ## x ## _pin) +#define LEDT_off(x) pin_clear(LEDT ## x ## _port, LEDT ## x ## _pin) +#define LEDT_blink(x) pin_toggle(LEDT ## x ## _port, LEDT ## x ## _pin) // PA1 - USB On (in) #define USBisOn() (GPIOA->IDR & 1<<1) diff --git a/STM32/Tcalc_screen_ver2/main.c b/STM32/Tcalc_screen_ver2/main.c index be47f35..a77467e 100644 --- a/STM32/Tcalc_screen_ver2/main.c +++ b/STM32/Tcalc_screen_ver2/main.c @@ -23,7 +23,6 @@ #include "i2c.h" #include "proto.h" #include "ssd1306.h" -#include "usart.h" #include "usb.h" static uint16_t coefficients[2][5]; // Coefficients for given sensors @@ -60,15 +59,8 @@ uint8_t sprintu(char *buf, uint8_t buflen, uint32_t val){ } return l; } -/* -// print 32bit unsigned int -void printu(uint32_t val){ - char buf[11]; - uint8_t l = sprintu(buf, 11, val); - while(LINE_BUSY == usart_send_blocking(buf, l)); -}*/ -void getcoeffs(uint8_t addr){ // show norm coefficiens +void getcoeffs(uint8_t addr){ // get norm coefficiens int i; const uint8_t regs[5] = {0xAA, 0xA8, 0xA6, 0xA4, 0xA2}; // commands for coefficients uint32_t K; @@ -98,7 +90,6 @@ uint8_t calc_t(uint32_t t, int i){ getcoeffs(Taddr[i]); } if(coefficients[i][0] == 0){ - USEND("no sensor\n"); return 0; } if (t < 6500000 || t > 13000000) return 0; // wrong value - too small or too large @@ -148,7 +139,8 @@ int main(void){ SysTick_Config(6000, 1); gpio_setup(); LED_on(LED0); - usart_setup(); + LEDT_off(0); + LEDT_off(1); USB_setup(); i2c_setup(LOW_SPEED); spi_setup(); @@ -179,7 +171,7 @@ int main(void){ LED_off(LED1); if(++uptime > UPTIME - 3){ ssd1306_Fill(0); - ssd1306_WriteString("Power off!", Font_16x26, 1); + ssd1306_WriteString("Power\n off!", Font_16x26, 1); ssd1306_UpdateScreen(); } if(uptime > UPTIME) POWEROFF(); @@ -194,18 +186,15 @@ int main(void){ uint32_t t; if(read_i2c(Taddr[i], &t, 3) && t){ if(!calc_t(t, i)){ - //USEND("!calc "); write_i2c(Taddr[i], TSYS01_RESET); }else{ err = 0; tgot[i] = Tms; + if(i) LEDT_on(1); + else LEDT_on(0); } started[i] = 0; - }else{ - //USEND("can't read "); } - }else{ - //USEND("can't write "); } }else{ err = 0; @@ -216,7 +205,6 @@ int main(void){ started[i] = Tms ? Tms : 1; err = 0; }else{ - //USEND("can't start conv\n"); started[i] = 0; } } @@ -231,6 +219,8 @@ int main(void){ Tbuf[i][1] = 0; coefficients[i][0] = 0; refreshdisplay = 1; + if(i) LEDT_off(1); + else LEDT_off(0); } } }else errcnt[i] = 0; @@ -240,13 +230,7 @@ int main(void){ char inbuf[256]; if((r = USB_receive(inbuf, 255))){ inbuf[r] = 0; - cmd_parser(inbuf, 1); - } - if(usartrx()){ // usart1 received data, store in in buffer - char *txt = NULL; - r = usart_getline(&txt); - txt[r] = 0; - cmd_parser(txt, 0); + cmd_parser(inbuf); } } return 0; diff --git a/STM32/Tcalc_screen_ver2/proto.c b/STM32/Tcalc_screen_ver2/proto.c index 650a1ce..3ef895d 100644 --- a/STM32/Tcalc_screen_ver2/proto.c +++ b/STM32/Tcalc_screen_ver2/proto.c @@ -25,14 +25,12 @@ #include "i2c.h" #include "proto.h" #include "ssd1306.h" -#include "usart.h" +//#include "usart.h" #include "usb.h" #include // strlen, strcpy( -extern volatile uint8_t canerror; - static char buff[UARTBUFSZ+1], *bptr = buff; -static uint8_t blen = 0, USBcmd = 0; +static uint8_t blen = 0; // LEDs are OFF by default uint8_t noLED = 1; @@ -40,8 +38,7 @@ void sendbuf(){ IWDG->KR = IWDG_REFRESH; if(blen == 0) return; *bptr = 0; - if(USBcmd) USB_send(buff); - else while(LINE_BUSY == usart_send(buff, blen)){IWDG->KR = IWDG_REFRESH;} + USB_send(buff); bptr = buff; blen = 0; } @@ -51,8 +48,7 @@ void addtobuf(const char *txt){ int l = strlen(txt); if(l > UARTBUFSZ){ sendbuf(); - if(USBcmd) USB_send(txt); - else while(LINE_BUSY == usart_send_blocking(txt, l)){IWDG->KR = IWDG_REFRESH;} + USB_send(txt); }else{ if(blen+l > UARTBUFSZ){ sendbuf(); @@ -75,13 +71,17 @@ void bufputchar(char ch){ /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data - * @param isUSB - == 1 if data got from USB */ -void cmd_parser(char *txt, uint8_t isUSB){ - USBcmd = isUSB; +void cmd_parser(char *txt){ char _1st = txt[0]; sendbuf(); switch(_1st){ + case '0': + LEDT_blink(0); + break; + case '1': + LEDT_blink(1); + break; case 'b': ssd1306_Fill(0); ssd1306_UpdateScreen(); @@ -119,7 +119,8 @@ void cmd_parser(char *txt, uint8_t isUSB){ break; default: // help SEND( - "ALL little letters - without CAN messaging\n" + "Commands:\n" + "0/1 - invert LEDT0/1\n" "b - clear screen\n" "c - fill screen white\n" "D - discovery sensors\n" diff --git a/STM32/Tcalc_screen_ver2/proto.h b/STM32/Tcalc_screen_ver2/proto.h index 5b9f47b..7a44d6c 100644 --- a/STM32/Tcalc_screen_ver2/proto.h +++ b/STM32/Tcalc_screen_ver2/proto.h @@ -26,6 +26,8 @@ #include "stm32f0.h" +#define UARTBUFSZ (64) + // macro for static strings #define SEND(str) do{addtobuf(str);}while(0) @@ -38,7 +40,7 @@ #define newline() do{bufputchar('\n');}while(0) extern uint8_t noLED; -void cmd_parser(char *buf, uint8_t isUSB); +void cmd_parser(char *buf); void addtobuf(const char *txt); void bufputchar(char ch); void printu(uint32_t val); diff --git a/STM32/Tcalc_screen_ver2/spi.c b/STM32/Tcalc_screen_ver2/spi.c index f0080e6..572a49b 100644 --- a/STM32/Tcalc_screen_ver2/spi.c +++ b/STM32/Tcalc_screen_ver2/spi.c @@ -22,7 +22,7 @@ */ #include "spi.h" -#include "usart.h" +//#include "usart.h" extern volatile uint32_t Tms; static uint32_t tstart; diff --git a/STM32/Tcalc_screen_ver2/ssd1306.c b/STM32/Tcalc_screen_ver2/ssd1306.c index ef2327f..45990fd 100644 --- a/STM32/Tcalc_screen_ver2/ssd1306.c +++ b/STM32/Tcalc_screen_ver2/ssd1306.c @@ -22,7 +22,8 @@ */ #include "spi.h" #include "ssd1306.h" -#include "usart.h" +//#include "usart.h" +#include "proto.h" #include // memset #define RST_PAUSE (10) diff --git a/STM32/Tcalc_screen_ver2/tcalc_screen.bin b/STM32/Tcalc_screen_ver2/tcalc_screen.bin index 0f0e085c8d59083a16898226e4b829cfd4126ca5..0f93d29cfaa422df0b00ba78b68967c9f9f354e5 100755 GIT binary patch delta 3261 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 delta 3782 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 diff --git a/STM32/Tcalc_screen_ver2/usart.c b/STM32/Tcalc_screen_ver2/usart.c deleted file mode 100644 index b79aa84..0000000 --- a/STM32/Tcalc_screen_ver2/usart.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * usart.c - * - * Copyright 2017 Edward V. Emelianoff - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ -#include "stm32f0.h" -#include "hardware.h" -#include "usart.h" -#include - -extern volatile uint32_t Tms; -static int datalen[2] = {0,0}; // received data line length (including '\n') - -volatile int linerdy = 0, // received data ready - dlen = 0, // length of data (including '\n') in current buffer - bufovr = 0, // input buffer overfull - txrdy = 1 // transmission done -; - - -int rbufno = 0; // current rbuf number -static char rbuf[UARTBUFSZ][2], tbuf[UARTBUFSZ]; // receive & transmit buffers -static char *recvdata = NULL; - -/** - * return length of received data (without trailing zero - */ -int usart_getline(char **line){ - if(bufovr){ - bufovr = 0; - linerdy = 0; - return 0; - } - *line = recvdata; - linerdy = 0; - return dlen; -} - -TXstatus usart_send(const char *str, int len){ - if(!txrdy) return LINE_BUSY; - if(len > UARTBUFSZ) return STR_TOO_LONG; - txrdy = 0; - memcpy(tbuf, str, len); -#if USARTNUM == 2 - DMA1_Channel4->CCR &= ~DMA_CCR_EN; - DMA1_Channel4->CNDTR = len; - DMA1_Channel4->CCR |= DMA_CCR_EN; // start transmission -#elif USARTNUM == 1 - DMA1_Channel2->CCR &= ~DMA_CCR_EN; - DMA1_Channel2->CNDTR = len; - DMA1_Channel2->CCR |= DMA_CCR_EN; -#else -#error "Not implemented" -#endif - return ALL_OK; -} - -TXstatus usart_send_blocking(const char *str, int len){ - if(!txrdy) return LINE_BUSY; - int i; - bufovr = 0; - for(i = 0; i < len; ++i){ - USARTX -> TDR = *str++; - while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;}; - } - return ALL_OK; -} - -void usart_send_blck(const char *str){ - while(!txrdy){IWDG->KR = IWDG_REFRESH;} - bufovr = 0; - while(*str){ - USARTX -> TDR = *str++; - while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;}; - } -} - -void usart_setup(){ -// Nucleo's USART2 connected to VCP proxy of st-link -#if USARTNUM == 2 - // setup pins: PA2 (Tx - AF1), PA15 (Rx - AF1) - // AF mode (AF1) - GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER2|GPIO_MODER_MODER15))\ - | (GPIO_MODER_MODER2_AF | GPIO_MODER_MODER15_AF); - GPIOA->AFR[0] = (GPIOA->AFR[0] &~GPIO_AFRH_AFRH2) | 1 << (2 * 4); // PA2 - GPIOA->AFR[1] = (GPIOA->AFR[1] &~GPIO_AFRH_AFRH7) | 1 << (7 * 4); // PA15 - // DMA: Tx - Ch4 - DMA1_Channel4->CPAR = (uint32_t) &USART2->TDR; // periph - DMA1_Channel4->CMAR = (uint32_t) tbuf; // mem - DMA1_Channel4->CCR |= DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 8bit, mem++, mem->per, transcompl irq - // Tx CNDTR set @ each transmission due to data size - NVIC_SetPriority(DMA1_Channel4_5_IRQn, 3); - NVIC_EnableIRQ(DMA1_Channel4_5_IRQn); - NVIC_SetPriority(USART2_IRQn, 0); - // setup usart2 - RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // clock - // oversampling by16, 115200bps (fck=48mHz) - //USART2_BRR = 0x1a1; // 48000000 / 115200 - USART2->BRR = 480000 / 1152; - USART2->CR3 = USART_CR3_DMAT; // enable DMA Tx - USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART - while(!(USART2->ISR & USART_ISR_TC)); // polling idle frame Transmission - USART2->ICR |= USART_ICR_TCCF; // clear TC flag - USART2->CR1 |= USART_CR1_RXNEIE; - NVIC_EnableIRQ(USART2_IRQn); -// USART1 of main board -#elif USARTNUM == 1 - // PA9 - Tx, PA10 - Rx (AF1) - GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10))\ - | (GPIO_MODER_MODER9_AF | GPIO_MODER_MODER10_AF); - GPIOA->AFR[1] = (GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH1 | GPIO_AFRH_AFRH2)) | - 1 << (1 * 4) | 1 << (2 * 4); // PA9, PA10 - // USART1 Tx DMA - Channel2 (default value in SYSCFG_CFGR1) - DMA1_Channel2->CPAR = (uint32_t) &USART1->TDR; // periph - DMA1_Channel2->CMAR = (uint32_t) tbuf; // mem - DMA1_Channel2->CCR |= DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 8bit, mem++, mem->per, transcompl irq - // Tx CNDTR set @ each transmission due to data size - NVIC_SetPriority(DMA1_Channel2_3_IRQn, 3); - NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); - NVIC_SetPriority(USART1_IRQn, 0); - // setup usart1 - RCC->APB2ENR |= RCC_APB2ENR_USART1EN; - USART1->BRR = 480000 / 1152; - USART1->CR3 = USART_CR3_DMAT; // enable DMA Tx - USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART - while(!(USART1->ISR & USART_ISR_TC)); // polling idle frame Transmission - USART1->ICR |= USART_ICR_TCCF; // clear TC flag - USART1->CR1 |= USART_CR1_RXNEIE; - NVIC_EnableIRQ(USART1_IRQn); -#else -#error "Not implemented" -#endif -} - -#if USARTNUM == 2 -void usart2_isr(){ -// USART1 -#elif USARTNUM == 1 -void usart1_isr(){ -#else -#error "Not implemented" -#endif - #ifdef CHECK_TMOUT - static uint32_t tmout = 0; - #endif - if(USARTX->ISR & USART_ISR_RXNE){ // RX not emty - receive next char - #ifdef CHECK_TMOUT - if(tmout && Tms >= tmout){ // set overflow flag - bufovr = 1; - datalen[rbufno] = 0; - } - tmout = Tms + TIMEOUT_MS; - if(!tmout) tmout = 1; // prevent 0 - #endif - // read RDR clears flag - uint8_t rb = USARTX->RDR; - if(datalen[rbufno] < UARTBUFSZ){ // put next char into buf - rbuf[rbufno][datalen[rbufno]++] = rb; - if(rb == '\n'){ // got newline - line ready - linerdy = 1; - dlen = datalen[rbufno]; - recvdata = rbuf[rbufno]; - // prepare other buffer - rbufno = !rbufno; - datalen[rbufno] = 0; - #ifdef CHECK_TMOUT - // clear timeout at line end - tmout = 0; - #endif - } - }else{ // buffer overrun - bufovr = 1; - datalen[rbufno] = 0; - #ifdef CHECK_TMOUT - tmout = 0; - #endif - } - } -} - -#if USARTNUM == 2 -void dma1_channel4_5_isr(){ - if(DMA1->ISR & DMA_ISR_TCIF4){ // Tx - DMA1->IFCR |= DMA_IFCR_CTCIF4; // clear TC flag - txrdy = 1; - } -} -// USART1 -#elif USARTNUM == 1 -void dma1_channel2_3_isr(){ - if(DMA1->ISR & DMA_ISR_TCIF2){ // Tx - DMA1->IFCR |= DMA_IFCR_CTCIF2; // clear TC flag - txrdy = 1; - } -} -#else -#error "Not implemented" -#endif diff --git a/STM32/Tcalc_screen_ver2/usart.h b/STM32/Tcalc_screen_ver2/usart.h deleted file mode 100644 index 256e404..0000000 --- a/STM32/Tcalc_screen_ver2/usart.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * usart.h - * - * Copyright 2017 Edward V. Emelianoff - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ -#pragma once -#ifndef __USART_H__ -#define __USART_H__ - -// input and output buffers size -#define UARTBUFSZ (64) -// timeout between data bytes -#ifndef TIMEOUT_MS -#define TIMEOUT_MS (1500) -#endif - -typedef enum{ - ALL_OK, - LINE_BUSY, - STR_TOO_LONG -} TXstatus; - -#define usartrx() (linerdy) -#define usartovr() (bufovr) - -extern volatile int linerdy, bufovr, txrdy; - -void usart_setup(); -int usart_getline(char **line); -TXstatus usart_send(const char *str, int len); -TXstatus usart_send_blocking(const char *str, int len); -void usart_send_blck(const char *str); - -#define USEND(str) do{}while(LINE_BUSY == usart_send(str, sizeof(str)-1)) -#define UNEWLINE() do{}while(LINE_BUSY == usart_send("\n", 1)) - -#endif // __USART_H__ diff --git a/STM32/Tcalc_screen_ver2/usb.c b/STM32/Tcalc_screen_ver2/usb.c index 1d4bf8f..12f3bf5 100644 --- a/STM32/Tcalc_screen_ver2/usb.c +++ b/STM32/Tcalc_screen_ver2/usb.c @@ -23,7 +23,6 @@ #include "usb.h" #include "usb_lib.h" -#include "usart.h" #include // memcpy, memmove // incoming buffer size @@ -112,6 +111,7 @@ void usb_proc(){ } void USB_send(const char *buf){ + if(!USB_configured()) return; uint16_t l = 0, ctr = 0; const char *p = buf; while(*p++) ++l; diff --git a/STM32/Tcalc_screen_ver2/usb_lib.c b/STM32/Tcalc_screen_ver2/usb_lib.c index 53c86d8..860fca5 100644 --- a/STM32/Tcalc_screen_ver2/usb_lib.c +++ b/STM32/Tcalc_screen_ver2/usb_lib.c @@ -24,7 +24,6 @@ #include #include "usb_lib.h" #include // memcpy -#include "usart.h" ep_t endpoints[ENDPOINTS_NUM];