HC05与其他两款的区别是,需要按住RST键进入AT指令模式
一. 上电进入AT模式方法
先按住HC05蓝牙模块上面的RST按键,再给蓝牙模块通电。蓝牙模块上面的LED进入慢闪模式(约1秒钟闪烁一次),即可进行AT命令测试
AT命令格式为:波特率38400,8个数据位,1个停止位,无校验。
每条指令输入完成后,必须按一下回车键再发送!例如:输入AT,按一下回车键发送,蓝牙模块会返回OK。
串口协议(bluetooth SPP)Serial Port Profile 协议
关键要到的知识后面再补充
测试条件:STM32F103C8T6 JDY-31 供电5V稳定输出+仿真电源供电
蓝牙模块对电源的要求是3.6~6V,首先确保电源正常
测试的现象:
1.在进行断点调试的过程中,发现手机连接蓝牙,发送数据,STM32无法接收到数据,触发断点。
2.中间用MINI板给蓝牙供电单独调试,手机能正常连接,蓝牙数据可透传到单片机。
3.测试手机发送,OLED正常显示,A-65 B-66,ASCII码显示正常。
推测原因:
1.仿真打断点状态测试,无论怎么测,都还是无法触发断点,这个有可能和STM32C8T6芯片有关,这个芯片不是原厂的,所以仿真有可能确实存在一些小问题。
2.蓝牙或STM32引脚有虚焊,所以后来用MINI板供电后,测试正常。
重新测试,STM32F103C8T6+JDY31的方案,发现是能够进入串口中断,进行断点调试的,舒服了。
2023-03-31更新
在实际使用串口接收字符时,要将存储数据清除一下才能继续使用,推测会不会单独Res无法打断点的原因,就是一个字符被反复赋值的原因。
STM32F407ZG+CC2541,接上后,仿真调试正常,暂时没有什么可测试的,代码如下:
技术交流,调试帮助,技术V:anwarmaries Q:1083091092
//串口2初始化 USART1 -- BLE
void USART2_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//1.打开USART2外设时钟 + GPIOA端口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//2.选择GPIO引脚的复用功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
//3.配置GPIO引脚的参数
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3;//引脚编号
GPIO_Init(GPIOA, &GPIO_InitStructure);
//4.配置USART2的参数 通信速率 + 字符格式
USART_InitStructure.USART_BaudRate = 9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8bit
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1bit
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);
//5.配置USART2的中断参数
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断编号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//6.设置USART2的中断的触发方式 一般是接收到数据则触发中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//7.使能USART2
USART_Cmd(USART2, ENABLE);
}
//利用USART2发送字符串
void USART2_SendString(char *Str)
{
memset((char *)USART2_RecvBuf,0,128);
USART2_RecvCnt = 0;
while( *Str != '\0')
{
USART_SendData(USART2,*Str++);
while( USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET ); //等待数据发送完成
}
}
void USART2_SendString_uc(unsigned char *Str)
{
memset((unsigned char *)USART2_RecvBuf,0,128);
USART2_RecvCnt = 0;
while( *Str != '\0')
{
USART_SendData(USART2,*Str++);
while( USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET ); //等待数据发送完成
}
}