From d289acf16954be0c073d820af2756c2fef96af00 Mon Sep 17 00:00:00 2001 From: dplimin Date: Tue, 24 Oct 2023 16:48:53 +0300 Subject: [PATCH] modified: A1210.ioc modified: Core/Inc/flash.h modified: Core/Inc/my.h modified: Core/Inc/struct.h modified: Core/Src/flash.c modified: Core/Src/keys.c modified: Core/Src/main.c modified: Core/Src/my.c modified: Core/Src/screen.c modified: Core/Src/usart.c --- A1210.ioc | 43 +++---- Core/Inc/flash.h | 5 +- Core/Inc/my.h | 34 +++++- Core/Inc/struct.h | 19 ++- Core/Src/flash.c | 128 +++++++++++++++++--- Core/Src/keys.c | 149 ++++++++++++++++++++--- Core/Src/main.c | 83 +++++++++---- Core/Src/my.c | 70 +++++++++-- Core/Src/screen.c | 295 +++++++++++++++++++++++++++++++++++++++++----- Core/Src/usart.c | 74 +++++++++++- 10 files changed, 776 insertions(+), 124 deletions(-) diff --git a/A1210.ioc b/A1210.ioc index 9a5580e..67e5ef5 100644 --- a/A1210.ioc +++ b/A1210.ioc @@ -249,48 +249,49 @@ ProjectManager.TargetToolchain=TrueSTUDIO ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_TIM3_Init-TIM3-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_TIM7_Init-TIM7-false-HAL-true,8-MX_USART1_UART_Init-USART1-false-HAL-true -RCC.AHBFreq_Value=24000000 +RCC.AHBFreq_Value=96000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 RCC.APB1Freq_Value=24000000 -RCC.APB1TimFreq_Value=24000000 -RCC.APB2Freq_Value=24000000 -RCC.APB2TimFreq_Value=24000000 +RCC.APB1TimFreq_Value=48000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=48000000 +RCC.APB2TimFreq_Value=96000000 RCC.CECFreq_Value=32786.88524590164 -RCC.CortexFreq_Value=24000000 -RCC.FCLKCortexFreq_Value=24000000 +RCC.CortexFreq_Value=96000000 +RCC.FCLKCortexFreq_Value=96000000 RCC.FMPI2C1Freq_Value=24000000 RCC.FamilyName=M -RCC.HCLKFreq_Value=24000000 -RCC.IPParameters=AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CECFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FMPI2C1Freq_Value,FamilyName,HCLKFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SPCLKFreq_Value,PLLI2SQCLKFreq_Value,PLLI2SRCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLR,PLLRCLKFreq_Value,PLLSAIPCLKFreq_Value,PLLSAIQCLKFreq_Value,PWRFreq_Value,SAIAFreq_Value,SAIBFreq_Value,SDIOFreq_Value,SPDIFRXFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USBFreq_Value,VCOI2SInputFreq_Value,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIInputFreq_Value,VCOSAIOutputFreq_Value -RCC.MCO2PinFreq_Value=24000000 -RCC.PLLCLKFreq_Value=60000000 +RCC.HCLKFreq_Value=96000000 +RCC.IPParameters=AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CECFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FMPI2C1Freq_Value,FamilyName,HCLKFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SPCLKFreq_Value,PLLI2SQCLKFreq_Value,PLLI2SRCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLRCLKFreq_Value,PLLSAIPCLKFreq_Value,PLLSAIQCLKFreq_Value,PWRFreq_Value,SAIAFreq_Value,SAIBFreq_Value,SDIOFreq_Value,SPDIFRXFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USBFreq_Value,VCOI2SInputFreq_Value,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIInputFreq_Value,VCOSAIOutputFreq_Value +RCC.MCO2PinFreq_Value=96000000 +RCC.PLLCLKFreq_Value=96000000 RCC.PLLI2SPCLKFreq_Value=96000000 RCC.PLLI2SQCLKFreq_Value=96000000 RCC.PLLI2SRCLKFreq_Value=96000000 RCC.PLLM=8 -RCC.PLLN=60 -RCC.PLLQCLKFreq_Value=60000000 -RCC.PLLR=5 -RCC.PLLRCLKFreq_Value=24000000 +RCC.PLLN=96 +RCC.PLLQCLKFreq_Value=96000000 +RCC.PLLRCLKFreq_Value=96000000 RCC.PLLSAIPCLKFreq_Value=96000000 RCC.PLLSAIQCLKFreq_Value=96000000 -RCC.PWRFreq_Value=24000000 +RCC.PWRFreq_Value=96000000 RCC.SAIAFreq_Value=96000000 RCC.SAIBFreq_Value=96000000 -RCC.SDIOFreq_Value=60000000 -RCC.SPDIFRXFreq_Value=24000000 -RCC.SYSCLKFreq_VALUE=24000000 +RCC.SDIOFreq_Value=96000000 +RCC.SPDIFRXFreq_Value=96000000 +RCC.SYSCLKFreq_VALUE=96000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLRCLK -RCC.USBFreq_Value=60000000 +RCC.USBFreq_Value=96000000 RCC.VCOI2SInputFreq_Value=1000000 RCC.VCOI2SOutputFreq_Value=192000000 RCC.VCOInputFreq_Value=2000000 -RCC.VCOOutputFreq_Value=120000000 +RCC.VCOOutputFreq_Value=192000000 RCC.VCOSAIInputFreq_Value=1000000 RCC.VCOSAIOutputFreq_Value=192000000 SH.ADCx_IN0.0=ADC1_IN0,IN0 SH.ADCx_IN0.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8 -SPI1.CalculateBaudRate=3.0 MBits/s +SPI1.CalculateBaudRate=6.0 MBits/s SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler SPI1.Mode=SPI_MODE_MASTER diff --git a/Core/Inc/flash.h b/Core/Inc/flash.h index 08d9215..029c046 100644 --- a/Core/Inc/flash.h +++ b/Core/Inc/flash.h @@ -14,12 +14,13 @@ #include "main.h" - -#define USERPAGE ((uint32_t) 0x08060000) +#define USERPAGECOR ((uint32_t) 0x08040000) +#define USERPAGEPAR ((uint32_t) 0x08060000) void MX_FLASH_Init(void); void rdPar(void); + #endif /* INC_FLASH_H_ */ diff --git a/Core/Inc/my.h b/Core/Inc/my.h index 8588ba8..f5d6fcb 100644 --- a/Core/Inc/my.h +++ b/Core/Inc/my.h @@ -76,12 +76,19 @@ static const uint16_t time35[] = { 8, 6, 6, 6, 4, 4, 4, 1, 4, 4 }; void DrawSome(int16_t some, uint8_t x, uint8_t y, uint8_t mode); typedef enum { CHARGE = 0} typeIIN; -typedef enum { Ku0_1 = 0, Ku0_2, Ku0_5, Ku1, Ku2, Ku5, Ku10, Ku20, Ku50, Ku100, Ku200, Ku500 } typeIKU; -typedef enum { Hp0_1 = 0, Hp1, Hp2, Hp10 } typeIFV; +typedef enum { Ku0_1 = 0, Ku0_2, Ku0_5, Ku1, Ku2, Ku5, Ku10, Ku20, Ku50, Ku100, Ku200, Ku500, Ku1000 } typeIKU; +typedef enum { Hp0_2 = 0, Hp1, Hp2, Hp10 } typeIFV; typedef enum { Lp100 = 0, Lp300, Lp1000, Lp3000, Lp10000, Lp30000, Lp100000 } typeIFN; typedef enum +{ + AMPLIFIER = 0, + CALLIBRATION + +}workModeEnum; + +typedef enum //перечисление для основного меню { WORK = 0, KPR0 , @@ -89,7 +96,9 @@ typedef enum KPR2 , KPR3 , KPR4 , + KPR5 , KPRSAVING, + UNITSELECT, OUT , FVCH , FNCH, @@ -97,12 +106,29 @@ typedef enum SAVING }mainMenuState; -int asciiToFloat4(uint16_t str[]); +typedef enum //перечисление для сервисного меню +{ + KUSET = 0, + DAC0SET , + DAC1SET , + DAC2SET , + DAC3SET , + SAVE +}callibrationMenuState; + + +typedef enum{ //перечисления для единиц измерения + MS2=0, + PA, + H +} unit; + +int asciiToFloat4(uint16_t str[]); //todo: заправить функции не использующиеся вне void sh_SetFnch(uint16_t IFN); void sh_SetPlavZeml(uint16_t IPZ); void WRDAC(uint16_t DVD); void sh_SetFvch(uint16_t IFV); void sh_SetOutGain(uint16_t IKU); -void sh_applysetting(UserData_TypeDef * currentData, uint16_t DVD); +void sh_applysetting(UserData_TypeDef * currentData); #endif /* INC_MY_H_ */ diff --git a/Core/Inc/struct.h b/Core/Inc/struct.h index 2e25669..44a0716 100644 --- a/Core/Inc/struct.h +++ b/Core/Inc/struct.h @@ -78,17 +78,34 @@ typedef struct uint16_t IK2; // 18,19 5007 // знакоместо 2 uint16_t IK3; // 20,21 // знакоместо 3 uint16_t IK4; // 22,23 // знакоместо 4 - + uint16_t IK5; // 22,23 // знакоместо 4 uint16_t IPZ; // 24,25 5008 // плавающая земля float KCOND; // 28,29,30,31 7501 // float SENS; // 32,33,34,35 7502 //дублирование (коэфициэнт преобразования) + uint16_t UNIT; //Отображаемые величины на экране } UserData_TypeDef; // ********LENGTH = 39 bytes*********** +typedef struct { + uint16_t Ku0_1; + uint16_t Ku0_2; + uint16_t Ku0_5; + uint16_t Ku1; + uint16_t Ku2; + uint16_t Ku5; + uint16_t Ku10; + uint16_t Ku20; + uint16_t Ku50; + uint16_t Ku100; + uint16_t Ku200; + uint16_t Ku500; + uint16_t Ku1000; + +} CorrectonKuStruct_TypeDef; diff --git a/Core/Src/flash.c b/Core/Src/flash.c index d29b637..85a166b 100644 --- a/Core/Src/flash.c +++ b/Core/Src/flash.c @@ -12,9 +12,17 @@ #include "stm32f4xx_hal_flash_ex.h" -static FLASH_EraseInitTypeDef FlashEraseInit; +//я хочу писать коррекцию и параметры на разных страницах. Они по 128к, это не рационально. + +static FLASH_EraseInitTypeDef FlashEraseInitPar; // структура для стирания параметров +static FLASH_EraseInitTypeDef FlashEraseInitCor; // структура для стираия коррекции + + __IO extern UserData_TypeDef currentData; +__IO extern uint16_t correctedKu[13]; // моя структура с коррекциями + + __IO uint16_t COUNT_EXT = 0; @@ -24,16 +32,24 @@ void MX_FLASH_Init(void) { __HAL_RCC_SYSCFG_CLK_ENABLE(); - FlashEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; - FlashEraseInit.Banks = FLASH_BANK_1; - FlashEraseInit.Sector = FLASH_SECTOR_7; - FlashEraseInit.NbSectors = 1; - FlashEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; + FlashEraseInitPar.TypeErase = FLASH_TYPEERASE_SECTORS; + FlashEraseInitPar.Banks = FLASH_BANK_1; + FlashEraseInitPar.Sector = FLASH_SECTOR_7; + FlashEraseInitPar.NbSectors = 1; + FlashEraseInitPar.VoltageRange = FLASH_VOLTAGE_RANGE_3; + + FlashEraseInitCor.TypeErase = FLASH_TYPEERASE_SECTORS; + FlashEraseInitCor.Banks = FLASH_BANK_1; + FlashEraseInitCor.Sector = FLASH_SECTOR_6; + FlashEraseInitCor.NbSectors = 1; + FlashEraseInitCor.VoltageRange = FLASH_VOLTAGE_RANGE_3; rdPar(); + rdCor(); } + void wrPar(void) { __IO uint32_t Address, lenpar, i; @@ -41,15 +57,15 @@ __IO uint32_t *pData; uint32_t SECTORError = 0; lenpar = sizeof(UserData_TypeDef); - while(lenpar % 4) { + while(lenpar % 4) { //дополняем строку до тех пор пока она не станет делится на 4 lenpar++; } - lenpar >>= 2; + lenpar >>= 2; //делим на 4 - HAL_FLASH_Unlock(); - if(HAL_FLASHEx_Erase(&FlashEraseInit, &SECTORError) == HAL_OK) + HAL_FLASH_Unlock(); //открываем память на запись + if(HAL_FLASHEx_Erase(&FlashEraseInitPar, &SECTORError) == HAL_OK) // { - Address = USERPAGE; + Address = USERPAGEPAR; pData = (uint32_t *) ¤tData; for(i = 0; i < lenpar; i++) { @@ -61,6 +77,32 @@ uint32_t SECTORError = 0; } +void wrCor(void) ///попробуем переписать это под мой массив +{ + __IO uint32_t Address, lenpar, i; + __IO uint32_t *pData; + uint32_t SECTORError = 0; + + lenpar = sizeof(correctedKu); // измеряем длинну массива + while(lenpar % 4) { //дополняем строку до тех пор пока она не станет делится на 4 + lenpar++; + } + lenpar >>= 2; //делим на 4 + + HAL_FLASH_Unlock(); //открываем память на запись + if(HAL_FLASHEx_Erase(&FlashEraseInitCor, &SECTORError) == HAL_OK) //стираем страницу по структуре + { + Address = USERPAGECOR; + pData = (uint32_t *) &correctedKu; + for(i = 0; i < lenpar; i++) + { + HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, *pData++); + Address += 4; + } + } + HAL_FLASH_Lock(); +} + void rdPar(void) { @@ -69,30 +111,33 @@ uint32_t lenpar; volatile bool rewrite = false; lenpar = sizeof(UserData_TypeDef); - memcpy((void *) ¤tData, (void *) USERPAGE, lenpar); + memcpy((void *) ¤tData, (void *) USERPAGEPAR, lenpar); - //pardata.OWN = 0xffff;//todo - if(currentData.OWN == 0xffff) + //pardata.OWN = 0xffff;//todo //скоррректировать битые значения + if(currentData.OWN == 0xffff) //если первая запись и везде пусто { - currentData.OWN = 1; //адресс нодбас + currentData.OWN = 1; //ставим параметры по умолчанию currentData.BAUD = 5; currentData.INFB = 1; currentData.IIN = CHARGE; - currentData.IFV = Hp0_1; + currentData.IFV = Hp0_2; currentData.IFN = Lp100000; currentData.IKU = Ku1; currentData.IK0 = 1; currentData.IK1 = 0; - currentData.IK2 = 0; + currentData.IK2 = '~'; currentData.IK3 = 0; currentData.IK4 = 0; - + currentData.IK5 = 0; currentData.IPZ =0; + currentData.KCOND = 1.0f; currentData.SENS = 1.0f; + currentData.UNIT =MS2; + rewrite = true; } @@ -105,6 +150,53 @@ volatile bool rewrite = false; } +void rdCor(void) +{ +uint8_t i; +uint32_t lenpar; +volatile bool rewrite = false; + + lenpar = sizeof(correctedKu); + memcpy((void *) &correctedKu, (void *) USERPAGECOR, lenpar); + + //pardata.OWN = 0xffff;//todo //если значения больше 4095 то переписать на обычные 4095 + + /* + if(currentData.OWN == 0xffff) //если первая запись и везде пусто + { + currentData.OWN = 1; //ставим параметры по умолчанию + currentData.BAUD = 5; + currentData.INFB = 1; + + currentData.IIN = CHARGE; + currentData.IFV = Hp0_2; + currentData.IFN = Lp100000; + currentData.IKU = Ku1; + currentData.IK0 = 1; + currentData.IK1 = 0; + currentData.IK2 = '~'; + currentData.IK3 = 0; + currentData.IK4 = 0; + currentData.IK5 = 0; + currentData.IPZ =0; + + + currentData.KCOND = 1.0f; + currentData.SENS = 1.0f; + + currentData.UNIT =MS2; + + rewrite = true; + } + + //////////////////// + if(rewrite) + { + rewrite = false; + wrCor(); + } + */ +} diff --git a/Core/Src/keys.c b/Core/Src/keys.c index 200eeaf..23d0705 100644 --- a/Core/Src/keys.c +++ b/Core/Src/keys.c @@ -8,7 +8,9 @@ extern UserData_TypeDef currentData; extern int menuPointer; extern uint16_t dvd; extern int ignoreOff_flag; -uint16_t kpr_temp[5]; +uint16_t kpr_temp[6]; + +extern uint16_t correctedKu[13]; __IO uint16_t KEY_STATE = 0; @@ -26,6 +28,8 @@ void keysHandler(void){ menuPointer++; //иначе следующий пункт } + + switch (menuPointer){ case KPR0: @@ -83,13 +87,16 @@ void keysHandler(void){ } break; + + + case KPR4: + if((key==UP_BTN_Pin)) { if((currentData.IK4<9)&&(currentData.IK4>=0)) currentData.IK4++; else if(currentData.IK4=='~') currentData.IK4=0; else if(currentData.IK4==9) currentData.IK4='~'; } - case KPR4: if((key==DN_BTN_Pin)) { if(currentData.IK4==0) currentData.IK4='~'; else if ((currentData.IK4<=9)&&(currentData.IK4>0)) currentData.IK4--; @@ -97,57 +104,167 @@ void keysHandler(void){ } break; + case KPR5: + + if((key==UP_BTN_Pin)) { + if((currentData.IK5<9)&&(currentData.IK5>=0)) currentData.IK5++; + else if(currentData.IK5=='~') currentData.IK5=0; + else if(currentData.IK5==9) currentData.IK5='~'; + } + + if((key==DN_BTN_Pin)) { + if(currentData.IK5==0) currentData.IK5='~'; + else if ((currentData.IK5<=9)&&(currentData.IK5>0)) currentData.IK5--; + else if(currentData.IK5='~') currentData.IK5=9; + } + + break; + + case KPRSAVING: kpr_temp[0]=currentData.IK0; kpr_temp[1]=currentData.IK1; kpr_temp[2]=currentData.IK2; kpr_temp[3]=currentData.IK3; kpr_temp[4]=currentData.IK4; - asciiToFloat4(kpr_temp); - if (asciiToFloat4(kpr_temp)||currentData.SENS<0.001||currentData.SENS>1000){ + kpr_temp[5]=currentData.IK5; + + if (asciiToFloat4(kpr_temp)||currentData.SENS<0.001||currentData.SENS>1000){ //введено некорректное значение currentData.IK0=kpr_temp[0]; currentData.IK1=kpr_temp[1]; currentData.IK2=kpr_temp[2]; currentData.IK3=kpr_temp[3]; currentData.IK4=kpr_temp[4]; - menuPointer=WORK; // ПЕРЕСКОЧИТ САМ + currentData.IK5=kpr_temp[5]; + menuPointer=KPR0; // ПЕРЕСКОЧИТ САМ //пишем что значения не верны //рисуем нули - }; - menuPointer++; + } + else + {sh_applysetting(¤tData); + menuPointer++;} + break; + + case UNITSELECT: + if((key==UP_BTN_Pin)&&(currentData.UNITMS2)) {currentData.UNIT--; sh_applysetting(¤tData);} break; case OUT: - if((key==UP_BTN_Pin)&&(currentData.IKUKu0_1)) {currentData.IKU--; sh_applysetting(¤tData, dvd);} + if((key==UP_BTN_Pin)&&(currentData.IKUKu0_1)) {currentData.IKU--; sh_applysetting(¤tData);} break; case FVCH: - if((key==UP_BTN_Pin)&&(currentData.IFVHp0_1)) {currentData.IFV--; sh_applysetting(¤tData, dvd);} + if((key==UP_BTN_Pin)&&(currentData.IFVHp0_2)) {currentData.IFV--; sh_applysetting(¤tData);} break; case FNCH: - if((key==UP_BTN_Pin)&&(currentData.IFNLp100)) {currentData.IFN--; sh_applysetting(¤tData, dvd);} + if((key==UP_BTN_Pin)&&(currentData.IFNLp100)) {currentData.IFN--; sh_applysetting(¤tData);} break; case GROUND: - if((key==UP_BTN_Pin)) {currentData.IPZ=1; sh_applysetting(¤tData, dvd);} - if((key==DN_BTN_Pin)) {currentData.IPZ=0; sh_applysetting(¤tData, dvd);} + if((key==UP_BTN_Pin)) {currentData.IPZ=1; sh_applysetting(¤tData);} + if((key==DN_BTN_Pin)) {currentData.IPZ=0; sh_applysetting(¤tData);} break; case SAVING: wrPar(); menuPointer=WORK; - sh_applysetting(¤tData, dvd);//todo Сделать по нормальному. + sh_applysetting(¤tData);//todo Сделать по нормальному. break; } //close switch + + }; //close keysHandler +void keysHandlerCallibration(void){ + uint16_t key = KEY_STATE; + KEY_STATE = 0; + if(HAL_GPIO_ReadPin(OFF_GPIO_Port, OFF_Pin) == GPIO_PIN_RESET) ignoreOff_flag=0; //как только кнопку включения отпустили, перестаём её игнорировать + if((HAL_GPIO_ReadPin(OFF_GPIO_Port, OFF_Pin) == GPIO_PIN_SET)&&(ignoreOff_flag==0)) + { wrCor(); + HAL_GPIO_WritePin(ON_GPIO_Port, ON_Pin , GPIO_PIN_SET);} // + + if(key==OK_BTN_Pin){ //По нажатию ОК + //if(menuPointer==GROUND){menuPointer=WORK;} //todo сделай сохранение //Если крайний пункт меню то возвращаемся к работе + sh_applysetting(¤tData); + menuPointer++; //иначе следующий пункт + } + + + + switch (menuPointer){ + + + case KUSET: + if((key==UP_BTN_Pin)&&(currentData.IKUKu0_1)) {currentData.IKU--; sh_applysetting(¤tData);} + break; + + case DAC0SET: + if(key==UP_BTN_Pin) { + if((correctedKu[currentData.IKU]+1000<=4095)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]+1000; + sh_applysetting(¤tData); + }; + if((key==DN_BTN_Pin)) { + if((correctedKu[currentData.IKU]-1000>=1)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]-1000; + sh_applysetting(¤tData); + } + break; + + case DAC1SET: + if(key==UP_BTN_Pin) { + if((correctedKu[currentData.IKU]+100<=4095)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]+100; + sh_applysetting(¤tData); + }; + if((key==DN_BTN_Pin)) { + if((correctedKu[currentData.IKU]-100>=1)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]-100; + sh_applysetting(¤tData); + } + break; + + + + case DAC2SET: + if(key==UP_BTN_Pin) { + if((correctedKu[currentData.IKU]+10<=4095)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]+10; + sh_applysetting(¤tData); + }; + if((key==DN_BTN_Pin)) { + if((correctedKu[currentData.IKU]-10>=1)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]-10; + sh_applysetting(¤tData); + } + break; + + case DAC3SET: + if(key==UP_BTN_Pin) { + if((correctedKu[currentData.IKU]+1<=4095)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]+1; + sh_applysetting(¤tData); + }; + if((key==DN_BTN_Pin)) { + if((correctedKu[currentData.IKU]-1>=1)) correctedKu[currentData.IKU]=correctedKu[currentData.IKU]-1; + sh_applysetting(¤tData); + } + break; + + + case SAVE: + + wrCor(); + sh_applysetting(¤tData);//todo Сделать по нормальному. + menuPointer=KUSET; + break; + + + } //close switch + +}; //close keysHandlerCallibration diff --git a/Core/Src/main.c b/Core/Src/main.c index 052eb6f..2790f9c 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -39,41 +39,42 @@ -volatile int needRefresh; /// char pString[16]; char* FloatToASCII(float Val, int32_t RoundTo); //пока объявлю её тут - void SystemClock_Config(void); + +uint16_t workMode = AMPLIFIER; //CALLIBRATION //AMPLIFIER // по умолчанию норм режим работы, не заводской. + + int menuPointer = 0; ///Указатель меню 0 - ничего 1-4 цифры Кпр. 5 точка КПР 6-чувств выхода 7-фвч 8 фнч 9 ПЗ; extern int RefreshScreen; extern uint32_t ind_buff; //сдвиг буфера!!!! extern uint32_t current_buff; //текущий элемент буфера - -extern uint16_t ADC_Buff[ADC_BUFFSIZE]; +volatile int needRefresh; /// +extern uint16_t ADC_Buff[ADC_BUFFSIZE]; //буфер ацп uint16_t meashBuff[DMA_BUFFSIZE]; -int sourceDac=0; -int reload_flag=0; -int ignoreOff_flag=1; -uint16_t dvd=0xfff; +uint32_t dotPositon; // позиция точки +int reload_flag=0; //флаг перегрузки +int ignoreOff_flag=1; //игнорирование кнопки питания +uint16_t dvd=0xfff; //Дефолтное значение для отправки на цап ОТЛАДКА +float kNormToDAC = 0; // К для нормирования согласно чувствительности датчика +uint16_t correctedKu[13]; //коэфициэнты коррекции для коэфициэнтов усиления __I uint16_t AVG_ADC = 2100; //среднее ацп //__I - input - то есть константный __I uint16_t HIGH_GATE_ADC = 4030; __I uint16_t LOW_GATE_ADC = 179; -void check_reload(void); - - - - +void check_reload(void); // todo отнеси на место UserData_TypeDef currentData; + int main(void) { @@ -98,6 +99,24 @@ int main(void) currentData.ACCEL; // 32,33,34,35 7503 // */ +/* + + correctedKu[Ku0_1]=4095; + correctedKu[Ku0_2]=4095; + correctedKu[Ku0_5]=4095; + correctedKu[Ku1]=4095; + correctedKu[Ku2]=4095; + correctedKu[Ku5]=4095; + correctedKu[Ku10]=4095; + correctedKu[Ku20]=4095; + correctedKu[Ku50]=4095; + correctedKu[Ku100]=4095; + correctedKu[Ku200]=4095; + correctedKu[Ku500]=4095; + correctedKu[Ku1000]=4095; + +*/ + HAL_Init(); SystemClock_Config(); @@ -112,33 +131,55 @@ int main(void) MX_USART1_UART_Init(); + /////Делем старт экрану ssd1306_Init(); HAL_GPIO_WritePin(ON_GPIO_Port, ON_Pin , GPIO_PIN_RESET); //фиксируем питание прибора + if(HAL_GPIO_ReadPin(OK_BTN_GPIO_Port, OK_BTN_Pin) == GPIO_PIN_RESET){workMode=CALLIBRATION;} // при удерживании кнопки переключаемся в заводской режим работы DrawLogo(); ssd1306_Fill(Black); ssd1306_UpdateScreen(); - sh_applysetting(¤tData, dvd); // применяем настройки из стуктуры с ЦАП на всю + HAL_GPIO_WritePin(USART1_RE_GPIO_Port, USART1_RE_Pin, SET); + //HAL_UART_Transmit(&huart1, (uint8_t*)"Hello World", 12, 100); + HAL_UART_Transmit_IT(&huart1, (uint8_t*)"Hello World\n", 12); - - - while (1){ + if(workMode==NORMAL){screenDraw(); // todo: Убрать костыль!!! Считаем в экране значение на DAC. + sh_applysetting(¤tData); }// применяем настройки из стуктуры с ЦАП на всю + while (workMode==NORMAL){ check_reload(); - keysHandler(); + if(RefreshScreen){ screenDraw(); ssd1306_UpdateScreen(); ssd1306_Fill(0x00); RefreshScreen=0; - } + } //end if RefreshScreen + } //end while - } -} + + if(workMode==CALLIBRATION){ + screenDrawCallibration(); // todo: Убрать костыль!!! Считаем в экране значение на DAC. + kNormToDAC=1;//todo: посыпались костыли жестко ставим единицу для настройки прибора + currentData.SENS =1; + currentData.IKU=1; + sh_applysetting(¤tData); }// + while (workMode==CALLIBRATION){ + check_reload(); + keysHandlerCallibration(); + if(RefreshScreen){ + screenDrawCallibration(); + ssd1306_UpdateScreen(); + ssd1306_Fill(0x00); + RefreshScreen=0; + } //end if RefreshScreen + } //end while + +} //end main diff --git a/Core/Src/my.c b/Core/Src/my.c index 02d2f0a..3f1d04a 100644 --- a/Core/Src/my.c +++ b/Core/Src/my.c @@ -6,17 +6,24 @@ extern UserData_TypeDef currentData; +extern uint16_t correctedKu[13]; +extern float kNormToDAC; + char pString[16] = {0}; //Нужна для FloatToASCII -void sh_applysetting(UserData_TypeDef * currentData, uint16_t DVD){ + +void setDAC(void); + + +void sh_applysetting(UserData_TypeDef * currentData){ sh_SetOutGain(currentData->IKU); sh_SetFvch(currentData->IFV); sh_SetFnch(currentData->IFN); sh_SetPlavZeml(currentData->IPZ); - WRDAC(DVD); + setDAC(); } @@ -28,6 +35,7 @@ void sh_SetOutGain(uint16_t IKU){ HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET); + break; case Ku0_2: HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET); @@ -121,13 +129,13 @@ void sh_SetOutGain(uint16_t IKU){ HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET); break; -/* case Ku1000: + case Ku1000: HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET); - break; */ + break; } }; @@ -135,7 +143,7 @@ void sh_SetOutGain(uint16_t IKU){ void sh_SetFvch(uint16_t IFV){ //DA9 IA2 IA3 switch (IFV){ - case Hp0_1: + case Hp0_2: HAL_GPIO_WritePin(A2_GPIO_Port, A2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(A3_GPIO_Port, A3_Pin, GPIO_PIN_RESET); break; @@ -213,6 +221,13 @@ void sh_SetPlavZeml(uint16_t IPZ){ }; +void setDAC(void){ + uint16_t DVD=0; + setOffsetKuDisplay(); //todo:Костыль!! нужно поработать над архитектурой, а не считать как придется + DVD = correctedKu[currentData.IKU]/kNormToDAC; // Делим кореектированный множитель на коэфициент + WRDAC(DVD); //todo: делим uint на float - надеюсь заработает +} + void WRDAC(uint16_t DVD) { uint8_t i; @@ -238,6 +253,7 @@ uint16_t dvd = DVD; void DrawSome(int16_t some, uint8_t x, uint8_t y, uint8_t mode){ if (some<10) OLED_DrawNum(some, x, y, mode); + else if(some>=10&&some<=15) OLED_DrawChar((some+55), x, y, mode); //отображаем как HEX todo: проверь else OLED_DrawChar(some, x, y, mode); } @@ -247,21 +263,22 @@ int asciiToFloat4(uint16_t str[]){ float res=0; int dotFounded=0; int dotPos=0; - for (int i=0; i<=4; i++){ + for (int i=0; i<=5; i++){ if (str[i]=='~'){ ///todo сделать проверку на несколько точек if(dotFounded==0){dotFounded=1; dotPos=i;} //ставим флаг найденной точки присваиваем позицию else return 1; //иначе возвращаем ошибку 1 } } - float symbol[5]; + float symbol[6]; symbol[0]=str[0]; symbol[1]=str[1]; symbol[2]=str[2]; symbol[3]=str[3]; symbol[4]=str[4]; + symbol[5]=str[5]; if(dotFounded==0){ - res=(float)symbol[0]*10000+(float)symbol[1]*1000+(float)symbol[2]*100+(float)symbol[3]*10+(float)symbol[4]; + res=(float)symbol[0]*100000+(float)symbol[1]*10000+(float)symbol[2]*1000+(float)symbol[3]*100+(float)symbol[4]*10+(float)symbol[5]; memcpy(¤tData.SENS, &res, sizeof(float)); ///делаем прямое копирование иначе возвращает непонятно что return 0; } @@ -269,19 +286,46 @@ int asciiToFloat4(uint16_t str[]){ switch(dotPos){ case 0: - res=(float)symbol[1]/(float)10+symbol[2]/(float)100+symbol[3]/(float)1000+symbol[4]/(float)10000; + res=(float)symbol[1]/(float)10 + +symbol[2]/(float)100 + +symbol[3]/(float)1000 + +symbol[4]/(float)10000 + +symbol[5]/(float)100000; break; case 1: - res=symbol[0]+(float)symbol[2]/10+(float)symbol[3]/100+(float)symbol[4]/1000; + res=symbol[0] + +(float)symbol[2]/10 + +(float)symbol[3]/100 + +(float)symbol[4]/1000 + +(float)symbol[5]/10000; break; case 2: - res=symbol[0]*10+(float)symbol[1]+(float)symbol[3]/10+(float)symbol[4]/100; + res=symbol[0]*10 + +(float)symbol[1] + +(float)symbol[3]/10 + +(float)symbol[4]/100 + +(float)symbol[5]/1000; break; case 3: - res=symbol[0]*(float)100+symbol[1]*(float)10+symbol[2]+(float)symbol[4]/10; + res=symbol[0]*100 + +(float)symbol[1]*(float)10 + +(float)symbol[2] + +(float)symbol[4]/10 + +(float)symbol[5]/100; break; case 4: - res=symbol[0]*1000+(float)symbol[1]*100+(float)symbol[2]*10+(float)symbol[3]; + res=symbol[0]*1000 + +(float)symbol[1]*100 + +(float)symbol[2]*10 + +(float)symbol[3] + +(float)symbol[5]/10; + break; + case 5: + res=symbol[0]*10000 + +(float)symbol[1]*1000 + +(float)symbol[2]*100 + +(float)symbol[3]*10 + +(float)symbol[4]; break; default: diff --git a/Core/Src/screen.c b/Core/Src/screen.c index d7e1f44..b112c9b 100644 --- a/Core/Src/screen.c +++ b/Core/Src/screen.c @@ -7,18 +7,23 @@ extern int menuPointer; extern int reload_flag; extern char* kPrToDispl; extern UserData_TypeDef currentData; +extern float kNormToDAC; +extern uint16_t correctedKu[13]; -const char STRING_KPR[] = "Rgh"; -const char STRING_PKL_MS2[] = "gRk/vc2"; + + + +const char STRING_DATCHIK[] = "Lfnxbr"; +const char STRING_PKL[] = "gRk/"; const char STRING_VIHOD[] = "Ds[jl"; const char STRING_MV_MS2[] = "vD/vc2"; -const char STRING_FVCH[] = "ADX"; +const char STRING_FVCH[] = "DX"; const char STRING_GC[] = "Uw"; -const char STRING_FNCH[] = "AYX"; +const char STRING_FNCH[] = "YX"; const char STRING_KGC[] = "rUw"; const char STRING_PEREGRUZKA[] = "Gthtuheprf"; @@ -37,8 +42,52 @@ const char STRING_Ku50[] = "50"; const char STRING_Ku100[] = "100"; const char STRING_Ku200[] = "200"; const char STRING_Ku500[] = "500"; +const char STRING_Ku1000[] = "1000"; -const char STRING_Hp0_1[] = "0~1"; + + +const char *STRINGS_UNITS[]={"vc2","Gf","Y&"}; + + + + + + + +const char *STRINGS_OUTUNITS[] = {"0~0001vD/", + "0~0002vD/", + "0~0005vD/", + "0~001vD/", //3 + "0~002vD/", + "0~005vD/", + "0~01vD/",//6 + "0~02vD/", + "0~05vD/", + "0~1vD/",//9 + "0~2vD/", + "0~5vD/", + "1vD/",//12 + "2vD/", + "5vD/", + "10vD/",//15 + "20vD/", + "50vD/", + "100vD/",//18 + "200vD/", + "500vD/", + "1D/",//21 + "2D/", + "5D/", + "10D/",//24 + "20D/", + "50D/", + "100D/",//27 + "200D/", + "500D/", + "1000D/", //30 +}; + +const char STRING_Hp0_2[] = "0~2"; const char STRING_Hp1[] = "1"; const char STRING_Hp2[] = "2"; const char STRING_Hp10[] = "10"; @@ -52,10 +101,36 @@ const char STRING_Lp10000[] = "10"; const char STRING_Lp30000[] = "30"; const char STRING_Lp100000[] = "100"; +///специальные строки для заводского меню + +const char STRING_KORREKCIA_USILENIA[] = "Rjhhtrwbz ecbktybz"; +const char STRING_KASKAD[] = "Rfcrfl"; +const char STRING_ZNACHENIE_DAC[] = "=0.0001&¤tData.SENS<0.001) {OffsetKuDisplay=0; kNormToDAC=currentData.SENS*10000;} // такие значения не допустимы + else if (currentData.SENS>=0.001&¤tData.SENS<0.01){OffsetKuDisplay=0; kNormToDAC=currentData.SENS*1000;} + else if (currentData.SENS>=0.01&¤tData.SENS<0.1){OffsetKuDisplay=3; kNormToDAC=currentData.SENS*100;} + else if (currentData.SENS>=0.1&¤tData.SENS<1){OffsetKuDisplay=6; kNormToDAC=currentData.SENS*10;} + else if (currentData.SENS>=1&¤tData.SENS<10){OffsetKuDisplay=9; kNormToDAC=currentData.SENS/1;} + else if (currentData.SENS>=10&¤tData.SENS<100){OffsetKuDisplay=12; kNormToDAC=currentData.SENS/10;} + else if (currentData.SENS>=100&¤tData.SENS<1000){OffsetKuDisplay=15; kNormToDAC=currentData.SENS/100;} + else if (currentData.SENS<=1000){OffsetKuDisplay=18; kNormToDAC=currentData.SENS/1000;} + +} + void screenDraw(void) { @@ -98,6 +173,9 @@ void screenDraw(void) case Ku500: kuToDispl=STRING_Ku500; break; + case Ku1000: + kuToDispl=STRING_Ku1000; + break; } @@ -105,8 +183,8 @@ void screenDraw(void) ///////проверяем ФВЧ выхода. присваеваем указателю соответсвующее значение switch(currentData.IFV){ - case Hp0_1: - fvchTODisp=STRING_Hp0_1; + case Hp0_2: + fvchTODisp=STRING_Hp0_2; break; case Hp1: fvchTODisp=STRING_Hp1; @@ -154,49 +232,72 @@ void screenDraw(void) break; } +////расставляем на дисплее надписи FontSet(Segoe_UI_Rus_10); - OLED_DrawStr(STRING_KPR, 1, 10, TEXT); + OLED_DrawStr(STRING_DATCHIK, 1, 10, TEXT); if(menuPointer==KPR0) DrawSome(currentData.IK0, 40, 10, CURSOR); - else {DrawSome(currentData.IK0, 40, 10, TEXT); - } + else DrawSome(currentData.IK0, 40, 10, TEXT); + if(menuPointer==KPR1) DrawSome(currentData.IK1, 47, 10, CURSOR); - else {DrawSome(currentData.IK1, 47, 10, TEXT); - } + else DrawSome(currentData.IK1, 47, 10, TEXT); + if(menuPointer==KPR2) DrawSome(currentData.IK2, 54, 10, CURSOR); - else {DrawSome(currentData.IK2, 54, 10, TEXT); - } + else DrawSome(currentData.IK2, 54, 10, TEXT); + if(menuPointer==KPR3) DrawSome(currentData.IK3, 61, 10, CURSOR); - else {DrawSome(currentData.IK3, 61, 10, TEXT); - } + else DrawSome(currentData.IK3, 61, 10, TEXT); + if(menuPointer==KPR4) DrawSome(currentData.IK4, 68, 10, CURSOR); - else {DrawSome(currentData.IK4, 68, 10, TEXT); + else DrawSome(currentData.IK4, 68, 10, TEXT); + + if(menuPointer==KPR5) DrawSome(currentData.IK5, 75, 10, CURSOR); + else DrawSome(currentData.IK5, 75, 10, TEXT); + + if(menuPointer==UNITSELECT){ + OLED_DrawStr(STRING_PKL, 85, 10, CURSOR); + OLED_DrawStr(STRINGS_UNITS[currentData.UNIT], 109, 10, CURSOR); + } else { + OLED_DrawStr(STRING_PKL, 85, 10, TEXT); + OLED_DrawStr(STRINGS_UNITS[currentData.UNIT], 109, 10, TEXT); } - - - OLED_DrawStr(STRING_PKL_MS2, 80, 10, TEXT); //////////////////////////// + /* Статичная строка выхода OLED_DrawStr(STRING_VIHOD, 1, 24, TEXT); if(menuPointer==OUT)OLED_DrawStr(kuToDispl, 40, 24, CURSOR); else OLED_DrawStr(kuToDispl, 40, 24, TEXT); - OLED_DrawStr(STRING_MV_MS2, 60, 24, TEXT); + OLED_DrawStr(STRING_MV_MS2, 67, 24, TEXT); //////////////////////////// + */ + setOffsetKuDisplay(); //определяем устанавливаем единицы выхода //todo: считать часто флоаты вредно + + OLED_DrawStr(STRING_VIHOD, 1, 24, TEXT); + /// делаем новую строку из STRINGS_OUTUNITS + units + + char *result = malloc(strlen(STRINGS_OUTUNITS[currentData.IKU+OffsetKuDisplay]) + strlen(STRINGS_UNITS[currentData.UNIT]) + 1); // +1 for the null-terminator + // in real code you would check for errors in malloc here + strcpy(result, STRINGS_OUTUNITS[currentData.IKU+OffsetKuDisplay]); + strcat(result, STRINGS_UNITS[currentData.UNIT]); + + if(menuPointer==OUT)OLED_DrawStr((char *)result, 40, 24, CURSOR); + else OLED_DrawStr((char *)result, 40, 24, TEXT);//todo: STRINGS_OUTUNITS и units получается мутно + free(result); OLED_DrawStr(STRING_FVCH, 2, 36, TEXT); - if(menuPointer==FVCH) OLED_DrawStr(fvchTODisp, 26, 36, CURSOR); - else OLED_DrawStr(fvchTODisp, 26, 36, TEXT); - OLED_DrawStr(STRING_GC, 42, 36, TEXT); + if(menuPointer==FVCH) OLED_DrawStr(fvchTODisp, 19, 36, CURSOR); + else OLED_DrawStr(fvchTODisp, 19, 36, TEXT); + OLED_DrawStr(STRING_GC, 35, 36, TEXT); ////////////// - OLED_DrawStr(STRING_FNCH, 58, 36, TEXT); + OLED_DrawStr((char *)STRING_FNCH, 63, 36, TEXT); if(menuPointer==FNCH) OLED_DrawStr(fnchTODisp, 83, 36, CURSOR); else OLED_DrawStr(fnchTODisp, 83, 36, TEXT); - OLED_DrawStr(STRING_KGC, 103, 36, TEXT); + OLED_DrawStr((char *)STRING_KGC, 103, 36, TEXT); ////////////// if(menuPointer==GROUND) OLED_DrawStr(plavZemlToDisp, 20, 48, CURSOR); @@ -213,4 +314,144 @@ FontSet(Segoe_UI_Rus_10); if((menuPointer==GROUND)&&(set.plavZeml==1)) OLED_DrawStr(STRING_PLAVAJUSHAJA_ZEMLA, CENTER, 48, CURSOR); else if(set.plavZeml==1) OLED_DrawStr(STRING_PLAVAJUSHAJA_ZEMLA, CENTER, 48, TEXT); */ -} +} // end screenDraw + + +void screenDrawCallibration(void) +{ + +///////проверяем КУ/значение выхода. присваеваем указателю соответсвующее значение + switch(currentData.IKU){ ///сделать инлайн функцию + case Ku0_1: + kuToDispl=STRING_Ku0_1; + break; + case Ku0_2: + kuToDispl=STRING_Ku0_2; + break; + case Ku0_5: + kuToDispl=STRING_Ku0_5; + break; + case Ku1: + kuToDispl=STRING_Ku1; + break; + case Ku2: + kuToDispl=STRING_Ku2; + break; + case Ku5: + kuToDispl=STRING_Ku5; + break; + case Ku10: + kuToDispl=STRING_Ku10; + break; + case Ku20: + kuToDispl=STRING_Ku20; + break; + case Ku50: + kuToDispl=STRING_Ku50; + break; + case Ku100: + kuToDispl=STRING_Ku100; + break; + case Ku200: + kuToDispl=STRING_Ku200; + break; + case Ku500: + kuToDispl=STRING_Ku500; + break; + case Ku1000: + kuToDispl=STRING_Ku1000; + break; + } + + + + + ///////проверяем ФВЧ выхода. присваеваем указателю соответсвующее значение + switch(currentData.IFV){ + case Hp0_2: + fvchTODisp=STRING_Hp0_2; + break; + case Hp1: + fvchTODisp=STRING_Hp1; + break; + case Hp2: + fvchTODisp=STRING_Hp2; + break; + case Hp10: + fvchTODisp=STRING_Hp10; + break; + } + + + switch(currentData.IFN){ + case Lp100: + fnchTODisp=STRING_Lp100; + break; + case Lp300: + fnchTODisp=STRING_Lp300; + break; + case Lp1000: + fnchTODisp=STRING_Lp1000; + break; + case Lp3000: + fnchTODisp=STRING_Lp3000; + break; + case Lp10000: + fnchTODisp=STRING_Lp10000; + break; + case Lp30000: + fnchTODisp=STRING_Lp30000; + break; + case Lp100000: + fnchTODisp=STRING_Lp100000; + break; + } + + + switch(currentData.IPZ){ + case 0: + plavZemlToDisp=STRING_OBSHAJA_ZEMLJA; + break; + case 1: + plavZemlToDisp=STRING_PLAVAJUSHAJA_ZEMLA; + break; + } + +////расставляем на дисплее надписи + +FontSet(Segoe_UI_Rus_10); + OLED_DrawStr(STRING_KORREKCIA_USILENIA, CENTER, 10, TEXT); //Заголовок + OLED_DrawStr(STRING_KASKAD, 1, 24, TEXT); //каскад + + if(menuPointer==KUSET) OLED_DrawStr(STRINGS_KU[currentData.IKU], 45, 24, CURSOR);// отображаем коэфициент усиления + else OLED_DrawStr(STRINGS_KU[currentData.IKU], 45, 24, TEXT); + + OLED_DrawStr(STRING_ZNACHENIE_DAC, 1, 36, TEXT); + + + //поцифрам выводим соответсвующий усилению значение ЦАП + // делаем побитовый & с маской + // + uint16_t correctedKutoDispl = correctedKu;//Наверное лишнее + if(menuPointer==DAC0SET) DrawSome((correctedKu[currentData.IKU]/1000), 85, 36, CURSOR); + else DrawSome((correctedKu[currentData.IKU]/1000), 85, 36, TEXT); + + + if(menuPointer==DAC1SET) DrawSome(((correctedKu[currentData.IKU]%1000)/100), 92, 36, CURSOR); + else DrawSome(((correctedKu[currentData.IKU]%1000)/100), 92, 36, TEXT); + + if(menuPointer==DAC2SET) DrawSome(((correctedKu[currentData.IKU]%100)/10), 99, 36, CURSOR); + else DrawSome(((correctedKu[currentData.IKU]%100)/10), 99, 36, TEXT); + + if(menuPointer==DAC3SET) DrawSome(((correctedKu[currentData.IKU]%10)/1), 106, 36, CURSOR); + else DrawSome(((correctedKu[currentData.IKU]%10)/1), 106, 36, TEXT); + + if(menuPointer==SAVE){ + OLED_DrawStr(STRING_SOHRANIT_IZMENENIYA, 1, 48, CURSOR); //todo:отображать сохранения + } + + + + + +} // end screenDraw diff --git a/Core/Src/usart.c b/Core/Src/usart.c index cf08780..99f54c8 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -81,7 +81,8 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN USART1_MspInit 1 */ - + HAL_NVIC_SetPriority(USART1_IRQn, 8, 6); + HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE END USART1_MspInit 1 */ } } @@ -109,6 +110,77 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) } } + + +void USART1_IRQHandler(void) +{ + if((__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_RXNE)) && (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))) + { + //Receive_Complete(); + HAL_UART_RxCpltCallback(&huart1); + } + else + { + HAL_UART_IRQHandler(&huart1); + } + + if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)) + __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); + + if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_PE)) + __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_PE); + + if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_FE)) + __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_FE); + + if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_NE)) + __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE); +} + + + +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + if(huart->Instance == USART1) // Sensors + { + // HAL_GPIO_WritePin(SENS_RE_GPIO_Port, SENS_RE_Pin, GPIO_PIN_RESET); + //TX_OK = true; + __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); + } + else + { +// Transfer_Complete(); + } +} + +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + if(huart->Instance == USART1) // Sensors + { +// RX_OK = true; + } + else + { +// Receive_Complete(); + } +} + + + +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + if(huart->Instance == USART1) // Sensors + { +// RX_OK = TX_OK = false; +// HAL_GPIO_WritePin(SENS_RE_GPIO_Port, SENS_RE_Pin, GPIO_PIN_RESET); + } + +// UART_ERROR = true; +// HAL_UART_Abort_IT(huart); +} + + + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */