-
任务:编写蓝牙控制小车底层代码——USART、NVIC && 完善Motor部分代码
USART串口蓝牙控制
-
USART蓝牙串口引脚——PB10、11
1、完成驱动文件导入操作和编写驱动程序基本代码(参考之前文章)
//将【USART3】配置文件放在【Hardware】文件夹里
2、在
USART3.c编写串口初始化函数
Usart3_Init
/***************************************USART3(TX)——PB10USART3(RX)——PB11***************************************///USART3初始化void Usart3_Init(u32 bound){//RCC开启USART和GPIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIO初始化,把TX配置成复用输出,RX配置成输入GPIO_InitTypeDef GPIO_InitStructure;//USART3_TX PB10 复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);//USART3_RX PB11 浮空输入(上拉输入)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);//USAR3初始化设置USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = bound;//波特率(一般设置为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;//选择【发送/接收】模式USART_Init(USART3, &USART_InitStructure);//开启中断USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能串口USART_Cmd(USART3, ENABLE);}//串口3中断服务函数void USART3_IRQHandler(void){int Bluetooth_Receive;//接收中断(接收到的数据必须是0x0d 0x0a结尾)//RXNE为接收数据寄存器【非空】标志位if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET) //若RXNE置1说明接收到数据{//读取接收到的数据并保存到变量中(十进制)Bluetooth_Receive = USART_ReceiveData(USART3);//执行控制命令BluetoothCMD(Bluetooth_Receive);}}
蓝牙控制函数
//蓝牙控制命令u8 Fore,Back,Left,Right;void BluetoothCMD(int Bluetooth_Receive){switch(Bluetooth_Receive){case 90://停止 ZFore=0,Back=0,Left=0,Right=0;break;case 65://前进 AFore=1,Back=0,Left=0,Right=0;break;case 72://左前 HFore=1,Back=0,Left=1,Right=0;break;case 66://右前 BFore=1,Back=0,Left=0,Right=1;break;case 71://左转 GFore=0,Back=0,Left=1,Right=0;break;case 67://右转 CFore=0,Back=0,Left=0,Right=1;break;case 69://后退 EFore=0,Back=1,Left=0,Right=0;break;case 70://左后,向右旋 FFore=0,Back=1,Left=0,Right=1;break;case 68://右后,向左旋 DFore=0,Back=1,Left=1,Right=0;break;default://停止 ZFore=0,Back=0,Left=0,Right=0;break;}}
串口发送函数(字节、数组、字符串)——可在主程序中直接配置蓝牙
void Usart3_SendByte(char byte) //串口发送一个字节{USART_SendData(USART3, byte); //通过库函数 发送数据while( USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍}void Usart3_SendBuf(char *buf, u16 len){u16 i;for(i=0; i<len; i++)Usart3_SendByte(*buf++);}void Usart3_SendStr(char *str){u16 i,len;len = strlen(str);for(i=0; i<len; i++)Usart3_SendByte(*str++);}
3、在
sys.c中增加外部中断优先级配置函数
NVIC_Configuration
//Usart3 NVI 中断优先级配置(蓝牙串口)NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02 ;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
4、在USART3.h中声明串口初始化函数
Usart3_Init、蓝牙控
制函数BluetoothCMD、串口发送函数
void MPU6050_EXTI_Init(void);
5、在sys.h中
#includ
e "USART3
.h"
#include "USART3.h"
Motor
1、在Motor.c新增异常关闭电机函数Turn_Off
/**************************************************************************函数功能:异常关闭电机入口参数:倾角和电压返回 值:无**************************************************************************/void Turn_Off(float angle){if(angle<-40||angle>40) //===倾角大于40度关闭电机{Motor1=0;Motor2=0;}}
2、在
Motor.h中声明异常关闭电机函数
Turn_Off
void Turn_Off(float angle);
蓝牙数据通过USART3收发,并用数据收发去触发外部中断以达到【蓝牙控制小车运动】的电机要求,为之后在PID外部中断服务函数中完成具体控制铺好了路