From 16f3b31f4f819be1a22bb0a0ccf816c90ff15d8c Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 8 May 2023 01:30:34 +0300 Subject: [PATCH] add BME280, try to work with SPI TFT display (no reaction yet) --- F3:F303/NitrogenFlooding/Makefile | 1 + F3:F303/NitrogenFlooding/Readme.md | 6 +- F3:F303/NitrogenFlooding/hardware.c | 10 ++- F3:F303/NitrogenFlooding/hardware.h | 15 ++++ F3:F303/NitrogenFlooding/i2c.c | 33 ++++---- F3:F303/NitrogenFlooding/main.c | 21 ++++- F3:F303/NitrogenFlooding/nitrogen.bin | Bin 10400 -> 20212 bytes F3:F303/NitrogenFlooding/nitrogen.files | 6 ++ F3:F303/NitrogenFlooding/proto.c | 108 +++++++++++++++++++++++- F3:F303/NitrogenFlooding/strfunc.c | 2 +- F3:F303/NitrogenFlooding/strfunc.h | 2 +- F3:F303/NitrogenFlooding/version.inc | 4 +- F3:F303/inc/Fx/common_macros.h | 4 + makefile.stm32 | 5 +- 14 files changed, 187 insertions(+), 30 deletions(-) diff --git a/F3:F303/NitrogenFlooding/Makefile b/F3:F303/NitrogenFlooding/Makefile index eb27ee2..a4468d2 100644 --- a/F3:F303/NitrogenFlooding/Makefile +++ b/F3:F303/NitrogenFlooding/Makefile @@ -4,6 +4,7 @@ MCU := F302xc # change this linking script depending on particular MCU model, LDSCRIPT := stm32f302xB.ld DEFINES := -DUSB1_16 +LDADD := -lm include ../makefile.f3 include ../../makefile.stm32 diff --git a/F3:F303/NitrogenFlooding/Readme.md b/F3:F303/NitrogenFlooding/Readme.md index 063860b..4b84c25 100644 --- a/F3:F303/NitrogenFlooding/Readme.md +++ b/F3:F303/NitrogenFlooding/Readme.md @@ -59,7 +59,7 @@ Automated liquid nitrogen flooding machine | 48 | PB11 | SCRN RST | slow out | Screen reset | | 49 | (VSS) | | | | | 50 | (VDD) | | | | -| 51 | PB12 | SCRN NSS | slow out | Screen activate | +| 51 | PB12 | SCRN LED | slow out | Screen LEDs on | | 52 | PB13 | SCRN SCK | AF5 | SPI for screen | | 53 | PB14 | SCRN MISO | AF5 | | | 54 | PB15 | SCRN MOSI | AF5 | | @@ -143,7 +143,7 @@ Automated liquid nitrogen flooding machine | 96 | PB9 | - | - | | | 47 | PB10 | SCRN DCRS | slow out | Screen data/cmd | | 48 | PB11 | SCRN RST | slow out | Screen reset | -| 51 | PB12 | SCRN NSS | slow out | Screen activate | +| 51 | PB12 | SCRN LED | slow out | Screen LEDs on | | 52 | PB13 | SCRN SCK | AF5 | SPI for screen | | 53 | PB14 | SCRN MISO | AF5 | | | 54 | PB15 | SCRN MOSI | AF5 | | @@ -208,6 +208,8 @@ Automated liquid nitrogen flooding machine ### DMA1 - Channel 1 - ADC1 +- Channel 4 - SPI2 Rx +- Channel 5 - SPI2 Tx - Channel 6 - I2C1 Tx - Channel 7 - I2C1 Rx diff --git a/F3:F303/NitrogenFlooding/hardware.c b/F3:F303/NitrogenFlooding/hardware.c index f644ce2..420c181 100644 --- a/F3:F303/NitrogenFlooding/hardware.c +++ b/F3:F303/NitrogenFlooding/hardware.c @@ -18,6 +18,7 @@ #include "hardware.h" #include "i2c.h" +#include "spi.h" int LEDsON = 1; @@ -47,10 +48,10 @@ TRUE_INLINE void gpio_setup(){ GPIOB->AFR[0] = AFRf(4, 6) | AFRf(4, 7); GPIOB->AFR[1] = AFRf(5, 13) | AFRf(5, 14) | AFRf(5, 15); GPIOB->MODER = MODER_O(0) | MODER_AF(6) | MODER_AF(7) | MODER_O(10) | MODER_O(11) | MODER_O(12) | MODER_AF(13) - | MODER_AF(14) | MODER_AF(15); - GPIOB->OSPEEDR = OSPEED_HI(6) | OSPEED_HI(7) | OSPEED_MED(13) | OSPEED_MED(14) | OSPEED_MED(15); + | MODER_AF(14) | MODER_AF(15); // 10-DC, 11-RST, 12-LED, 13-SCK, 14-MISO, 15-MOSI + GPIOB->OSPEEDR = OSPEED_HI(6) | OSPEED_HI(7) | OSPEED_HI(13) | OSPEED_HI(14) | OSPEED_HI(15); GPIOB->OTYPER = 0; - GPIOB->PUPDR = 0; + GPIOB->PUPDR = PUPD_PU(14); // PU MISO // PORT C //GPIOC->ODR = 0; @@ -134,7 +135,8 @@ TRUE_INLINE void iwdg_setup(){ void hw_setup(){ RCC->AHBENR |= RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN; gpio_setup(); - i2c_setup(HIGH_SPEED); + i2c_setup(LOW_SPEED); + spi_setup(); pwm_setup(); #ifndef EBUG iwdg_setup(); diff --git a/F3:F303/NitrogenFlooding/hardware.h b/F3:F303/NitrogenFlooding/hardware.h index 986a517..bfbbaa2 100644 --- a/F3:F303/NitrogenFlooding/hardware.h +++ b/F3:F303/NitrogenFlooding/hardware.h @@ -49,6 +49,21 @@ #define LED_on(x) do{if(LEDsON) pin_clear(LEDs_port, 1<<(8+x));}while(0) #define LED_get(x) (LEDs_port->IDR & 1<<(8+x) ? 0 : 1) +// screen LEDon/off - PB12; reset - PB11; data/command - PB10 +#define SCRN_LED_pin (1<<12) +#define SCRN_LED_port (GPIOB) +#define SCRN_LED_set(a) do{if(a) pin_set(SCRN_LED_port, SCRN_LED_pin); else pin_clear(SCRN_LED_port, SCRN_LED_pin);}while(0) +#define SCRN_LED_get() (SCRN_LED_port->IDR & SCRN_LED_pin ? 1: 0) +#define SCRN_RST_pin (1<<11) +#define SCRN_RST_port (GPIOB) +#define SCRN_RST_set(a) do{if(a) pin_set(SCRN_RST_port, SCRN_RST_pin); else pin_clear(SCRN_RST_port, SCRN_RST_pin);}while(0) +#define SCRN_RST_get() (SCRN_RST_port->IDR & SCRN_RST_pin ? 1: 0) +#define SCRN_DCX_pin (1<<10) +#define SCRN_DCX_port (GPIOB) +#define SCRN_DCX_get() (SCRN_DCX_port->IDR & SCRN_DCX_pin ? 1: 0) +#define SCRN_Data() do{pin_set(SCRN_DCX_port, SCRN_DCX_pin);}while(0) +#define SCRN_Command() do{pin_clear(SCRN_DCX_port, SCRN_DCX_pin);}while(0) + // Buttons amount #define BTNSNO (7) #define BTNs_port GPIOD diff --git a/F3:F303/NitrogenFlooding/i2c.c b/F3:F303/NitrogenFlooding/i2c.c index 41e85c9..881577a 100644 --- a/F3:F303/NitrogenFlooding/i2c.c +++ b/F3:F303/NitrogenFlooding/i2c.c @@ -42,7 +42,7 @@ static uint8_t I2Cbuf[256], i2cbuflen = 0; // buffer for DMA tx/rx and its len static inline int isI2Cbusy(){ cntr = Tms; do{ - if(Tms - cntr > I2C_TIMEOUT){ USND("Timeout, DMA transfer in progress?\n"); return 1;} + if(Tms - cntr > I2C_TIMEOUT){ USND("Timeout, DMA transfer in progress?"); return 1;} }while(I2Cbusy); return 0; } @@ -103,7 +103,7 @@ static uint8_t i2c_start(uint8_t busychk){ while(I2C1->ISR & I2C_ISR_BUSY){ IWDG->KR = IWDG_REFRESH; if(Tms - cntr > I2C_TIMEOUT){ - USND("Line busy\n"); + USND("Line busy"); return 0; // check busy }} } @@ -111,7 +111,7 @@ static uint8_t i2c_start(uint8_t busychk){ while(I2C1->CR2 & I2C_CR2_START){ IWDG->KR = IWDG_REFRESH; if(Tms - cntr > I2C_TIMEOUT){ - USND("No start\n"); + USND("No start"); return 0; // check start }} return 1; @@ -143,11 +143,11 @@ static uint8_t write_i2cs(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t s IWDG->KR = IWDG_REFRESH; if(I2C1->ISR & I2C_ISR_NACKF){ I2C1->ICR |= I2C_ICR_NACKCF; - //USND("NAK\n"); + DBG("NAK"); return 0; } if(Tms - cntr > I2C_TIMEOUT){ - //USND("Timeout\n"); + DBG("Timeout"); return 0; } } @@ -163,7 +163,10 @@ static uint8_t write_i2cs(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t s } uint8_t write_i2c(uint8_t addr, uint8_t *data, uint8_t nbytes){ - if(isI2Cbusy()) return 0; + if(isI2Cbusy()){ + DBG("I2C busy"); + return 0; + } return write_i2cs(addr, data, nbytes, 1); } @@ -203,11 +206,11 @@ static uint8_t read_i2cb(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t bu IWDG->KR = IWDG_REFRESH; if(I2C1->ISR & I2C_ISR_NACKF){ I2C1->ICR |= I2C_ICR_NACKCF; - //USND("NAK\n"); + //DBG("NAK"); return 0; } if(Tms - cntr > I2C_TIMEOUT){ - //USND("Timeout\n"); + //DBG("Timeout"); return 0; } } @@ -250,22 +253,22 @@ uint8_t read_i2c_reg16(uint8_t addr, uint16_t reg16, uint8_t *data, uint8_t nbyt void i2c_init_scan_mode(){ i2caddr = 1; // start from 1 as 0 is a broadcast address I2C_scan_mode = 1; + DBG("init scan"); } // return 1 if next addr is active & return in as `addr` // if addresses are over, return 1 and set addr to I2C_NOADDR // if scan mode inactive, return 0 and set addr to I2C_NOADDR int i2c_scan_next_addr(uint8_t *addr){ - if(isI2Cbusy()) return 0; + if(isI2Cbusy()){ + DBG("scan: busy"); + return 0; + } *addr = i2caddr; if(i2caddr == I2C_ADDREND){ - *addr = I2C_ADDREND; I2C_scan_mode = 0; return 0; } - /*while(!u3txrdy); - USND("Addr: "); USND(uhex2str(i2caddr)); USND("\n"); - usart3_sendbuf();*/ uint8_t byte; if(!read_i2c((i2caddr++)<<1, &byte, 1)) return 0; return 1; @@ -274,10 +277,10 @@ int i2c_scan_next_addr(uint8_t *addr){ // dump I2Cbuf void i2c_bufdudump(){ if(goterr){ - USND("Last transfer ends with error!\n"); + USND("Last transfer ends with error!"); goterr = 0; } - USND("I2C buffer:\n"); + USND("I2C buffer:"); hexdump(USB_sendstr, I2Cbuf, i2cbuflen); } diff --git a/F3:F303/NitrogenFlooding/main.c b/F3:F303/NitrogenFlooding/main.c index f29f1dc..4638c7a 100644 --- a/F3:F303/NitrogenFlooding/main.c +++ b/F3:F303/NitrogenFlooding/main.c @@ -17,12 +17,14 @@ */ #include "adc.h" +#include "BMP280.h" //#include "buttons.h" //#include "can.h" //#include "flash.h" #include "hardware.h" #include "i2c.h" #include "proto.h" +#include "strfunc.h" #include "usb.h" #define MAXSTRLEN RBINSZ @@ -47,6 +49,7 @@ int main(void){ USB_setup(); //CAN_setup(the_conf.CANspeed); adc_setup(); + BMP280_setup(0); USBPU_ON(); uint32_t ctr = 0; // CAN_message *can_mesg; @@ -86,7 +89,23 @@ int main(void){ USB_sendstr(") - found device\n"); } } - i2c_have_DMA_Rx(); // check if there's DMA Rx complete + //i2c_have_DMA_Rx(); // check if there's DMA Rx complete + BMP280_process(); + BMP280_status s = BMP280_get_status(); + if(s == BMP280_RDY){ // data ready - get it + float T, P, H; + if(BMP280_getdata(&T, &P, &H)){ + USB_sendstr("T="); USB_sendstr(float2str(T, 2)); USB_sendstr("\nP="); + USB_sendstr(float2str(P, 1)); + P *= 0.00750062f; USB_sendstr("\nPmm="); USB_sendstr(float2str(P, 1)); + USB_sendstr("\nH="); USB_sendstr(float2str(H, 1)); + USB_sendstr("\nTdew="); USB_sendstr(float2str(Tdew(T, H), 1)); + newline(); + }else USB_sendstr("Can't read data\n"); + }else if(s == BMP280_ERR){ + USB_sendstr("BME280 error\n"); + BMP280_init(); + } int l = USB_receivestr(inbuff, MAXSTRLEN); if(l < 0) USB_sendstr("ERROR: USB buffer overflow or string was too long\n"); else if(l){ diff --git a/F3:F303/NitrogenFlooding/nitrogen.bin b/F3:F303/NitrogenFlooding/nitrogen.bin index 26b440d09a5041cf6ecc9af787a611bf379125fa..ffeaab076e52222f56875048c06f79e254a32a82 100755 GIT binary patch delta 13268 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 delta 3390 zcmbtW4Qx}_6+Z9TCNGXdoWGJd2A-W5?EEl?5XgWQ#~}|pP8>?JwWACk9zSOM#DpNy zj?Sr85UhcfUFbk-X*QLOja3U|uF4h@O3_MJ=$t92q0o^|rA}KwuU&$TaqOM@5~7J} zs-{}{e9pP={NHo$d&4g?osasV6Zk6z;4UNj9soS>qdF9HnbKPIS8X2j@inrayOau? z>YF?IO7dS5cwFEAjVt)S0^cZjAYST3%e!|opD+wZHY*~t8R<++%`?)W7%za-lVqgV zWqBXUDP2;q!+!H0dLd1?5r$rl0e+2p`DGHzdMe%1#7g&3vAki0*eGeg`%nDeQ&Zw8cWv}2zBpc^7~yM} ziV|^_W0vcLxJkSzHV)seReEYYB@HUE#A&SKU5&%G++E^g(b8~UwBJ!{(>?Vb+Z|0U zCz>4l#Cp-xa6vRVO^#eolSeBa6j{DW?4K^`Ju5u<;!ENR@tO$I&FD0j@TJK9z|d~8 zeR*9=TGAh7n#lR|bBkfCIT)!*mNR4-dLhrxn>0$-r{5ggLmuva~)_{<_dgD4ahibFVFL+Ix$`ng4YV%|6Mf$KzB;nKCSr+rJnsPiQw zA-4A>*_HLJRI0uSSlh=Wm{sAY(oIA=T|vs$WqX;5Y!S`m4wro@HNG~YdS;gk4D5mB zUL(%Ya*=Xbk|skNVvn@fG35vB>;cu4)Is*h7_S_F-tT!cQDdZUhfC)LgHdX4(V?Br z`wJ%HGJB+D%xW2$aT8_=G|TtyXYTa>P&Tp;x6d9kI;6SW|!@dXXnqwp)lv-2CT zN8>LbxqsGOgw?yJMpJD4d_AM;^*m0gaH0f%he#RC$%&iX9kwcj93T_Wgtz<>M&-7=s6gs&JSeJA*f4zr=yfc*KONRL5h#wujO70q>)it%f->Ls~f9|gJ1f5l-}61D0)KA1hoMrUOwyY z@xoXI?_&j8%$f@%BQ6X{E8qe&q4!2XdU3S(-;F<;&C3oCda`TY73m7}j^fF- zVM25(ln_%XET#cpKqY8|;*)Di^aDpu@fgRhi&Ih(pCr%@9~-4L{swdHlyluNO8apX z<-?x zEV^r8sgiThd;mo>@G~(324?0YBf6xfbfizds&Rd5%q$p?W?=PIpz57LdhAYG5s`d*LI zX47dUQN5QPh!W3K!9O+ju;Dp7FXZ&HuVC%-80lzKDS-K0h_QmCj4{7MN$QIIIjnQ* zabwoUeO@s4g>>}=4FzsI57Npw?e3HDrl?W_(&KT>92%_*WljU;o={U%vk*!?>!aOv zjIBzGEgwUZAhb7xVzd7zCdPu zVVmNlFK9DnIJJ&sWPhB@G0!RO#~^w<<3mXERKS0967Tow$?nOGbg&vF;EaMrsKTCy z;^d&YXc9FT0&>QzQ&CnVADT_(!*MW=gvMTEW_-2mPD){glmz-JgkEvne?O37%lsTF zMguH<3aJFOAro_%A17^=+1Wee6>U&*yKkYu3(?>Jde0$2%imQ|#@k&z>jd-A4Ia3wh_?~z zr;j1X6W033{1xM_Wk<+^2sY||CGuCM0%yW-nTR-s?wASOLc~%;+f4GbbvffDm#vHN zKeyajFfE?I{gkgvRHh$$hf$HzJ>;qK3bLtYVQu~DZLNH3%jzxL)~#*f*KS#}jo-1M z)yuDKX=!dTsKGhAhWBh=hY#ng@ytQ}hAnGxVcSzExtsZIt*cvF)#O;MiBXdb!9-ex zIV2?P&#auw+xXem*%f8h$}($(8c6e!O7f>A3%jcv^BD3+XD(^2dxP}5&Szc30SO_L zn4A@Hd(4q-%lOgw%(ies+#i3;O9m{ve_f^^YU%GQk2_>Fl`DI~kZG^8JXt$j6Z?G3Tjh mP>OU8Vnl<3fOP2$@`!s{W*(jcU}>bWpPp=X7brR0%KrfFjd#ZY diff --git a/F3:F303/NitrogenFlooding/nitrogen.files b/F3:F303/NitrogenFlooding/nitrogen.files index 0b934c7..a6753f2 100644 --- a/F3:F303/NitrogenFlooding/nitrogen.files +++ b/F3:F303/NitrogenFlooding/nitrogen.files @@ -1,3 +1,5 @@ +BMP280.c +BMP280.h adc.c adc.h buttons.c @@ -16,6 +18,8 @@ hashgen/hdr.h hashgen/test.c i2c.c i2c.h +ili9341.c +ili9341.h main.c pdnuart.c pdnuart.h @@ -23,6 +27,8 @@ proto.c proto.h ringbuffer.c ringbuffer.h +spi.c +spi.h steppers.c steppers.h strfunc.c diff --git a/F3:F303/NitrogenFlooding/proto.c b/F3:F303/NitrogenFlooding/proto.c index e9c86e9..6ac418c 100644 --- a/F3:F303/NitrogenFlooding/proto.c +++ b/F3:F303/NitrogenFlooding/proto.c @@ -17,9 +17,11 @@ */ #include "adc.h" +#include "BMP280.h" #include "hardware.h" #include "i2c.h" #include "proto.h" +#include "ili9341.h" #include "strfunc.h" #include "version.inc" @@ -37,21 +39,30 @@ static int goodstub(const char *cmd, int parno, const char *carg, int32_t iarg){ return RET_GOOD; } +// send over USB cmd[parno][=i] static void sendkey(const char *cmd, int parno, int32_t i){ USB_sendstr(cmd); if(parno > -1) USB_sendstr(u2str((uint32_t)parno)); USB_putbyte('='); USB_sendstr(i2str(i)); newline(); } +// `sendkey` for floating parameter static void sendkeyf(const char *cmd, int parno, float f){ USB_sendstr(cmd); if(parno > -1) USB_sendstr(u2str((uint32_t)parno)); USB_putbyte('='); USB_sendstr(float2str(f, 2)); newline(); } +// `sendkey` for uint32_t static void sendkeyu(const char *cmd, int parno, uint32_t u){ USB_sendstr(cmd); if(parno > -1) USB_sendstr(u2str((uint32_t)parno)); USB_putbyte('='); USB_sendstr(u2str(u)); newline(); } +// `sendkey` for uint32_t out in hex +static void sendkeyuhex(const char *cmd, int parno, uint32_t u){ + USB_sendstr(cmd); + if(parno > -1) USB_sendstr(u2str((uint32_t)parno)); + USB_putbyte('='); USB_sendstr(uhex2str(u)); newline(); +} static int leds(const char *cmd, int parno, const char *c, int32_t i){ if(parno < 0){ // enable/disable all @@ -72,6 +83,30 @@ static int leds(const char *cmd, int parno, const char *c, int32_t i){ return RET_GOOD; } +static int bme(const char _U_ *cmd, int _U_ parno, const char _U_ *c, int32_t _U_ i){ + if(BMP280_get_status() == BMP280_NOTINIT){ + DBG("Need 2 init"); + if(!BMP280_init()){ + USND("Can't init"); + return RET_BAD; + } + } + if(!BMP280_start()) return RET_BAD; + return RET_GOOD; +} + +static int bmefilter(const char _U_ *cmd, int _U_ parno, const char _U_ *c, int32_t _U_ i){ + BMP280_Filter f = BMP280_FILTER_OFF; + if(c){ + if(i < 0 || i >= BMP280_FILTERMAX) return RET_WRONGARG; + f = (BMP280_Filter) i; + BMP280_setfilter(f); + if(!BMP280_init()) return RET_BAD; + } + sendkey(cmd, -1, BMP280_getfilter()); + return RET_GOOD; +} + static int buzzer(const char *cmd, int _U_ parno, const char _U_ *c, int32_t i){ if(c){ if(i > 0) BUZZER_ON(); @@ -88,9 +123,29 @@ static int i2scan(const char _U_ *cmd, int _U_ parno, const char _U_ *c, int32_t static int i2addr(const char *cmd, int _U_ parno, const char *c, int32_t i){ if(c){ if(i < 0 || i>= I2C_ADDREND) return RET_WRONGARG; - I2Caddress = (uint8_t) i; + I2Caddress = ((uint8_t) i)<<1; } - sendkey(cmd, -1, I2Caddress); + sendkey(cmd, -1, I2Caddress>>1); + return RET_GOOD; +} +static int i2reg(const char *cmd, int parno, const char _U_ *c, int32_t i){ + if(parno < 0 || parno > 127) return RET_WRONGPARNO; + uint8_t d[2]; + if(c){ + if(i < 0 || i > 255) return RET_WRONGARG; + d[0] = parno; d[1] = (uint8_t)i; + if(!write_i2c(I2Caddress, d, 2)) return RET_BAD; + } + if(!read_i2c_reg(I2Caddress, (uint8_t)parno, d, 1)) return RET_BAD; + sendkey(cmd, parno, d[0]); + return RET_GOOD; +} +static int i2read(const char _U_ *cmd, int parno, const char _U_ *c, int32_t _U_ i){ + uint8_t buf[128]; + if(parno < 0 || parno > 128) return RET_WRONGPARNO; + if(!read_i2c(I2Caddress, buf, (uint8_t)parno)) return RET_BAD; + USB_sendstr("I2C got data:\n"); + hexdump(USB_sendstr, buf, parno); return RET_GOOD; } @@ -142,6 +197,45 @@ static int pwm(const char *cmd, int parno, const char *c, int32_t i){ return RET_GOOD; } +static int scrnled(const char *cmd, int _U_ parno, const char *c, int32_t i){ + if(c) SCRN_LED_set(i); + sendkeyu(cmd, -1, SCRN_LED_get()); + return RET_GOOD; +} +static int scrndcr(const char *cmd, int _U_ parno, const char *c, int32_t i){ + if(c){ + if(i) SCRN_Data(); + else SCRN_Command(); + } + sendkeyu(cmd, -1, SCRN_DCX_get()); + return RET_GOOD; +} +static int scrnrst(const char *cmd, int _U_ parno, const char *c, int32_t i){ + if(c) SCRN_RST_set(i); + sendkeyu(cmd, -1, SCRN_RST_get()); + return RET_GOOD; +} +static int scrnrdwr(const char *cmd, int parno, const char *c, int32_t i){ + if(parno < 0) return RET_WRONGPARNO; + if(c){ + if(i < 0 || i > 255) return RET_WRONGARG; + if(!ili9341_writereg(parno, (uint8_t*)&i, 1)) return RET_BAD; + } + i = 0; + if(!ili9341_readreg(parno, (uint8_t*)&i, 1)) return RET_BAD; + sendkeyu(cmd, parno, i); + return RET_GOOD; +} +static int scrnrdwr4(const char *cmd, int parno, const char *c, int32_t i){ + if(parno < 0) return RET_WRONGPARNO; + if(c){ + if(!ili9341_writereg(parno, (uint8_t*)&i, 4)) return RET_BAD; + } + if(!ili9341_readreg(parno, (uint8_t*)&i, 4)) return RET_BAD; + sendkeyuhex(cmd, parno, i); + return RET_GOOD; +} + typedef struct{ int (*fn)(const char*, int, const char*, int32_t); const char *cmd; @@ -151,6 +245,8 @@ typedef struct{ commands cmdlist[] = { {goodstub, "stub", "simple stub"}, {NULL, "Different commands", NULL}, + {bme, "BME", "get pressure, temperature and humidity"}, + {bmefilter, "BMEf", "set filter (0..4)"}, {buzzer, "buzzer", "get/set (0 - off, 1 - on) buzzer"}, {leds, "LED", "LEDx=y; where x=0..3 to work with single LED (then y=1-set, 0-reset, 2-toggle), absent to work with all (y=0 - disable, 1-enable)"}, {pwm, "pwm", "set/get x channel (0..3) pwm value (0..100)"}, @@ -158,7 +254,15 @@ commands cmdlist[] = { {tms, "tms", "print Tms"}, {NULL, "I2C commands", NULL}, {i2addr, "iicaddr", "set/get I2C address"}, + {i2read, "iicread", "read X (0..128) bytes"}, + {i2reg, "iicreg", "read/write I2C register"}, {i2scan, "iicscan", "scan I2C bus"}, + {NULL, "Screen commands", NULL}, + {scrnled, "Sled", "turn on/off screen lights"}, + {scrndcr, "Sdcr", "set data(1)/command(0)"}, + {scrnrst, "Srst", "reset (1/0)"}, + {scrnrdwr, "Sreg", "read/write 8-bit register"}, + {scrnrdwr4, "Sregx", "read/write 32-bit register"}, {NULL, "ADC commands", NULL}, {adcval, "ADC", "get ADCx value (without x - for all)"}, {adcvoltage, "ADCv", "get ADCx voltage (without x - for all)"}, diff --git a/F3:F303/NitrogenFlooding/strfunc.c b/F3:F303/NitrogenFlooding/strfunc.c index 8dca52b..140638a 100644 --- a/F3:F303/NitrogenFlooding/strfunc.c +++ b/F3:F303/NitrogenFlooding/strfunc.c @@ -272,7 +272,7 @@ const char *getint(const char *txt, int32_t *I){ static const float pwr10[] = {1.f, 10.f, 100.f, 1000.f, 10000.f}; static const float rounds[] = {0.5f, 0.05f, 0.005f, 0.0005f, 0.00005f}; #define P10L (sizeof(pwr10)/sizeof(uint32_t) - 1) -const char *float2str(float x, uint8_t prec){ +char *float2str(float x, uint8_t prec){ static char str[16] = {0}; // -117.5494E-36\0 - 14 symbols max! if(prec > P10L) prec = P10L; if(isnan(x)){ memcpy(str, "NAN", 4); return str;} diff --git a/F3:F303/NitrogenFlooding/strfunc.h b/F3:F303/NitrogenFlooding/strfunc.h index 9c77a72..b4536d7 100644 --- a/F3:F303/NitrogenFlooding/strfunc.h +++ b/F3:F303/NitrogenFlooding/strfunc.h @@ -25,8 +25,8 @@ void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len); char *u2str(uint32_t val); char *i2str(int32_t i); char *uhex2str(uint32_t val); +char *float2str(float x, uint8_t prec); const char *getnum(const char *txt, uint32_t *N); const char *omit_spaces(const char *buf); const char *getint(const char *txt, int32_t *I); -const char *float2str(float x, uint8_t prec); //void mymemcpy(char *dest, const char *src, int len); diff --git a/F3:F303/NitrogenFlooding/version.inc b/F3:F303/NitrogenFlooding/version.inc index 1d5ece6..4d2cf81 100644 --- a/F3:F303/NitrogenFlooding/version.inc +++ b/F3:F303/NitrogenFlooding/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "56" -#define BUILD_DATE "2023-05-03" +#define BUILD_NUMBER "110" +#define BUILD_DATE "2023-05-08" diff --git a/F3:F303/inc/Fx/common_macros.h b/F3:F303/inc/Fx/common_macros.h index 8bdc4de..20b8535 100644 --- a/F3:F303/inc/Fx/common_macros.h +++ b/F3:F303/inc/Fx/common_macros.h @@ -40,6 +40,10 @@ #define NULL (0) #endif +#ifndef _U_ +#define _U_ __attribute__((__unused__)) +#endif + // some good things from CMSIS #define nop() __NOP() diff --git a/makefile.stm32 b/makefile.stm32 index d69ab20..6e51ee4 100644 --- a/makefile.stm32 +++ b/makefile.stm32 @@ -96,7 +96,7 @@ release: LDFLAGS += -flto release: $(TARGFILE) bin list size #debug: add debug flags -debug: CFLAGS += -DEBUG -Werror -g3 -gdwarf-2 +debug: CFLAGS += -DEBUG -Werror -g3 -gdwarf-2 debug: TARGET := DEBUG debug: $(TARGFILE) bin list size @@ -145,7 +145,7 @@ $(LIST): $(ELF) $(ELF): $(OBJDIR) $(OBJS) @echo " LD $(ELF)" - $(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(ELF) + $(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(ELF) $(LDADD) size: $(ELF) $(SIZE) $(ELF) @@ -158,6 +158,7 @@ clean: flash: $(BIN) @echo " FLASH $(BIN)" $(STFLASH) write $(BIN) 0x8000000 + $(STFLASH) reset boot: $(BIN) @echo " LOAD $(BIN) through bootloader"