From 1f79a433269a9c2cd3cadb3ee00d680ed7dc92fd Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 1 Jun 2026 09:34:53 +0300 Subject: [PATCH] fixed some bugs --- F3:F303/MLX90640-allsky/Readme.md | 11 ++++++--- F3:F303/MLX90640-allsky/adc.c | 21 ++++++++++-------- F3:F303/MLX90640-allsky/allsky.bin | Bin 24800 -> 25028 bytes F3:F303/MLX90640-allsky/commproto.cpp | 14 +++++++++--- F3:F303/MLX90640-allsky/commproto.h | 6 ++++- F3:F303/MLX90640-allsky/i2c.c | 4 +++- .../MLX90640-allsky/ir-allsky.creator.user | 2 +- F3:F303/MLX90640-allsky/main.c | 7 ++++-- F3:F303/MLX90640-allsky/mlx90640.c | 4 ++-- F3:F303/MLX90640-allsky/strfunc.c | 16 ++++++------- F3:F303/MLX90640-allsky/usart.c | 7 +++--- F3:F303/MLX90640-allsky/version.inc | 4 ++-- 12 files changed, 61 insertions(+), 35 deletions(-) diff --git a/F3:F303/MLX90640-allsky/Readme.md b/F3:F303/MLX90640-allsky/Readme.md index f0567ac..468e95b 100644 --- a/F3:F303/MLX90640-allsky/Readme.md +++ b/F3:F303/MLX90640-allsky/Readme.md @@ -7,7 +7,9 @@ thermal imaging sensors (32×24 pixels each), designed for **cloud monitoring** Astrophysical Observatory of the Russian Academy of Sciences. The system automates sky quality assessment for 0.5-meter telescopes of the "Astro-M" complex. -The device continuously captures thermal images from multiple sensors (Zenith, East, South, West, North), processes environmental data from a **BMP280** pressure/humidity/temperature sensor, and controls **PWM heaters** to prevent dew formation on optics. +The device continuously captures thermal images from multiple sensors (Zenith, East, South, West, +North), processes environmental data from a **BMP280** pressure/humidity/temperature sensor, and +controls **PWM heaters** to prevent dew formation on optics. **Repository:** [https://github.com/eddyem/stm32samples/tree/master/F3%3AF303/MLX90640-allsky](https://github.com/eddyem/stm32samples/tree/master/F3%3AF303/MLX90640-allsky) @@ -160,7 +162,8 @@ Measurements are triggered every `ENV_MEAS_PERIOD` (10 seconds) in forced mode. ## Command Protocol -The device presents a **virtual COM port** (CDC) over USB and a second UART interface. Both share the same command set. +The device presents a **virtual COM port** (CDC) over USB and a second UART interface. Both share +the same command set. ### Command Syntax ``` @@ -290,7 +293,9 @@ T_MEASUREMENT=12345678 ### Prerequisites - ARM GCC toolchain (`arm-none-eabi-gcc`) - Make -- [st-flash](https://github.com/texane/stlink), [stm32flash](https://sourceforge.net/projects/stm32flash/) or [OpenOCD](https://openocd.sourceforge.io) (for flashing MCU) +- [st-flash](https://github.com/texane/stlink), + [stm32flash](https://sourceforge.net/projects/stm32flash/) or + [OpenOCD](https://openocd.sourceforge.io) (for flashing MCU) ### Build ```bash diff --git a/F3:F303/MLX90640-allsky/adc.c b/F3:F303/MLX90640-allsky/adc.c index 1dc8689..c99570e 100644 --- a/F3:F303/MLX90640-allsky/adc.c +++ b/F3:F303/MLX90640-allsky/adc.c @@ -46,19 +46,20 @@ TRUE_INLINE void calADC(ADC_TypeDef *chnl){ chnl->CR = ADC_CR_ADVREGEN_0; // wait for 10us uint16_t ctr = 0; - while(++ctr < 1000){nop();} + while(++ctr < 1000){IWDG->KR = IWDG_REFRESH;} // ADCALDIF=0 (single channels) if((chnl->CR & ADC_CR_ADEN)){ chnl->CR |= ADC_CR_ADSTP; chnl->CR |= ADC_CR_ADDIS; } chnl->CR |= ADC_CR_ADCAL; - while((chnl->CR & ADC_CR_ADCAL) != 0 && ++ctr < 0xfff0){}; + while((chnl->CR & ADC_CR_ADCAL) != 0 && ++ctr < 0xfff0){IWDG->KR = IWDG_REFRESH;}; chnl->CR = ADC_CR_ADVREGEN_0; // enable ADC ctr = 0; do{ - chnl->CR |= ADC_CR_ADEN; + chnl->CR |= ADC_CR_ADEN; + IWDG->KR = IWDG_REFRESH; }while((chnl->ISR & ADC_ISR_ADRDY) == 0 && ++ctr < 0xfff0); } @@ -80,14 +81,16 @@ void adc_setup(){ ADC12_COMMON->CCR = ADC_CCR_TSEN | ADC_CCR_VREFEN | ADC_CCR_CKMODE; // enable Tsens and Vref, HCLK/4 calADC(ADC1); calADC(ADC2); - // ADC1: channels 1,2,3,4,16,18 - ADC1->SMPR1 = ADC_SMPR1_SMP0 | ADC_SMPR1_SMP1 | ADC_SMPR1_SMP2 | ADC_SMPR1_SMP3; - ADC1->SMPR2 = ADC_SMPR2_SMP15 | ADC_SMPR2_SMP17; + // ADC1: channels 1,2,3,4,16,18; 601.5 clock cycles + //ADC1->SMPR1 = ADC_SMPR1_SMP0 | ADC_SMPR1_SMP1 | ADC_SMPR1_SMP2 | ADC_SMPR1_SMP3; + ADC1->SMPR1 = ADC_SMPR1_SMP1 | ADC_SMPR1_SMP2 | ADC_SMPR1_SMP3 | ADC_SMPR1_SMP4; + //ADC1->SMPR2 = ADC_SMPR2_SMP15 | ADC_SMPR2_SMP17; + ADC1->SMPR2 = ADC_SMPR2_SMP16 | ADC_SMPR2_SMP18; // 6 conversions in group: 1->2->3->4->16->18 ADC1->SQR1 = (1<<6) | (2<<12) | (3<<18) | (4<<24) | (NUMBER_OF_ADC1_CHANNELS-1); ADC1->SQR2 = (16<<0) | (18<<6); // ADC2: channel 2 - ADC2->SMPR1 = ADC_SMPR1_SMP1; + ADC2->SMPR1 = ADC_SMPR1_SMP2; ADC2->SQR1 = (2<<6) | (NUMBER_OF_ADC2_CHANNELS-1); // configure DMA for ADC RCC->AHBENR |= RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN; @@ -122,12 +125,12 @@ void adc_setup(){ */ uint16_t getADCval(uint8_t nch){ if(nch >= NUMBER_OF_ADC_CHANNELS) return 0; - register uint16_t temp; + uint16_t temp; #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); } #define PIX_SWAP(a,b) { temp=(a);(a)=(b);(b)=temp; } uint16_t p[9]; int adval = (nch >= NUMBER_OF_ADC1_CHANNELS) ? NUMBER_OF_ADC2_CHANNELS : NUMBER_OF_ADC1_CHANNELS; - int addr = (nch >= NUMBER_OF_ADC1_CHANNELS) ? nch - NUMBER_OF_ADC2_CHANNELS + ADC2START: nch; + int addr = (nch >= NUMBER_OF_ADC1_CHANNELS) ? nch - NUMBER_OF_ADC1_CHANNELS + ADC2START: nch; for(int i = 0; i < 9; ++i, addr += adval) // first we should prepare array for optmed p[i] = ADC_array[addr]; PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ; diff --git a/F3:F303/MLX90640-allsky/allsky.bin b/F3:F303/MLX90640-allsky/allsky.bin index 202c9a819db1a4163dbd67b1577b1348c170ba9f..b3e42d716395cde17a9a7690df8b90d258719aab 100755 GIT binary patch delta 10762 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 algnpv5q%!Yi+;N2uMx< delta 10546 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 KPHna '@' && i < CMD_MAXLEN) command[i++] = *buf++; diff --git a/F3:F303/MLX90640-allsky/commproto.h b/F3:F303/MLX90640-allsky/commproto.h index fc4d7ee..d68cbbc 100644 --- a/F3:F303/MLX90640-allsky/commproto.h +++ b/F3:F303/MLX90640-allsky/commproto.h @@ -49,10 +49,14 @@ typedef enum{ // maximal available parameter number (for 16-bit registers is 0xffff #define MAXPARNO 0xffff +typedef int (*sendfun_t)(const char*); + extern const char *EQ; -const char *parse_cmd(int (*sendfun)(const char*), char *buf); +const char *parse_cmd(sendfun_t sendfun, char *buf); void set_senders(int (*usbs)(const char*), int (*usbb)(uint8_t), int (*usbbin)(const uint8_t*, int), int (*usarts)(const char*), int (*usartb)(uint8_t), int (*usartbin)(const uint8_t*, int)); +void set_sender(sendfun_t sendfun); +sendfun_t get_sender(); extern const char *const Timage; diff --git a/F3:F303/MLX90640-allsky/i2c.c b/F3:F303/MLX90640-allsky/i2c.c index a6e822b..62bf3a4 100644 --- a/F3:F303/MLX90640-allsky/i2c.c +++ b/F3:F303/MLX90640-allsky/i2c.c @@ -116,6 +116,8 @@ void i2c_setup(i2c_speed_t speed){ RCC->AHBENR |= RCC_AHBENR_DMA1EN; NVIC_EnableIRQ(DMA1_Channel6_IRQn); NVIC_EnableIRQ(DMA1_Channel7_IRQn); + NVIC_SetPriority(DMA1_Channel6_IRQn, 3); + NVIC_SetPriority(DMA1_Channel7_IRQn, 3); I2Cbusy = 0; i2c_curspeed = speed; } @@ -153,7 +155,7 @@ static uint8_t waitISRbit(uint32_t bit, uint8_t isset){ } return 1; goterr: - I2C1->ICR = 0xff; + I2C1->ICR = 0x3f38; // clear all errors return 0; } diff --git a/F3:F303/MLX90640-allsky/ir-allsky.creator.user b/F3:F303/MLX90640-allsky/ir-allsky.creator.user index 4dd6952..288daa7 100644 --- a/F3:F303/MLX90640-allsky/ir-allsky.creator.user +++ b/F3:F303/MLX90640-allsky/ir-allsky.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F3:F303/MLX90640-allsky/main.c b/F3:F303/MLX90640-allsky/main.c index 4e6495a..7674096 100644 --- a/F3:F303/MLX90640-allsky/main.c +++ b/F3:F303/MLX90640-allsky/main.c @@ -83,16 +83,19 @@ int main(void){ usart_sendstr(foundid); usart_sendstr(straddr); usart_putbyte('\n'); } } + IWDG->KR = IWDG_REFRESH; mlx_process(); - if(cartoon) for(int i = 0; i < N_SENSORS; ++i){ // USB-only + if(cartoon && CDCready) for(int i = 0; i < N_SENSORS; ++i){ // USB-only uint32_t Tnow = mlx_lastimT(i); if(Tnow != Tlastima[i]){ fp_t *im = mlx_getimage(i); if(im){ - //U(Sensno); UN(i2str(i)); + sendfun_t cursender = get_sender(); + set_sender(USB_sendstr); U(Timage); USB_putbyte('0'+i); USB_putbyte('='); UN(u2str(Tnow)); drawIma(im); Tlastima[i] = Tnow; + set_sender(cursender); } } } diff --git a/F3:F303/MLX90640-allsky/mlx90640.c b/F3:F303/MLX90640-allsky/mlx90640.c index 73b3a76..c546eb6 100644 --- a/F3:F303/MLX90640-allsky/mlx90640.c +++ b/F3:F303/MLX90640-allsky/mlx90640.c @@ -43,7 +43,7 @@ static void occacc(int8_t *arr, int l, const uint16_t *regstart){ int n = l >> 2; // divide by 4 int8_t *p = arr; for(int i = 0; i < n; ++i){ - register uint16_t val = *regstart++; + uint16_t val = *regstart++; *p++ = (val & 0x000F) >> 0; *p++ = (val & 0x00F0) >> 4; *p++ = (val & 0x0F00) >> 8; @@ -123,7 +123,7 @@ MLX90640_params *get_parameters(const uint16_t dataarray[MLX_DMA_MAXLEN]){ int idx = (row&1)<<1; for(int col = 0; col < MLX_W; ++col){ // offset - register uint16_t rv = *pu16++; + uint16_t rv = *pu16++; i16 = (rv & 0xFC00) >> 10; if(i16 > 0x1F) i16 -= 0x40; *offset++ = (fp_t)offavg + (fp_t)occRow[row]*occRowScale + (fp_t)occColumn[col]*occColumnScale + (fp_t)i16*occRemScale; diff --git a/F3:F303/MLX90640-allsky/strfunc.c b/F3:F303/MLX90640-allsky/strfunc.c index 4d0009e..a9c086c 100644 --- a/F3:F303/MLX90640-allsky/strfunc.c +++ b/F3:F303/MLX90640-allsky/strfunc.c @@ -23,7 +23,7 @@ // hex line number for hexdumps void u16s(uint16_t n, char *buf){ for(int j = 3; j > -1; --j){ - register uint8_t q = n & 0xf; + uint8_t q = n & 0xf; n >>= 4; if(q < 10) buf[j] = q + '0'; else buf[j] = q - 10 + 'a'; @@ -40,7 +40,7 @@ void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len){ char buf[64] = "0000 ", *bptr = &buf[6]; for(uint16_t l = 0; l < len; ++l, ++arr){ for(int16_t j = 1; j > -1; --j){ - register uint8_t half = (*arr >> (4*j)) & 0x0f; + uint8_t half = (*arr >> (4*j)) & 0x0f; if(half < 10) *bptr++ = half + '0'; else *bptr++ = half - 10 + 'a'; } @@ -66,7 +66,7 @@ void hexdump16(int (*sendfun)(const char *s), uint16_t *arr, uint16_t len){ //uint16_t val = *arr; u16s(*arr, bptr); /*for(int16_t j = 3; j > -1; --j){ - register uint8_t q = val & 0xf; + uint8_t q = val & 0xf; val >>= 4; if(q < 10) bptr[j] = q + '0'; else bptr[j] = q - 10 + 'a'; @@ -297,8 +297,8 @@ const char *getint(const char *txt, int32_t *I){ int32_t sign = 1; uint32_t U; if(*s == '-'){ - sign = -1; - ++s; + sign = -1; + ++s; } const char *nxt = getnum(s, &U); if(nxt == s) return txt; @@ -341,7 +341,7 @@ char *float2str(float x, uint8_t prec){ uint8_t m = 0; if(pow < 0){pow = -pow; m = 1;} while(pow){ - register int p10 = pow/10; + int p10 = pow/10; *s-- = '0' + (pow - 10*p10); pow = p10; } @@ -355,7 +355,7 @@ char *float2str(float x, uint8_t prec){ uint32_t decimals = (uint32_t)((x-units+rounds[prec])*pwr10[prec]); // print decimals while(prec){ - register int d10 = decimals / 10; + int d10 = decimals / 10; *s-- = '0' + (decimals - 10*d10); decimals = d10; --prec; @@ -368,7 +368,7 @@ char *float2str(float x, uint8_t prec){ // print main units if(units == 0) *s-- = '0'; else while(units){ - register uint32_t u10 = units / 10; + uint32_t u10 = units / 10; *s-- = '0' + (units - 10*u10); units = u10; } diff --git a/F3:F303/MLX90640-allsky/usart.c b/F3:F303/MLX90640-allsky/usart.c index 8e766e0..2b64bab 100644 --- a/F3:F303/MLX90640-allsky/usart.c +++ b/F3:F303/MLX90640-allsky/usart.c @@ -149,8 +149,9 @@ int usart_setup(uint32_t speed){ NVIC_EnableIRQ(USART1_IRQn); NVIC_EnableIRQ(DMA1_Channel4_IRQn); NVIC_EnableIRQ(DMA1_Channel5_IRQn); - NVIC_SetPriority(DMA1_Channel5_IRQn, 0); - NVIC_SetPriority(USART1_IRQn, 4); // set character match priority lower + NVIC_SetPriority(DMA1_Channel4_IRQn, 4); + NVIC_SetPriority(DMA1_Channel5_IRQn, 4); + NVIC_SetPriority(USART1_IRQn, 5); // set character match priority lower return TRUE; } @@ -162,7 +163,7 @@ void usart_stop(){ void usart1_exti25_isr(){ DMA1_Channel5->CCR &= ~DMA_CCR_EN; // temporaly disable DMA USART1->ICR = USART_ICR_CMCF; // clear character match flag - register int l = UARTBUFSZI - DMA1_Channel5->CNDTR - 1; // substitute '\n' with '\0', omit empty strings! + int l = UARTBUFSZI - DMA1_Channel5->CNDTR - 1; // substitute '\n' with '\0', omit empty strings! if(l > 0){ if(recvdatalen){ // user didn't read old data - mark as buffer overflow bufovr = 1; diff --git a/F3:F303/MLX90640-allsky/version.inc b/F3:F303/MLX90640-allsky/version.inc index 80b70ea..6bc5225 100644 --- a/F3:F303/MLX90640-allsky/version.inc +++ b/F3:F303/MLX90640-allsky/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "67" -#define BUILD_DATE "2026-05-29" +#define BUILD_NUMBER "68" +#define BUILD_DATE "2026-06-01"