完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、说明:写本文的目的是抛弃一些比较专业的描述,从一些刚接触的小白角度出发,帮助此类朋友解决一些问题,所以内容都是用比较通俗的白话来写,网上已经有许多的比较专业的描述教程,若你想要一些比较专业性的描述,本人建议你看其他朋友的。
二、概论:本文内容主要是介绍如何在STM32上添加、使用蓝牙模块,介绍怎么将蓝牙与STM32联系起来,文章最后介绍一个实例。 三、硬件连接 1、连接图 如上图所示,该STM32具有三组串口管脚,自己选一组(具体看自己STM32板子的电路图,下面内容我只以RX1/TX1这组为例,不同组接下来的代码配置也会不同),至于VCC管脚和GND管脚自己找,板子上有标志。 首先说一下STM32板子在这里实现的功能本质——“串口通信”,和蓝牙模块在这里充当的角色——“串口客户端” 这个怎么理解呢? 简单来说,STM板子和蓝牙模块进行“微信聊天”,即都具有发送接收功能。 三、串口内容: 接完管脚了,接下来就是代码部分,串口功能总共五个函数(建议复制粘贴) (1)通信初始化 void USART_Config(void) { GPIO_InitTypeDef x; USART_InitTypeDef y; //打开时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); x.GPIO_Pin=GPIO_Pin_9; x.GPIO_Mode=GPIO_Mode_AF_PP; x.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&x); //初始化发送管脚 x.GPIO_Pin=GPIO_Pin_10; x.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&x); //初始化接收管脚 y.USART_BaudRate=9600; //注意波特率,否则会出现乱码 y.USART_WordLength=USART_WordLength_8b; y.USART_Parity=USART_Parity_No; y.USART_StopBits=USART_StopBits_1; y.USART_HardwareFlowControl=USART_HardwareFlowControl_None; y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART1,&y); //串口配置(波特率等) USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //打开串口接收中断 USART_Cmd(USART1,ENABLE); NVIC_Configuration(); //配置串口中断的优先级 } (2)配置串口中断优先级 void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } (3)写一下中断处理函数 void USART1_IRQHandler(void) { uint8_t ucTemp; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { ucTemp=USART_ReceiveData(USART1); USART_SendData(USART1,ucTemp); } } (4)重写输出输入函数(记得添加#include “stdio.h”哦) #include “stdio.h” int fputc(int ch,FILE *f) { USART_SendData(USART1,(uint8_t)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return (ch); } int fgetc(FILE *f) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return (int)USART_ReceiveData(USART1); } (5)最后当然是主函数了(记得包括上面的头文件总共有两个头文件哦) #include “stm32f10x.h” int main(void) { USART_Config(); while(1); } 四、功能例子(在手机端通过蓝牙控制STM32板子小灯) (1)配置串口(就是上面的代码) (2)初始化小灯(我的STM32控制LED灯的管脚为PC13) void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); } (3)小灯控制函数 void LED_G(uint8_t n) //LED_G(0): 灯亮 LED_G(1):灯灭 { if(n) GPIO_SetBits(GPIOC, GPIO_Pin_13); else GPIO_ResetBits(GPIOC, GPIO_Pin_13); } (4)修改主函数 #include “stm32f10x.h” int main(void) { USART_Config(); LED_GPIO_Config(); while(1); } (5)修改串口中断函数 void USART1_IRQHandler(void) //如果手机蓝牙发送‘0’则灯亮,(若其他数据)否则灯灭 { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { res= USART_ReceiveData(USART1); USART_SendData(USART1,res); if(res==‘0’) { LED_G(0); } else { LED_G(1); } } } 五、效果 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1572 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1515 浏览 1 评论
945 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
671 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1562 浏览 2 评论
1852浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
621浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
507浏览 3评论
512浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
493浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 17:28 , Processed in 0.695236 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号