From 6306b7d38f41414d452b73d2b1159b2ec1e8b4c5 Mon Sep 17 00:00:00 2001 From: Zhangwen <13970730+mkc46119@user.noreply.gitee.com> Date: Fri, 7 Mar 2025 19:57:48 +0800 Subject: [PATCH] =?UTF-8?q?feature:1.=E7=94=B5=E6=B1=A0=E7=94=B5=E9=87=8F?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=8A=9F=E8=83=BD=EF=BC=9Amsp=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=9B=E7=94=B5=E5=8E=8B=E9=87=87=E9=9B=86=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E5=BE=85=E8=A1=A5=E5=85=85=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 7 +- source/app/app_config.c | 2 +- source/app/main.c | 34 +++--- source/app/main.h | 1 + source/app/task_keystatus.c | 2 + source/bsp/bsp_WT2605B.c | 9 +- source/bsp/bsp_WT2605B.h | 13 ++- source/bsp/bsp_oid.c | 3 +- source/bsp/bsp_ooid.c | 6 +- source/clib/bit.h | 6 +- source/msp/msp_adc.c | 223 ++++++++++++++++++++++++++++++++++++ source/msp/msp_adc.h | 63 ++++++++++ 12 files changed, 340 insertions(+), 29 deletions(-) create mode 100644 source/msp/msp_adc.c create mode 100644 source/msp/msp_adc.h diff --git a/.vscode/settings.json b/.vscode/settings.json index f9bc8b4..b75f5ca 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -75,6 +75,11 @@ "vector": "c", "string_view": "c", "initializer_list": "c", - "app_eeprom.h": "c" + "app_eeprom.h": "c", + "c51_macro.H": "cpp", + "msp_adc.h": "c", + "system_error": "c", + "*.tcc": "c", + "ctype.h": "c" } } \ No newline at end of file diff --git a/source/app/app_config.c b/source/app/app_config.c index b7ff8c7..67cf09d 100644 --- a/source/app/app_config.c +++ b/source/app/app_config.c @@ -37,7 +37,7 @@ void L3_param_init(void) Lc_strcpy(G.ap_pwd,"ccsens123"); #if 0 - wr_buf.wIndex = wr_buf.rIndex = 0; + wr_buf.wIndex = wr_buf.rIndex = 0; wr_buf.maxsize = sizeof(wr_buf.buf)/sizeof(PenPoint); for(i=0;iKey1_handled == 0) { s->Key1_handled = 1; + L0_uart0_uc('1'); L2_WT2605B_VioceUp(); // 音量增加 } } @@ -93,6 +94,7 @@ void L3_task_keystatus_handler(S_TASK_KEYSTATUS *s) if (s->Key2_handled == 0) { s->Key2_handled = 1; + L0_uart0_uc('2'); L2_WT2605B_VioceDown(); // 音量减少 } } diff --git a/source/bsp/bsp_WT2605B.c b/source/bsp/bsp_WT2605B.c index 410257c..396d38f 100644 --- a/source/bsp/bsp_WT2605B.c +++ b/source/bsp/bsp_WT2605B.c @@ -12,10 +12,17 @@ TS_SPEECH_AUDIO audio_TCP_connected = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x34,0x92 TS_SPEECH_AUDIO audio_config_mode = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x35,0x93,0xEF}; //配置模式 TS_SPEECH_AUDIO audio_config_complete = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x36,0x94,0xEF}; //配置完成 TS_SPEECH_AUDIO audio_config_phone = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x37,0x95,0xEF}; //手机APP配置 - TS_SPEECH_AUDIO audio_volume_up = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x38,0x96,0xEF}; //音量增加 TS_SPEECH_AUDIO audio_volume_down = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x39,0x97,0xEF}; //音量减少 +TS_SPEECH_AUDIO audio_game_maze = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x30,0x8F,0xEF}; //迷宫 +TS_SPEECH_AUDIO audio_game_different = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x31,0x90,0xEF}; //找不同 +TS_SPEECH_AUDIO audio_game_shulte = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x32,0x91,0xEF}; //舒尔特方格 +TS_SPEECH_AUDIO audio_game_error = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x33,0x92,0xEF}; //错误 +TS_SPEECH_AUDIO audio_game_correct = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x34,0x93,0xEF}; //正确提示音 +TS_SPEECH_AUDIO audio_game_overtime = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x35,0x94,0xEF}; //训练时间到 +TS_SPEECH_AUDIO audio_game_complete = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x36,0x95,0xEF}; //训练完成 + TS_SPEECH_VOLUME volume_control = {0x7E,0x04,0xAE,0x1E,0xD0,0xEF}; //音量控制 diff --git a/source/bsp/bsp_WT2605B.h b/source/bsp/bsp_WT2605B.h index a21e68e..f9e35c1 100644 --- a/source/bsp/bsp_WT2605B.h +++ b/source/bsp/bsp_WT2605B.h @@ -32,15 +32,16 @@ extern TS_SPEECH_AUDIO audio_TCP_connected; extern TS_SPEECH_AUDIO audio_config_mode; extern TS_SPEECH_AUDIO audio_config_complete; extern TS_SPEECH_AUDIO audio_config_phone; - extern TS_SPEECH_AUDIO audio_volume_up; extern TS_SPEECH_AUDIO audio_volume_down; -extern TS_SPEECH_AUDIO audio_select; -extern TS_SPEECH_AUDIO audio_tip; - -extern TS_SPEECH_AUDIO audio_zmg_again; -extern TS_SPEECH_AUDIO audio_zmg_success; +extern TS_SPEECH_AUDIO audio_game_maze; //迷宫 +extern TS_SPEECH_AUDIO audio_game_different; //找不同 +extern TS_SPEECH_AUDIO audio_game_shulte; //舒尔特方格 +extern TS_SPEECH_AUDIO audio_game_error; //错误 +extern TS_SPEECH_AUDIO audio_game_correct; //正确 +extern TS_SPEECH_AUDIO audio_game_overtime; //训练时间到 +extern TS_SPEECH_AUDIO audio_game_complete; //训练完成 extern TS_SPEECH_VOLUME volume_control; diff --git a/source/bsp/bsp_oid.c b/source/bsp/bsp_oid.c index 6d4149e..5a5e0df 100644 --- a/source/bsp/bsp_oid.c +++ b/source/bsp/bsp_oid.c @@ -6,6 +6,7 @@ #include "../ctask/task.h" #include "../ctask/tick.h" #include "../app/app_task_speech.h" +#include "../bsp/bsp_WT2605B.h" @@ -669,7 +670,7 @@ void L1_Oid_readoid(void) { if(!OID_DET) { - // LED1 = ~LED1; + L2_WT2605B_Broadcast(&audio_game_correct); ts_oid.pre_x = ts_oid.X100; ts_oid.pre_y = ts_oid.Y100; L0_oid_Recv64(); //ts_oid.rec.d[i/8] <<= 1; diff --git a/source/bsp/bsp_ooid.c b/source/bsp/bsp_ooid.c index acd581e..2ee0732 100644 --- a/source/bsp/bsp_ooid.c +++ b/source/bsp/bsp_ooid.c @@ -1,11 +1,11 @@ #include "../bsp/bsp_ooid.h" #include "../bsp/bsp_wifi.h" - void L2_OID_init() { - D_stdIO_P3(BITN4); - D_HighI_P5(BITN0); + D_HighI_P3(BITN4); + P34 = 0; + D_HighR_P5(BITN0); L2_OID_WIFI_Open(); } diff --git a/source/clib/bit.h b/source/clib/bit.h index 62cb578..a56298c 100644 --- a/source/clib/bit.h +++ b/source/clib/bit.h @@ -351,12 +351,16 @@ #define BITN_1(X,BITNx) (X)|= (BITNx) #define BITN_0(X,BITNx) (X)&=~(BITNx) #define BITN_G(X,BITNx) ((X)&(BITNx)) +#define BITN_M(X,mask) (X)&=(mask) + +#define BITN_S(X,BITNx,mask) BITN_M(X,mask);BITN_1(X,BITNx)///֮ͨĶλ + + //BITN_1(reg,BITN0) #define BITS_1(X,BITx) (X)|= (BITx) #define BITS_0(X,BITx) (X)&=~(BITx) - #define BITC_1 0X01 #define BITC_2 0X03 #define BITC_3 0X07 diff --git a/source/msp/msp_adc.c b/source/msp/msp_adc.c new file mode 100644 index 0000000..c48c9f9 --- /dev/null +++ b/source/msp/msp_adc.c @@ -0,0 +1,223 @@ +#include "../msp/msp_adc.h" +#include "../msp/uart0.h" + + +/********* +1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; +2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够, 内部才能和外部电势相等。 +19.1.1 ADC 控制寄存器(ADC_CONTR),PWM 触发 ADC 控制 +符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 +ADC_CONTR BCH ADC_POWER ADC_START ADC_FLAG ADC_EPWMT ADC_CHS[3:0] +ADC_POWER:ADC +电源控制位 0: +关闭 ADC 电源 1:打开 ADC 电源。 +建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗 +特别注意: 1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; +2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够内部才能和外部电势相等。 +ADC_START:ADC 转换启动控制位。写入 1 后开始 ADC 转换,转换完成后硬件自动将此位清零。 +0:无影响。即使 ADC 已经开始转换工作,写 0 也不会停止A/D 转换。 +1:开始 ADC 转换,转换完成后硬件自动将此位清零。 +ADC_FLAG:ADC 转换结束标志位。当 ADC 完成一次转换后,硬件会自动将此位置 1, +并向 CPU 提出 中断请求。此标志位必须软件清零。 + +层次 >逻辑 >数据流 >测试 >工具 > 代码 +套路(方法论)才是最主要的 + 12位 800K + 反推 +22M / 64(采样的总时间)= + +*********/ + + +void L0_ADC_init(void) +{ + P0M0 = 0x00; + P0M1 = 0x10; //设置P0.4为ADC口 + + ADC_CONTR = 0; + D_ADC_POWER_ON(); //打开ADC电源 + // D_ADC_average(); + // D_EN_EREG(); + + ///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择保持时间控制//22M + ///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于 01010B) + ADCTIM = B1010_0000|B0000_1111; + + ADCCFG = B0010_0000|4; //SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)} + + Lc_delay_ms(1); //给MCU的内部ADC模块电源打开后,需等待约1ms,等MCU内部的ADC电源稳定后再让ADC工作 + D_ADC_CH(D_ADC_CH_12); //选择ADC12(P04) + D_ADC_START(); + + L0_uart0_sendstr("\r\n L0_ADC_init on"); +} + + +U16 L1_ADC_Read(u8 CHA) +{ + vU16 adc_data; + vU32 overtimes; + int *BGV; //内部1.19V参考信号源值存放在idata中 + //idata的EFH地址存放高字节 + //idata的F0H地址存放低字节 + BGV = (int idata *)0xef; + //vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压 + //注意,此电压的单位为毫伏(mV) + D_ADC_CH(CHA); + D_ADC_START(); + // NOP2(); + NOP(); + NOP(); + // BITN_S(ADCEXCFG,) + // while(1 == D_ADC_OVER()) + // { + // if(overtimes++ > 600000)//// + // { + // // printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA); + // L0_uart0_sendstr("ADC_CONTR = "); + // L0_uart0_ushex(ADC_CONTR); + // L0_uart0_0d0a(); + // L0_uart0_sendstr("CHA = "); + // L0_uart0_ushex(CHA); + // return 0;/// !3Ac7 W7 291 + // } + // } + D_ADC_CLEARFLAG(); + + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + ///adc_data >>= 3; + ///r = adc_data; + return adc_data; +} + +#if 0 + +U16 L1_ADC_Read(u8 CHA) +{ + vU16 adc_data; + ADC_CONTR &=0xF8; + ADC_CONTR |=0x40;//启动AD转换 + //ADC_CONTR |= CHA; + CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清标志 + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + //adc_data = adc_data<<2; + //adc_data = ADC_RESL & 0X03; + //adc_data = adc_data | adc_data; + ///L0_uart1_sendstr("ADC:"); + ///L0_uart1_ushex(adc_data); + ///L0_uart1_0d0a(); + return (adc_data); //返回A/D转换结果(8位) + +} + +///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc) + + +void L3_ADC_debug(u8 filter) +{ + u8 i; + if(filter == Ts_debug.td->filter) + {///filter num d1 d2 d3 ....dn + //// FD 08 11 22 33 44 55 66 77 88 + L1_uartD_uchexArray(Ts_debug.td,Ts_debug.td->R1); + if(0x10 == Ts_debug.td->ocr)///read 读,判断哪个adc读取 + {//fa 05 f1 33 10 + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // sla reg1 num + /// f1 32 15 06 10 + //printf("\r\n ch(%d)=",(int)Ts_debug.td->R2); + for(i = 0xf1;i <= 0xf8;i++) + { + Ts_debug.au16 = L1_ADC_Read_PT(i); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc1 + } + /* + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf2); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc2 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf3); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc3 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf4); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc4 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf5 ); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc5 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf6); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc6 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf7); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc7 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf8); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc8 + */ + } + else if(0x11 == Ts_debug.td->ocr) + { + //printf("\r\n ch(%d)=",(int)Ts_debug.td->R1); + //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); + } + else if(0x12 == Ts_debug.td->ocr) + { + } + else + { + //printf"(\r\n ch(%d)=",(int)Ts_debug.td->R1); + //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); + } + } +} + +U16 L1_ADC_Read_VBAT (unsigned char CHA)//CHA通道号 +{ + U16 adc_data; + #if 0 + U8 AD_FIN=0; //存储A/D转换标志 + //CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置 + Lc_delay_nop(1); + //ADC_CONTR |= CHA; //选择A/D当前通道 + //Lc_delay_nop(1); + ADC_CONTR |= 0x80; //启动A/D电源 + Lc_delay_ms(1); //使输入电压达到稳定(1ms即可) + ADC_CFG = 0x20; + Lc_delay_nop(1); + CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + //ADC_CONTR |= CHA; //选择A/D当前通道 + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + Lc_delay_nop(1); + ADC_CONTR |= 0x40; //启动AD转换 + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清完成标志 + //P2 = ADC_RES; //读取ADC结果 + #endif + ADC_CONTR &=0xF8; + ADC_CONTR |=0x40;//启动AD转换 + //ADC_CONTR |= CHA; + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清标志 + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + //adc_data = adc_data<<2; + //adc_data = ADC_RESL & 0X03; + //adc_data = adc_data | adc_data; + //L0_uart0_ushex(adc_data); + //L0_uart0_0d0a(); + return (adc_data); //返回A/D转换结果(8位) +} +#endif diff --git a/source/msp/msp_adc.h b/source/msp/msp_adc.h new file mode 100644 index 0000000..a3b3c23 --- /dev/null +++ b/source/msp/msp_adc.h @@ -0,0 +1,63 @@ +#ifndef _msp_adc_H_ +#define _msp_adc_H_ + +#include "../bsp/bsp_config.h" +#include "../msp/UART0.h" +#include "../cpu/STC_stc8h3k.H" +#include "../clib/bit.h" + + + +#define ADC_POWER BITN7 +#define ADC_START BITN6 +#define ADC_FLAG BITN5 +#define ADC_EPWMT BITN4 + +#define D_ADC_CHS_mask 0xF0 + +#define ADC_CHS3 BITN3 +#define ADC_CHS2 BITN2 +#define ADC_CHS1 BITN1 +#define ADC_CHS0 BITN0 + +#define ADC_RESFMT BITN5 + +#define ADC_SPEED3 BITN3 +#define ADC_SPEED2 BITN2 +#define ADC_SPEED1 BITN1 +#define ADC_SPEED0 BITN0 + +#define D_CVTIMESEL_mask 0xF8 + +#define D_CVTIMESEL_1 0 +#define D_CVTIMESEL_2 4 +#define D_CVTIMESEL_4 5 +#define D_CVTIMESEL_8 6 +#define D_CVTIMESEL_16 7 + + +#define D_ADC_average() D_EN_EREG(); BITN_S(ADCEXCFG,D_CVTIMESEL_16,D_CVTIMESEL_mask)////4 22M 1ms--- + + +#define D_ADC_POWER_ON() BITN_1(ADC_CONTR, ADC_POWER) +#define D_ADC_POWER_OFF() BITN_0(ADC_CONTR, ADC_POWER) + +#define D_ADC_START() BITN_1(ADC_CONTR, ADC_START) +#define D_ADC_STOP() BITN_0(ADC_CONTR, ADC_START) + +#define D_ADC_OVER() BITN_G(ADC_CONTR, ADC_FLAG) +#define D_ADC_CLEARFLAG() BITN_0(ADC_CONTR, ADC_FLAG) + +#define D_ADC_CH(X) BITN_S(ADC_CONTR,X,D_ADC_CHS_mask) + +#define D_ADC_CH_12 12 + +#define D_cmd_filter_adc 0xfa + +extern void L0_ADC_init (void); +extern U16 L1_ADC_Read(u8 CHA); + +#endif //#ifndef _msp_adc_H_ + + +