完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
stm32f103c8t6控制蓝牙模块实现led灯亮灭
之前利用蓝牙模块是用arduino控制板的,现在已经渐渐接触stm32,所以,这次想着用stm32来控制蓝牙模块。 首先的话,需要配置蓝牙模块的一些参数,用到的模块有: USB转TTL模块、HC-05蓝牙模块 两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。然后直接把USB转TTL模块插入电脑的USB接口,利用串口调试助手来设置模块的参数,关于这个串口调试助手,相信接触过单片机的人都会有的,这里就不发出来了。 蓝牙模块的调试 **HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。**在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。 当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输; 当模块处于命令响应工作模式时能执行AT命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。 怎么进入命令响应工作模式? 进入命令响应工作模式有两种方法: 模块上电,未配对情况下就是AT模式,波特率为模块本身的波特率,默认:9600,发送一次AT指令时需要置高一次PIO11; PIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,可以直接发送AT指令。 什么叫做置高一次PIO11? **在蓝牙模块中有一个小按键,按一下就置高一次PIO11。**也就是说,第一种方法需要每发送一次AT指令按一次;而第二种方式是长按的过程中上电,之后就无需再管了,直接发送AT命令即可。 需要注意一下,两种进入命令响应工作模式的方式使用的波特率是不一样的,建议使用第二种方式。 怎么区分进了命令响应工作模式呢? 在蓝牙模块上有灯,当灯快闪的时候,就是自动连接工作模式;当灯慢闪的时候,就是命令响应工作模式。 本人在测试过程中,是先按住小按键后,然后把USB转TTL模块插入到电脑的USB中去,这样蓝牙模块上面的灯就慢闪,进入了AT模式。 接着就是要设置蓝牙的参数了: 1)需要设置蓝牙模块的名字,在和手机app连接的时候方便查找,在串口调试助手中发送指令AT+NAME=HC-05,发送指令后,会返回OK,之后你手机app在搜索蓝牙模块的时候就会出现一个名字为HC-05的蓝牙,这个HC-05你也可以改成别的名字。发送指令AT+NAME?:获得设备名称,这个AT指令有很大可能性是没有返回的,因为我也看到了很多的例子……,但是其他的指令都是没有问题的,直接设置设备名称就行了;你还需要发送指令AT+ADDR?,这个指令会返回一个蓝牙地址,因为有时候手机第一次连接蓝牙模块的时候,是没有蓝牙名字的,只有蓝牙地址,所以这个地址可以让你找到你这个蓝牙模块。 2)需要设置连接蓝牙的密码,在串口调试助手中发送指令AT+PSWD=2019,发送指令后,会返回OK,这样手机在连接蓝牙时,就需要输入密码2019才能连接成功,当然这样密码你也可以改成别的。发送指令AT+PSWD?,会返回这个模块当前的密码。 3)需要设置蓝牙模块是主模式还是从模式,手机上面的蓝牙一般都是主模式,所以蓝牙模块需要设置成从模式,在串口调试助手中发送指令AT+ROLE=0,0表示从模式,1表示主模式。发送指令后,会返回OK。发送指令AT+ROLE?,会返回这个模块当前的模式是主还是从。 4)需要设置串口的波特率,在串口调试助手中发送指令AT+UART=9600,0,0,发送指令后,会返回OK。发送指令AT+UART?,会返回这个模块串口参数,串口的参数一共有三个,波特率、停止位、检验位。其取值如下: [tr]参数名称取值[/tr]波特率24002400、4800、9600、19200、38400、5760、115200、230400、460800、921600、1382400 停止位0:1位------------------ 1:2位 校验位0:NONE 1:Odd 2:Even 其默认值为:9600,0,0。 手机与蓝牙模块之间的传输 直接将蓝牙模块与转换模块连接,再将其连接到电脑上,蓝牙模块直接进入自动连接工作模式。 打开手机蓝牙串口app,连接上面1)中的蓝牙地址,下面给出stm32f103c8t6控制蓝牙模块点亮stm32控制板上面PA.1灯的程序,其主要功能是在手机app上面发送字符1给蓝牙模块,蓝牙模块接收到字符1后就点亮led灯(即PA.1),在接收到字符2后就关闭led灯。 主程序: #include “led.h” #include “delay.h” #include “key.h” #include “sys.h” #include “usart.h” extern u8 res; //设置外部全局变量 int main(void) { int i; char a[]=“abcdefg”; char b[7]={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’}; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 My_USART2_Init(); LED_Init(); //LED端口初始化 while(1) { if(res==‘1’) { GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA.1指示灯亮 delay_ms(500); //假如要用延时函数,最好就在上面初始化延时函数,不然程序很容易就跑飞 for(i=0;i《7;i++) { USART_SendData(USART2, a[i]); //向串口2发送数据给蓝牙模块 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束 } res=0; } if(res==‘2’) { GPIO_SetBits(GPIOA,GPIO_Pin_1); //PA.1指示灯灭 res=0; } } } 手机蓝牙跟蓝牙模块通信时,手机发送的指令经过蓝牙模块发送串口2,让串口2接收,如果利用发送函数让串口2发送数据出来的话,可以在手机app上面接收到数据;利用延时函数时,最好在最开始初始化延时函数delay_init(),不要问为什么,我也不清楚,试过才知道。 子程序: u8 res; //设置全局变量 void My_USART2_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口端口使能 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); USART_InitStrue.USART_BaudRate=9600; USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; USART_InitStrue.USART_Parity=USART_Parity_No; USART_InitStrue.USART_StopBits=USART_StopBits_1; USART_InitStrue.USART_WordLength=USART_WordLength_8b; USART_Init(USART2,&USART_InitStrue); USART_Cmd(USART2,ENABLE); //使能串口2 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断 NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStrue); } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) { res= USART_ReceiveData(USART2); // USART_SendData(USART2,res); //串口2发送数据给蓝牙模块接收,也就是手机app接收到的数据 } } void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LED--》PA.1 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.1 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1907 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1675 浏览 1 评论
1169 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
768 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1728 浏览 2 评论
1969浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
804浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
249浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
621浏览 3评论
634浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-22 01:57 , Processed in 0.796765 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号