查看: 298|回复: 2

[求助] GD190蓝牙问题

[复制链接]

5

主题

0

好友

90

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2016-5-11 12:27
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-6-12 16:17:32 |显示全部楼层
    代码能够在GD103上实现通信,但是修改之后,在GD190上面不能通信,但是显示蓝牙和手机已经连接正常了。用的HC05模块

    u16 USART2_RX_STA=0;            
    void USART2_IRQHandler(void)
    {
            u8 res;            
            if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
            {         

            res =USART_ReceiveData(USART2);               
                    if(USART2_RX_STA<USART2_MAX_RECV_LEN)                //还可以接收数据
                    {
                            TIM_SetCounter(TIM3,0);//计数器清空                                         
                            if(USART2_RX_STA==0)TIM3_Set(1);                 //使能定时器4的中断
                            USART2_RX_BUF[USART2_RX_STA++]=res;                //记录接收到的值         
                    }else
                    {
                            USART2_RX_STA|=1<<15;                                        //强制标记接收完成
                    }
            }                                                                                           
    }   
    //初始化IO 串口2
    void USART2_Init(u32 bound)
    {  

            NVIC_InitTypeDef NVIC_InitStructure;
            GPIO_InitTypeDef GPIO_InitStructure;
            USART_InitTypeDef USART_InitStructure;

            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);// GPIOA时钟
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
            GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
            GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);

            USART_DeInit(USART2);  //复位串口2
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用推挽输出
            GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2
       
        //USART2_RX          PA.3
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//浮空输入
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3
           
            USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
            USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
            USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
            USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
            USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
            USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
      
            USART_Init(USART2, &USART_InitStructure); //初始化串口        2
      
            //波特率设置
    //        USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置         
            //USART2->CR1|=0X200C;          //1位停止,无校验位.
            USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);          //使能串口2的DMA发送
            UART_DMA_Config(DMA1_Channel7,(u32)&USART2->TDR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF
            USART_Cmd(USART2, ENABLE);                    //使能串口
           
    #ifdef USART2_RX_EN                          //如果使能了接收
            //使能接收中断
      USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断   
           
            NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
            NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
            TIM3_Init(99,7199);                //10ms中断
            USART2_RX_STA=0;                //清零
            TIM3_Set(0);                        //关闭定时器4
    #endif                

    }
    //串口2,printf 函数
    //确保一次发送数据不超过USART2_MAX_SEND_LEN字节
    void u2_printf(char* fmt,...)  
    {  
            va_list ap;
            va_start(ap,fmt);
            vsprintf((char*)USART2_TX_BUF,fmt,ap);
            va_end(ap);
            while(DMA_GetCurrDataCounter(DMA1_Channel7)!=0);        //等待通道7传输完成   
            UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF));         //通过dma发送出去
    }
    //定时器4中断服务程序                    
    void TIM3_IRQHandler(void)
    {        
            if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
            {                                   
                    USART2_RX_STA|=1<<15;        //标记接收完成
                    TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志   
                    TIM3_Set(0);                        //关闭TIM3  
            }            
    }
    //设置TIM3的开关
    //sta:0,关闭;1,开启;
    void TIM3_Set(u8 sta)
    {
            if(sta)
            {
          
                    TIM_SetCounter(TIM3,0);//计数器清空
                    TIM_Cmd(TIM3, ENABLE);  //使能TIMx       
            }else TIM_Cmd(TIM3, DISABLE);//关闭定时器4          
    }
    //通用定时器中断初始化
    //这里始终选择为APB1的2倍,而APB1为36M
    //arr:自动重装值。
    //psc:时钟预分频数                 
    void TIM3_Init(u16 arr,u16 psc)
    {       
            NVIC_InitTypeDef NVIC_InitStructure;
            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//TIM3时钟使能   
           
            //定时器TIM3初始化
            TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
            TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
            TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
            TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

            TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

                       
            NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //子优先级3
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
            NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
           
    }
    #endif                 
    ///////////////////////////////////////USART2 DMA发送配置部分//////////////////////////////////                               
    //DMA1的各通道配置
    //这里的传输形式是固定的,这点要根据不同的情况来修改
    //从存储器->外设模式/8位数据宽度/存储器增量模式
    //DMA_CHxMA通道CHx
    //cpar:外设地址
    //cmar:存储器地址   
    void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
    {
            DMA_InitTypeDef DMA_InitStructure;
            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
      DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
            DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
            DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
            DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
            DMA_InitStructure.DMA_BufferSize = 0;  //DMA通道的DMA缓存的大小
            DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
            DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
            DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
            DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
            DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
            DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
            DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器       
    }
    //开启一次DMA传输
    void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
    {
            DMA_Cmd(DMA_CHx, DISABLE );  //关闭 指示的通道        
            DMA_SetCurrDataCounter(DMA_CHx,len);//DMA通道的DMA缓存的大小       
            DMA_Cmd(DMA_CHx, ENABLE);           //开启DMA传输
    }          
    回复

    使用道具 举报

    10

    主题

    0

    好友

    1215

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 08:52
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2016-6-12 21:18:54 |显示全部楼层
    首先,当蓝牙模块设置好之后,或者不设置,初始状态下,只要通电,就可以和手机连接,就是说,你把蓝牙和板子间的串口线拔掉也不耽误与手机连接,只是不能和板子通信而已。第二、如果你用的也是190小红板的话,USART2已经和CH340连接,你怎么再和hc05连呢?现在应该只有USART1可以使用。还有就是,你可以先不用蓝牙模块,把蓝牙用到的串口通过sub转串口用串口调试助手看看是否可以正常工作。蓝牙说白了只是透传。最后一点,我在写串口程序时参考的是官方给的历程,很奇怪,他把RX、TX都设置成推挽输出,还没细究。仅当参考吧
    回复

    使用道具 举报

    129

    主题

    4

    好友

    4794

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    开心
    昨天 21:58
  • 签到天数: 528 天

    [LV.9]以坛为家II

    发表于 2016-6-12 23:32:10 |显示全部楼层
    楼主上传一下工程文件
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-9 04:13 , Processed in 0.132080 second(s), 10 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部