OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2796|回复: 2

关于语音播报和esp8266同时使用时遇到的BUG

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-4-12
在线时间
15 小时
发表于 2020-3-31 17:45:58 | 显示全部楼层 |阅读模式
本帖最后由 vae 于 2020-3-31 17:49 编辑

环境:STM32探索者

预期效果:APP接入ESP8266 LED1灯亮起,断开ESP8266连接LED1灯灭,按下按键播报语音,ADC采集湿度数据,DS1820读取温度数据,并将温湿度数据显示在OLED上,引脚已检查没有冲突。
BUG:没有加入语音播报函数时,一切正常。当加入 按键控制的语音播报代码后,LED1一直闪烁,按下按键也无法进行语音播报,ADC,ds18b20正常工作。
当加入语音播报函数后 同时去除了ADC采集和DS18B20的温度读取函数之后,按下按键可以语音播报了,但LED1灯依旧一直闪烁

感觉问题不出现在代码上,明明按键按下语音播报才会运行的,怎么加入了这段代码,但没有运行到,也会影响到之前的代码呢?感谢各位大佬可以帮忙求解



#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "WIFI_AP.h"
#include "usmart.h"
#include "key.h"
#include "OLED.h"
#include "ds18b20.h"
#include "adc.h"

#include "audioplay.h"        
#include "wm8978.h"        
#include "stdio.h"
#include "malloc.h"     
#include "sdio_sdcard.h"
#include "ff.h"  
#include "exfuns.h"

#define CHOUSHUI PAout(7)        //抽水引脚

//标志位
u8 Connect_Flag = 0;
u8 Sent_Flag = 0;
u8 Hu_Threshold_Flag = 0;

/*块区域*/
#define Main_Block                             1
#define Hu_Threshold_Block   2

u8 Cursor = 0;                                                                //光标
u8 Current_Block = Main_Block;                                //当前显示块,默认初始为主块
u8 Hu_Threshold_Val[2] = {6,0};


//温湿度数据发送定时器——初始化
void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                    //使能TIM2时钟
    TIM_TimeBaseInitStructure.TIM_Period = arr;                                   //自动重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;                                    //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM2
        
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器9更新中断
        TIM_Cmd(TIM3,ENABLE); //使能定时器2
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级2
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

//OLED闪烁定时器
void TIM2_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);                    //使能TIM2时钟
    TIM_TimeBaseInitStructure.TIM_Period = arr;                                   //自动重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;                                    //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM2
        
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器9更新中断
        TIM_Cmd(TIM2,DISABLE); //使能定时器2
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //定时器2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


//初始化抽水IO            
void ChouShui_Init(void)
{            
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOF时钟

  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
  CHOUSHUI = 0;
}

int main(void)
{
        u8 i;
        u8 str[80];
        u8 temp[] = {'T','e',':','2','3','C','H','u',':','4','5','%','\0'};
        u8 key_val;
        u16 Te;
        u8 Hu;
        u16 adcx;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                          //初始化延时函数
        uart_init(115200);                        //初始化串口波特率为115200
        usart3_init(115200);                //初始化串口2波特率为115200
        LED_Init();                                    //初始化LED端口
        KEY_Init();                                        //LCD初始化
        TIM2_Int_Init(3000-1,8400-1);
        OLED_Init();                                //OLED初始化
        DS18B20_Init();                                //DS18B2O初始化               
        Adc_Init();                                        //初始化ADC
        ChouShui_Init();                        //初始化抽水IO
        
        WM8978_Init();                                //初始化WM8978
        WM8978_HPvol_Set(40,40);        //耳机音量设置
        WM8978_SPKvol_Set(45);                //喇叭音量设置
        
        my_mem_init(SRAMIN);                //初始化内部内存池
        my_mem_init(SRAMCCM);                //初始化CCM内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
          f_mount(fs[0],"0:",1);                 //挂载SD卡
        
        WM8978_ADDA_Cfg(1,0);                //开启DAC
        WM8978_Input_Cfg(0,0,0);        //关闭输入通道
        WM8978_Output_Cfg(1,0);                //开启DAC输出
        
        
        MAIN_UI();
        TIM3_Int_Init(8400-1,10000);//定时发送数据 1s
        atk_8266_wifiap_init();

        
        while(1)
        {
                key_val = KEY_Scan(0);//读取按键按下值
               
                //主界面
                if(Current_Block == Main_Block)
                {        
                        //按键操作
                        switch(key_val)
                        {
                                case(OK)://手动浇水
                                {
                                        LED1  = !LED1;
                                        key_val = 0;
                                        break;        
                                }
                                case(UP)://切换到阈值设置界面
                                {
                                        key_val = 0;
                                        Threshold_UI();
                                        Current_Block = Hu_Threshold_Block;
                                        TIM_Cmd(TIM3,DISABLE); //使能定时器3
                                        TIM_Cmd(TIM2,ENABLE); //使能定时器2
                                        break;        
                                }
                                case(BACK)://开启自动浇水
                                {
                                        key_val = 0;
                                        Hu_Threshold_Flag = 1;
                                        LED0 = !LED0;
                                        break;        
                                }
                        }
                        
                        
                        //采集温湿度数据并显示在OLED
                        if(Sent_Flag == 1)
                        {
                                adcx=Get_Adc_Average(ADC_Channel_5,5);//获取通道5的转换值,5次取平均
                                Te = DS18B20_Get_Temp();
                                Hu = (3600 - adcx)/16;
                                OLED_ShowNum(72,21,Te/10,2,16,1);
                                OLED_ShowNum(72,43,(3600-adcx)/16,2,16,1);
                                OLED_Refresh_Gram();
                        }
                        
                        
                        //连接断开停止数据发送
                        if(*strstr((const char*)USART3_RX_BUF,"link is not valid"))
                        {
                                USART3_RX_STA  = 0;
                                Connect_Flag = 0;
                                LED1 = 1;
                        }
                        
                        printf("1:%d\r\n",*strstr((const char*)USART3_RX_BUF,"link is not valid"));
                        
                        //有客户连接,开始数据发送
                        if(*strstr((const char*)USART3_RX_BUF,"0,CONNECT"))
                        {
                                USART3_RX_STA  = 0;
                                Connect_Flag = 1;
                                LED1 = 0;
                        }
                        
                        delay_ms(1000);
                        
                        printf("2:%d\r\n",*strstr((const char*)USART3_RX_BUF,"0,CONNECT"));
                        
                        //发送数据给APP
                        if( (Connect_Flag == 1) && (Sent_Flag == 1) )
                        {
                                Sent_Flag = 0;
                                atk_8266_send_cmd("AT+CIPSEND=0,12","OK",50);  //发送指定长度的数据
                                u3_printf("%s",temp);
                        }
                        
                        /****************************接收APP数据处理*****************************/
                        if(Connect_Flag == 1 && USART3_RX_data != 0  )
                        {
                                switch(USART3_RX_data)
                                {
                                        case('1'): LED0 = !LED0; USART3_RX_data = 0; break;
                                }
                        }
                        
                        //湿度低于阈值时,播报湿度进行提醒
                        
                        if(key_val == DOWN)
                        {
                                LED0 = !LED0;
                                audio_play_HR(150);
                        }
                        
                        //如果开启自动浇水功能,湿度低于阈值时,将自动浇水
                        if( (Hu_Threshold_Val[0]*10+Hu_Threshold_Val[1]) > Hu && Hu_Threshold_Flag == 1)
                        {
                                //开始浇水
                        }
                }
                else if(Current_Block == Hu_Threshold_Block)        //阈值设定界面
                {
                        switch(key_val)
                        {
                                case(UP):  
                                {
                                        key_val = 0;
                                        Hu_Threshold_Val[Cursor]++;
                                        if(Hu_Threshold_Val[Cursor]>9)
                                                Hu_Threshold_Val[Cursor] = 0;
                                        break;
                                }

                                case(DOWN):
                                {
                                        key_val = 0;
                                        if(Hu_Threshold_Val[Cursor]==0)
                                                Hu_Threshold_Val[Cursor] = 9;
                                        else
                                                Hu_Threshold_Val[Cursor]--;
                                        break;
                                }
                                
                                case(LEFT):        { key_val = 0; Cursor = !Cursor; break; }
                                case(RIGHT):{ key_val = 0; Cursor = !Cursor; break; }
                                case(BACK):
                                {
                                        key_val = 0;
                                        MAIN_UI();
                                        Current_Block = Main_Block;
                                        TIM_Cmd(TIM2,DISABLE);
                                        TIM_Cmd(TIM3,ENABLE);
                                        break;
                                }
                                
                        }
                }
               
        }
        
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
        {
                Sent_Flag = 1;
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}


//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
        static u8 mode = 0;
        
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断
        {
        
                if(Current_Block == Hu_Threshold_Block)
                {
                        switch(Cursor)
                        {
                                case(0):
                                {
                                        UI_oled_block_Threshold(Cursor,Hu_Threshold_Val[Cursor],mode);
                                        UI_oled_block_Threshold(1,Hu_Threshold_Val[1],1);
                                        break;
                                }
                                case(1):
                                {
                                        UI_oled_block_Threshold(Cursor,Hu_Threshold_Val[Cursor],mode);
                                        UI_oled_block_Threshold(0,Hu_Threshold_Val[0],1);
                                        break;
                                }
                        }
                        OLED_Refresh_Gram();
                        mode = !mode;
                }
        
        }
        
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志位
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2704
金钱
2704
注册时间
2019-8-14
在线时间
414 小时
发表于 2020-3-31 18:51:21 | 显示全部楼层

回帖奖励 +30 金钱

帮顶~~
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-4-12
在线时间
15 小时
 楼主| 发表于 2020-3-31 20:28:45 | 显示全部楼层

这样就把我金币给赚走了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-3 05:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表