OpenEdv-开源电子网

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

求助!!mini板蓝牙hc05的串口2始终进不来接收中断!

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-10-24
在线时间
10 小时
发表于 2022-2-25 15:55:27 | 显示全部楼层 |阅读模式
1金钱
我仿照原子哥的例程,修改了hc05蓝牙的代码,可是蓝牙一直初始化失败好像是一直无法进入中断服务函数(我设定,进入一次中断服务函数,LED会闪一次)

usart2.h代码
extern UART_HandleTypeDef UART2_Handler;

#define USART2_MAX_RECV_LEN                200                                       
#define USART2_MAX_SEND_LEN                200                                       
#define USART2_RX_EN                         1                                       

extern u8  USART2_RX_BUF[USART2_MAX_RECV_LEN];                
extern u8  USART2_TX_BUF[USART2_MAX_SEND_LEN];                
extern u16 USART2_RX_STA;                                                  

#define BRXBUFFERSIZE   1                                        
extern u8 bRxBuffer[BRXBUFFERSIZE];                       

void USART2_Init(u32 bound);                               
void u2_printf(char* fmt, ...);
#endif


usart2.c代码
UART_HandleTypeDef UART2_Handler;
       
__align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];

#ifdef USART2_RX_EN                                                                             

u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];                                
u8 bRxBuffer[BRXBUFFERSIZE];
u16 USART2_RX_STA=0;            


void USART2_Init(u32 bound)
{  
        GPIO_InitTypeDef GPIO_Initure;
        __HAL_RCC_GPIOA_CLK_ENABLE();                       
        __HAL_RCC_USART2_CLK_ENABLE();                       
        __HAL_RCC_AFIO_CLK_ENABLE();
       
        GPIO_Initure.Pin=GPIO_PIN_2;                       
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
        GPIO_Initure.Pull=GPIO_PULLUP;                       
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  

        GPIO_Initure.Pin=GPIO_PIN_3;                       
        GPIO_Initure.Mode=GPIO_MODE_INPUT;               
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  
       
        UART2_Handler.Instance=USART2;                                            
        UART2_Handler.Init.BaudRate=bound;                                    
        UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;   
        UART2_Handler.Init.StopBits=UART_STOPBITS_1;            
        UART2_Handler.Init.Parity=UART_PARITY_NONE;                    
        UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   
        UART2_Handler.Init.Mode=UART_MODE_TX_RX;                  
        HAL_UART_Init(&UART2_Handler);                                          
        HAL_UART_Receive_IT(&UART2_Handler, (u8 *)bRxBuffer, BRXBUFFERSIZE);

#ifdef USART2_RX_EN                         
        HAL_NVIC_EnableIRQ(USART2_IRQn);                               
        HAL_NVIC_SetPriority(USART2_IRQn,2,3);                       
#endif

        TIM4_Init(99,7199);               
        USART2_RX_STA=0;               
        __HAL_TIM_DISABLE(&TIM4_Handler);   
}


void u2_printf(char* fmt,...)  
{  
  u16 i,j;
va_list ap;
  va_start(ap,fmt);
  vsprintf((char*)USART2_TX_BUF,fmt,ap);
  va_end(ap);
        i=strlen((const char*)USART2_TX_BUF);
        printf("%s",USART2_TX_BUF);
        for(j=0;j<i;j++)
        {
                while((USART2->SR&0X40)==0);
                USART2->DR=USART2_TX_BUF[j];
        }       
}

void USART2_IRQHandler(void)
{
        u8 res;
        LED1=!LED1;//进入中断会闪烁LED灯一次
        if(__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET)
        {         
        res=USART2->DR;
               
                if((USART2_RX_STA&(1<<15))==0)
                {
                if(USART2_RX_STA<USART2_MAX_RECV_LEN)               
                {
                        __HAL_TIM_SET_COUNTER(&TIM4_Handler,0);                                         
                        if(USART2_RX_STA==0)
                        {
                                __HAL_TIM_ENABLE(&TIM4_Handler);                
                        }
                                USART2_RX_BUF[USART2_RX_STA++]=res;                         
                }else
                {
                        USART2_RX_STA|=1<<15;                                       
                }
        }
        }
        HAL_UART_IRQHandler(&UART2_Handler);       
}

#endif

hc05初始化函数
u8 HC05_Init(void)
{
        u8 retry=10,t;                           
        u8 temp=1;
       
        GPIO_InitTypeDef GPIO_InitStructure;
       
        __HAL_RCC_GPIOA_CLK_ENABLE();  
        __HAL_RCC_GPIOC_CLK_ENABLE();        

        GPIO_InitStructure.Pin = GPIO_PIN_4;                               
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;                  
        GPIO_InitStructure.Pull = GPIO_PULLUP;                 
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);                                         
         

        GPIO_InitStructure.Pin = GPIO_PIN_4;                                 
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ;                  
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);                                       

        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
       
        USART2_Init(9600);       
        while(retry--)
        {
                HC05_KEY=1;                                       
                delay_ms(10);
                u2_printf("AT\r\n");                //发送AT到串口2
                HC05_KEY=0;                                       
                for(t=0;t<10;t++)                        
                {
                        if(USART2_RX_STA&0X8000)break;
                        delay_ms(5);
                }               
                if(USART2_RX_STA&0X8000)        &#203;
                {
                        temp=USART2_RX_STA&0X7FFF;       
                        USART2_RX_STA=0;                         
                        if(temp==4&&USART2_RX_BUF[0]=='O'&&USART2_RX_BUF[1]=='K')
                        {
                                temp=0;
                                break;
                        }
                }                                           
        }                    
        if(retry==0)temp=1;       
        return temp;         
}         



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-2-26 23:31:34 | 显示全部楼层
对比和源代码的区别,或者干脆用源码试试,不要修改。对比去发现问题
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-10-24
在线时间
10 小时
 楼主| 发表于 2022-2-27 10:58:08 | 显示全部楼层
正点原子 发表于 2022-2-26 23:31
对比和源代码的区别,或者干脆用源码试试,不要修改。对比去发现问题

原子哥,我下官方的标准库例程也有问题
就是在main()函数的初始化工程,会一直卡在while(hc05_init())这个循环里面,一直提示:“hc05 error!”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-2-27 23:40:18 | 显示全部楼层
七海牌榨汁姬 发表于 2022-2-27 10:58
原子哥,我下官方的标准库例程也有问题
就是在main()函数的初始化工程,会一直卡在while(hc05_init( ...

是不是模块没接好?
检查接线,实在不行的话,监控一下蓝牙模块是否正常收到了AT指令。另外可以单独用HC05通过USB转TTL模块,直接测试下,看是否正常工作?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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