#include "main.h" #include "ReadKey.h" #include "key.h" #include "ReadKey.h" #include "crc8.h" #include "led.h" #include "eventUnit.h" #include "myADC.h" #include "myInputCapture.h" #include "myLcd.h" #include "myDisplayUnit.h" #include "myFlashData.h" #include "myTim.h" #include "myUart.h" #include "myUart3.h" #include "myRadio.h" #define SOFT_VERSION 0x11 #define SET_RF_FREQ_HZ(base, ch,step) base+ch*step*10*1000 //---------------key KeyParamExt_ts *getKeyReturn; key_value_te keyPressValue; static uint16_t present_adcValue; static uartPacket_ts uart3Packet; static bool startToCountingRx = false; static float present_moduleCurrendValue; static float validPackageCount = 0; static uint32_t rfContinuousFreq = 1; static float rfRxTestRate = 1; static bool txStart; static rfRxPacket_ts rfRecvPacket; static rfTxPacket_ts rfTxPacket; static uint32_t rfTxCount = 0; static uint32_t rfRxCount = 0; static uint32_t rfTxAndGetAckTime_ms = 0; static uint32_t rfTxAndGetAckTimeSet_ms = 1000; static uint32_t rfTxReTmCount = 0; static bool rfTxGetAckStatus = false; static uint8_t rfCtrlMode; const uint32_t rfBaseFreqList[DVTP_MAX_COUNT] = { /*"0"*/315000000, /*"1"*/433000000, /*"2"*/490000000, /*"3"*/868000000, /*"4"*/915000000, }; const uint32_t rfBaudrateList[MAX_RF_BAUDRATE_COUNT] = { 40000, 80000, 200000, 400000 }; const int8_t rfTxPowerList[RF_TX_PWR_MAX_COUNT] = { -15,-6,-1,0,1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18 }; static char deviceNameList[DVTP_MAX_COUNT][20] = { /*"0"*/"VG4131S315N0S1", /*"1"*/"VG4131S433N0S1", /*"2"*/"VG4131S490N0S1", /*"3"*/"VG4131S868N0S1", /*"4"*/"VG4131S915N0S1", }; userParams_ts deviceInforDef = { .projectModel = "VG4131", .deviceId = 1, .rfChannel = 0, .channelStep = 100, .txPower = RF_TX_PWR_P_18, .rfBaudrate = RF_BAUDRATE_40k, .chipType = DVTP_VG4131S433N0S1, }; userParams_ts deviceInfor; #define EVENT_TIME_CYCLE_10ms 0 #define EVENT_TIME_CYCLE_500ms 1 #define EVENT_UART3_RECV 2 #define EVENT_UART_RECV 3 // #define EVENT_TEST_RX_TIMEOUT 4 #define EVENT_RF_CONTINUOUS_TX 5 #define EVENT_RF_CONTINUOUS_RX 6 #define EVENT_RF_IDLE 7 #define EVENT_RF_CONTINUOUS_TX_MD 8 #define EVENT_TIMEOUT_TO_SAVE_PARAMS 9 #define EVENT_RF_GET_RX_PACKET 10 #define EVENT_RF_PACKET_TX 11 #define EVENT_RF_PACKET_RX 12 #define EVENT_TIMEOUT_CHECK_RF_PACKET 13 #define EVENT_RF_RX_ERROR 14 static uint16_t eventReturn; void dealKeyPressProccess(void) { if (getKeyReturn->haveKey == false) { return; } getKeyReturn->haveKey = false; switch (getKeyReturn->value) { case LEFT_KEY: { if(getLongKeySt() == true) { clearLongKey(); EnableReleaseKey(); myDisplay_enter(ENTER_LAST_PAGE); } else { if (getReleaseKeySt()) { } else { EnableLongKey(5); } } } break; case RIGHT_KEY: { if(getLongKeySt() == true) { clearLongKey(); EnableReleaseKey(); } else { if (getReleaseKeySt()) { } else { EnableLongKey(5); } } } break; case TOP_KEY: { if(getCyclicKeySt() == true) { EnableCyclicKey(30); myDisplay_change(1); } else { if (getReleaseKeySt()) { beep_shortBeep(); myDisplay_change(1); } else { EnableReleaseKey(); EnableCyclicKey(300); } } } break; case BOTTOM_KEY: { if(getCyclicKeySt() == true) { EnableCyclicKey(30); myDisplay_change(0); } else { if (getReleaseKeySt()) { beep_shortBeep(); myDisplay_change(0); } else { EnableReleaseKey(); EnableCyclicKey(300); } } } break; case OK_KEY: { if(getLongKeySt() == true) { clearLongKey(); EnableReleaseKey(); beep_shortBeep(); myDisplay_enter(ENTER_NEXT_PAGE); } else { if (getReleaseKeySt()) { } else { EnableLongKey(5); } } } break; default: break; } } /** * * 串口回调函数,当串口有硬件超时时会调用该函数 */ static void rcc_init(void) { //---------普通IO口时钟使能 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE ); //----------SPI1时钟使能 RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE ); //----------复用功能时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) /* ADCCLK = PCLK2/2 */ RCC_ADCCLKConfig(RCC_PCLK2_Div2); #else /* ADCCLK = PCLK2/4 */ RCC_ADCCLKConfig(RCC_PCLK2_Div4); #endif } /** * * 串口回调函数,当串口有硬件超时时会调用该函数 */ void UART1_CALLBACK(uint8_t *buf, uint16_t len) { // if(uartPackage_Rx.isValid == 0) // { // memcpy(uartPackage_Rx.packet, buf, len); // uartPackage_Rx.len = len; // uartPackage_Rx.isValid = 1; // event_post(EVENT_UART_RECV); // } } void UART3_CALLBACK(uint8_t *buf, uint16_t len) { if(uart3Packet.isValid == 0) { memcpy(uart3Packet.packet, buf, len); uart3Packet.len = len; uart3Packet.isValid = true; event_post(EVENT_UART3_RECV); } } /** * * 定时器中断回调,当产生定时器中断会调用该函数 */ void TIM3_CALLBACK(void) { static uint8_t timeCnt_1ms = 0; beep_onDriver(); if(timeCnt_1ms ++ == 5) { timeCnt_1ms = 0; rfTxAndGetAckTime_ms ++; eventDriver(); } } void uiEnterCallback(int pageId, int cursorCount, int status, int value, int direct) { switch (pageId - 1) { case UI_PAGE_ID_ITEM_MODE: { }break; case UI_PAGE_ID_RF_CONTINUOUS: { switch (cursorCount) { case CNT_ITEM_INDEX_TX: { // event_post(status ? EVENT_RF_CONTINUOUS_TX : EVENT_RF_CONTINUOUS_RX); event_post(EVENT_RF_CONTINUOUS_TX); rfCtrlMode = status ? UI_PAGE_ID_RF_CONTINUOUS : 0; } break; case CNT_ITEM_INDEX_RX: { event_post(status ? EVENT_RF_CONTINUOUS_RX : EVENT_RF_IDLE); } break; case CNT_ITEM_INDEX_TX_MD: { event_post(status ? EVENT_RF_CONTINUOUS_TX_MD : EVENT_RF_IDLE); } break; default: break; } } break; case UI_PAGE_ID_TX_PACKET: { switch (cursorCount) { case 0: { // setEvent(EVENT_RF_PACKET_TX , false , 100); setEvent(status ? EVENT_RF_PACKET_TX : EVENT_RF_IDLE, status ? true : false, status ? 500 : 0); rfCtrlMode = status ? UI_PAGE_ID_TX_PACKET : 0; rfTxCount = 0; rfRxCount = 0; txStart = status; } break; case 1: default: break; } } break; case UI_PAGE_ID_RX_PACKET: { switch (cursorCount) { case 0: { event_post(status ? EVENT_RF_PACKET_RX : EVENT_RF_IDLE); rfCtrlMode = status ? UI_PAGE_ID_RX_PACKET : 0; rfTxCount = 0; rfRxCount = 0; validPackageCount = 0; } break; default: break; } } break; case UI_PAGE_ID_SETTING: { if(direct != ENTER_CURRENT_PAGE) { break; } switch (cursorCount) { case SET_ITEM_INDEX_TYPE://chipType { deviceInfor.chipType = value; myDisplay_ui_rf_setting_type(deviceNameList[deviceInfor.chipType]); myRadio_setFrequency(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); } myDisplay_ui_rf_setting_freq(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); setEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS, false, 200); break; case SET_ITEM_INDEX_FREQ://Freq { deviceInfor.rfChannel = value; myRadio_setFrequency(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); } myDisplay_ui_rf_setting_freq(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); setEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS, false, 200); break; case SET_ITEM_INDEX_STEP://channelStep { deviceInfor.channelStep = value; myDisplay_ui_rf_setting_channelStep(deviceInfor.channelStep*10*1000); myRadio_setFrequency(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); } myDisplay_ui_rf_setting_freq(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); setEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS, false, 200); break; case SET_ITEM_INDEX_TXPOWER://TxPower { deviceInfor.txPower = value; myRadio_setTxPower(deviceInfor.txPower); myDisplay_ui_rf_setting_rfPower(rfTxPowerList[deviceInfor.txPower]); setEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS, false, 200); } break; case SET_ITEM_INDEX_RFBAUDRATE://RFBAUDRATE { deviceInfor.rfBaudrate = value; myDisplay_ui_rf_setting_rfBr(rfBaudrateList[deviceInfor.rfBaudrate]); setEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS, false, 200); } break; default: break; } } break; default: break; } } void rfRx_callback(uint8_t status, rfRxPacket_ts packet) { rfRecvPacket = packet; switch (status) { case RX_STA_SECCESS: { myRadio_receiver(); printf("rx packet CallBack\r\n"); event_post(EVENT_RF_GET_RX_PACKET); } break; case RX_STA_TIMEOUT: { event_post(EVENT_RF_RX_ERROR); } break; case RX_STA_PAYLOAD_ERROR: { event_post(EVENT_RF_RX_ERROR); } break; case TX_STA_SECCESS: { printf("tx done\r\n"); LED1_ON_ONE(); myRadio_receiver(); } break; default: break; } } int main(void) { #ifdef BOOTLOADER_APP SCB->VTOR = FLASH_BASE | 0x000C800; #endif userParams_ts userParamsTemp; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 rcc_init(); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag , 开启swd //读取本地保存数据 myFlash_read((uint8_t*)&deviceInfor, sizeof(userParams_ts)); if (crc8_gernCheckT((unsigned char*)&deviceInfor, sizeof(userParams_ts) - 1, deviceInfor.checkSum) == 0) { deviceInfor = deviceInforDef; } if (memcmp(deviceInfor.projectModel, deviceInforDef.projectModel, strlen(deviceInforDef.projectModel)) != 0) { deviceInfor = deviceInforDef; } //初始化按键 key_init(); //初始化LED灯 LED_Init(); //初始化串口 // myUart3_init(115200, UART3_CALLBACK); //用于透传模块测试,需要时再打开 myUart1_init(115200, UART1_CALLBACK); //初始化定时器 myTim1_init(200, TIM3_CALLBACK); //初始化模拟转换ADC,用于无线模块驱动电流检测 myADC_init(); //蜂鸣器初始化 beep_init(); beep_setFreq(deviceInfor.beepNumb); //初始化射频 myRadio_setChipType(deviceInfor.chipType); myRadio_setBaudrate(deviceInfor.rfBaudrate); myRadio_init(0, rfRx_callback); myRadio_setTxPower(deviceInfor.txPower); myRadio_setFrequency(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); // LCD显示屏初始化界面显示 myDisplay_init(uiEnterCallback); myDisplay_ui_firstUi_setDeviceName(deviceNameList[deviceInfor.chipType]); myDisplay_ui_firstUi_setFreq(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); myDisplay_ui_firstUi_setRfPower(rfTxPowerList[deviceInfor.txPower]); myDisplay_ui_firstUi_setRfBr(rfBaudrateList[deviceInfor.rfBaudrate]); myDisplay_setSettingParamsProfile(SET_ITEM_INDEX_TYPE, deviceInfor.chipType, 0, DVTP_MAX_COUNT); myDisplay_setSettingParamsProfile(SET_ITEM_INDEX_FREQ, deviceInfor.rfChannel, 0, 16 + 1); myDisplay_setSettingParamsProfile(SET_ITEM_INDEX_STEP, deviceInfor.channelStep, 25, 200 + 1); myDisplay_setSettingParamsProfile(SET_ITEM_INDEX_TXPOWER, deviceInfor.txPower, RF_TX_PWR_N_15, RF_TX_PWR_MAX_COUNT); myDisplay_setSettingParamsProfile(SET_ITEM_INDEX_RFBAUDRATE, deviceInfor.rfBaudrate, RF_BAUDRATE_40k, MAX_RF_BAUDRATE_COUNT); myDisplay_ui_rf_setting_freq(SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); myDisplay_ui_rf_setting_channelStep(deviceInfor.channelStep*10*1000); myDisplay_ui_rf_setting_type(deviceNameList[deviceInfor.chipType]); myDisplay_ui_rf_setting_rfBr(rfBaudrateList[deviceInfor.rfBaudrate]); myDisplay_ui_rf_setting_rfPower(rfTxPowerList[deviceInfor.txPower]); myDisplay_ui_deviceInfor_setVer(SOFT_VERSION); //上电长想一声 beep_longBeep(); setEvent(EVENT_TIME_CYCLE_10ms, true, 10); setEvent(EVENT_TIME_CYCLE_500ms, true, 500); while(1) { eventReturn = event_pend(); if (getEvent(EVENT_TIME_CYCLE_10ms)) { getKeyReturn = KeyValueChange(keyPressValue); dealKeyPressProccess(); } if (getEvent(EVENT_TIME_CYCLE_500ms)) { present_moduleCurrendValue = myADC_getVoltageValue()/50/0.5*1000; myDisplay_ui_rf_continuos_txCurrent(present_moduleCurrendValue); myDisplay_ui_rf_rxPacket_rxCurrent(present_moduleCurrendValue); myDisplay_ui_rf_continuos_rxRssi(myRadio_getRssi()); uiTimerFlash_callBack(); } if (getEvent(EVENT_RF_CONTINUOUS_RX)) { myRadio_setCtrl(RADIO_EXT_CONTROL_RX_SENSITIVITY, SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); startToCountingRx = true; validPackageCount = 0; rfTxCount = 0; rfRxCount = 0; setEvent(EVENT_RF_PACKET_TX, true, 200); } if (getEvent(EVENT_RF_CONTINUOUS_TX)) { myRadio_setCtrl(RADIO_EXT_CONTROL_TX_UNMODULATED, SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); } if (getEvent(EVENT_RF_CONTINUOUS_TX_MD)) { myRadio_setTxPower(deviceInfor.txPower); myRadio_setCtrl(RADIO_EXT_CONTROL_TX_MODULATED, SET_RF_FREQ_HZ(rfBaseFreqList[deviceInfor.chipType], deviceInfor.rfChannel, deviceInfor.channelStep)); } if (getEvent(EVENT_RF_PACKET_TX)) { rfTxPacket.len = strlen("hello world"); memcpy(rfTxPacket.payload, "hello world", rfTxPacket.len); rfTxPacket.payload[rfTxPacket.len] = ((rfTxCount) & 0x0f) + 0x30; rfTxPacket.len ++; rfTxPacket.payload[rfTxPacket.len] = 0; myDisplay_ui_rf_tx_packet_buffer(rfTxPacket.payload); myDisplay_ui_rf_tx_packet_counts((float)rfRxCount/rfTxCount * 100 * 10, rfTxCount); myDisplay_ui_rf_continuos_rxLen((float)rfRxCount / rfTxCount * 100, rfRxCount); myRadio_transmit(&rfTxPacket); printf("tx start\r\n"); event_clear(EVENT_TIMEOUT_CHECK_RF_PACKET); rfTxCount ++; if (rfCtrlMode == UI_PAGE_ID_TX_PACKET) { if(rfTxAndGetAckTimeSet_ms == 0 || rfTxAndGetAckTimeSet_ms > 1500) { setEvent( EVENT_RF_PACKET_TX, false, 1500); } else { setEvent( EVENT_RF_PACKET_TX, false, rfTxAndGetAckTimeSet_ms*30/10); } rfTxAndGetAckTime_ms = 0; if (rfTxGetAckStatus == false) { myDisplay_ui_rf_tx_packet_consumeTime(~(uint32_t)0); rfTxReTmCount ++; if (rfTxReTmCount == 10) { rfTxReTmCount = 0; rfTxAndGetAckTimeSet_ms = 0; } // beep_longBeep(); } rfTxGetAckStatus = false; } if (startToCountingRx) { if (rfTxCount == 10) { event_clear(EVENT_RF_PACKET_TX); } } } if (getEvent(EVENT_RF_PACKET_RX)) { myRadio_receiver(); // validPackageCount = 0; } if (getEvent(EVENT_RF_GET_RX_PACKET)) { if (rfCtrlMode == UI_PAGE_ID_RX_PACKET) { // setEvent( EVENT_RF_PACKET_TX, false, 0); rfTxPacket.len = strlen("hello world"); memcpy(rfTxPacket.payload, "hello world", rfTxPacket.len); rfTxPacket.payload[rfTxPacket.len] = ((rfTxCount) & 0x0f) + 0x30; rfTxPacket.len ++; rfTxPacket.payload[rfTxPacket.len] = 0; myRadio_transmit(&rfTxPacket); printf("tx start\r\n"); } rfRxCount ++; if (rfCtrlMode == UI_PAGE_ID_TX_PACKET) { myDisplay_ui_rf_tx_packet_consumeTime(rfTxAndGetAckTime_ms); myDisplay_ui_rf_tx_packet_ackRssi(rfRecvPacket.rssi); myDisplay_ui_rf_tx_packet_counts((float)rfRxCount/rfTxCount * 100 * 10, rfTxCount); if(rfTxAndGetAckTime_ms == 0 || rfTxAndGetAckTime_ms >= 1500) { setEvent( EVENT_RF_PACKET_TX, false, 1500); } else { setEvent( EVENT_RF_PACKET_TX, false, rfTxAndGetAckTime_ms*30/10); } rfTxGetAckStatus = true; rfTxReTmCount = 0; rfTxAndGetAckTimeSet_ms = rfTxAndGetAckTime_ms; rfTxAndGetAckTime_ms = 0; } myDisplay_ui_rf_rxPacket_rssi(rfRecvPacket.rssi); myDisplay_ui_rf_rxPacket_count(rfRxCount); myDisplay_ui_rf_rxPacket_scroll_buffer(rfRecvPacket.payload, 0); myDisplay_ui_rf_rxContinue_scroll_buffer(rfRecvPacket.payload, 0); myDisplay_ui_rf_continuos_rxLen(rfRxCount / rfTxCount * 100, rfRxCount); printf("rf Rx packet<%u>: ", rfRecvPacket.len); for (int i = 0; i < rfRecvPacket.len; i++) { printf("%02X ", rfRecvPacket.payload[i]); } printf("\r\n"); memset(rfRecvPacket.payload, 0, sizeof(rfRecvPacket.payload)); LED2_ON_ONE(); } if (getEvent(EVENT_RF_RX_ERROR)) { myRadio_receiver(); } if (getEvent(EVENT_RF_IDLE)) { startToCountingRx = false; myRadio_abort(); event_clear(EVENT_RF_PACKET_TX); } if (getEvent(EVENT_UART_RECV)) { // if (uartPackage_Rx.isValid) // { // uartPackage_Rx.packet = 0; // } } if (getEvent(EVENT_UART3_RECV)) { if (uart3Packet.isValid) { uart3Packet.isValid = false; uart3Packet.len = 0; myDisplay_ui_rf_rxPacket_buffer(uart3Packet.packet, 0); } } if (getEvent(EVENT_TIMEOUT_TO_SAVE_PARAMS)) { deviceInfor.checkSum = crc8_ger((unsigned char*)&deviceInfor, sizeof(userParams_ts) - 1); myFlash_write((uint8_t*)&deviceInfor, sizeof(userParams_ts)); } keyPressValue = keyScan(); myRadio_process(); } }