废话不多说了,直接上代码。
主要介绍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);
}
}
}
}