stm32之蓝牙控制通信(JDY-24)led初级应用

废话不多说了,直接上代码。

主要介绍led和usart(蓝牙通信)、main的主要代码,亲测有效。

led.c

这里使用LED1(A1)

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
    
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
    if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
    }
    else
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    }
}

void LED2_ON(void)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
    if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_2);
    }
    else
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    }
}

led.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);

#endif

serial.c

除了初始化函数外,还使用了Serial_GetRxFlag(void)、Serial_GetRxData(void)用于判断和接收蓝牙发送的信息。中断处理函数USART1_IRQHandler。用于发送后清零

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

uint16_t Serial_RxData;
uint8_t  Serial_RxFlag;

/**
  * @brief  Serial初始化,通信协议为USART
  * @param  无
  * @retval 无
  */
void Serial_Init(void)
{
    //开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    //通信引脚TX初始化
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //通信引脚RX初始化
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //USART初始化
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &USART_InitStructure);

    //启用USART1中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    //中断分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    //中断初始化
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);

    //使能USART1
    USART_Cmd(USART1, ENABLE);
}

/**
  * @brief  发送一个数据
  * @param  Byte 要发送的数据
  * @retval 无
  */
void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

/**
  * @brief  发送一组数据
  * @param  Array 要发送的一组数据
  * @param  Length 数组大小
  * @retval 无
  */
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
    uint16_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Array[i]);
    }
}

/**
  * @brief  发送一串字符
  * @param  String 要发送的字符串
  * @retval 无
  */
void Serial_SendString(char *String)
{
    uint8_t i;
    for (i = 0; String[i] != '\0'; i++)
    {
        Serial_SendByte(String[i]);
    }
}

/**
  * @brief  Bluetooth次方函数
  * @retval 返回值等于X的Y次方
  */
uint32_t Serial_POW(uint32_t X,uint32_t Y)
{
    uint32_t Result = 1;
    while (Y--)
    {
        Result *= X;
    }
    return Result;
}
/**
  * @brief  发送一个数字
  * @param  Number 要发送的数字
  * @param  Length 数字长度
  * @retval 无
  */
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
    uint8_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Number / Serial_POW(10, Length - i - 1) % 10 + '0');
    }
}

/**
  * @brief  printf重定向到蓝牙 
  */
int fputc(int ch,FILE *f)
{
    Serial_SendByte(ch);
    return ch;
}

/**
  * @brief  封装Sprintf,直接向蓝牙发送字符串 
  */
void Serial_Printf(char *format, ...)
{
    char String[100];
    va_list arg;
    va_start(arg,format);
    vsprintf(String,format,arg);
    va_end(arg);
    Serial_SendString(String);
}

/**
  * @brief  接收响应
  * @param  无
  * @retval 1--接收成功,0--接收失败
  */
uint8_t Serial_GetRxFlag(void)
{
    if (Serial_RxFlag == 1)
    {
        Serial_RxFlag = 0;
        return 1;
    }
    return 0;
}

/**
  * @brief  接收数据
  * @param  无
  * @retval Bluetooth_RxData 蓝牙发送过来的数据
  */
uint8_t Serial_GetRxData(void)
{
    return Serial_RxData;
}

/**
  * @brief  接收中断函数
  * @param  无
  * @retval 无
  */
void USART1_IRQHandler(void)
{
    
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        Serial_RxData = USART_ReceiveData(USART1);//保存接收到的数据,RXNE自动清零
        Serial_RxFlag = 1;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
            
}

serial.h

#ifndef _SERIAL_H
#define _SERIAL_H

#include <stdio.h>
#include <string.h>

void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);
uint8_t Serial_GetRxFlag(void);
uint8_t Serial_GetRxData(void);

#endif

main.c

这里虽然有其它的头文件,但没有使用,我们使用要用的文件即可。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"            //延时
#include "OLED.h"            //OLED模块
#include "LED.h"            //LED灯模块
#include "Serial.h"            //蓝牙通信模块

uint16_t AT;    //接收蓝牙发过来的指令
//char SendString[100];        //向蓝牙发送的显示信息
//uint8_t i;


int main(void)
{
    OLED_Init();
    Serial_Init();
    LED_Init();    
    
    while (1)
    {
         //erial_SendString(SendString);
        
        if (Serial_GetRxFlag() == 1)//判断串口是否有信息
        {
                        
                        
            AT = Serial_GetRxData();//接收蓝牙发送的指令        
            if(AT=='A'){    //接收到字符A,亮灯
                        LED1_ON();
                        Delay_ms(500);
                    }
                    if(AT=='B'){
                        LED1_OFF();
                        Delay_ms(500);
                    }
            
        }        
    }
}

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
当然可以!下面是一个简单的例子,演示如何使用STM32进行蓝牙通信的收发。 ```c #include "stm32f10x.h" #include "stm32f10x_usart.h" #include "stm32f10x_gpio.h" // 定义蓝牙串口引脚 #define BLUETOOTH_TX_PIN GPIO_Pin_9 #define BLUETOOTH_RX_PIN GPIO_Pin_10 // 定义蓝牙串口对象 USART_InitTypeDef USART_InitStructure; void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能USART1和GPIOA外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1的引脚为复用功能 GPIO_InitStructure.GPIO_Pin = BLUETOOTH_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BLUETOOTH_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1参数 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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; // 初始化USART1 USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } void USART1_SendChar(uint8_t ch) { // 等待发送缓冲区为空 while (!(USART1->SR & USART_FLAG_TXE)); // 发送一个字节 USART1->DR = (ch & 0xFF); } uint8_t USART1_ReceiveChar(void) { // 等待接收缓冲区非空 while (!(USART1->SR & USART_FLAG_RXNE)); // 返回接收到的字节 return (USART1->DR & 0xFF); } int main(void) { USART1_Init(); while (1) { // 发送数据 USART1_SendChar('A'); // 接收数据 uint8_t receivedData = USART1_ReceiveChar(); } } ``` 这只是一个简单的示例,你可以根据具体需求进行修改。在这个例子中,我们使用USART1作为蓝牙串口,配置波特率为9600,并使用PA9和PA10作为引脚进行通信。你可以根据实际情况修改这些参数。 注意:此代码适用于STM32F10x系列微控制器。如果你使用的是其他系列的STM32控制器,请根据其手册和硬件文件进行相应的修改。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值