USART2_Init
1.TIM4_PWM_Init(7199,0); //初始化PWM,控制电机转动
2.uart_init初始化下载串口,程序由这个代码烧录进去
3.USART2_Init蓝牙串口初始化
前进 按下发出 ONA 松开ONF
后退:按下发出 ONB 松开ONF
左转:按下发出 ONC 松开ONF
右转:按下发出 OND 松开ONF
停止:按下发出 ONE 松开ONF
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送
UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF
USART_Cmd(USART2, ENABLE); //使能串口
串口收到的信息保存在DR寄存器中,
DR寄存器中的数据通过DMA传送到输出缓冲数组USART2_TX_BUF
打开中断,当数据寄存器DR非空时进入中断函数
设置定时器2,每十秒进入一次更新中断,检测接收完成USART2_RX_STA|=1<<15;
main
int main(void)
{
u8 reclen=0;
delay_init();
TIM4_PWM_Init(7199,0); //初始化PWM
uart_init(9600); //下载串口
USART2_Init(9600); //蓝牙串口
ZYSTM32_brake(500);
while(1)
{
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
reclen=USART2_RX_STA&0X7FFF; //得到数据长度
USART2_RX_BUF[reclen]=0; //加入结束符
printf("USART2_RX_BUF:%s\n",USART2_RX_BUF);
printf("reclen:%d\n",reclen);
if(reclen==3||reclen==4) //控制DS1检测
{
if(strcmp((const char*)USART2_RX_BUF,"ONA")==0)
{
u2_printf("go forward!");
ZYSTM32_run(80,100);
}
else if(strcmp((const char*)USART2_RX_BUF,"ONB")==0)
{
u2_printf("go back!");
ZYSTM32_back(80,100);
}
else if(strcmp((const char*)USART2_RX_BUF,"ONC")==0)
{
u2_printf("go right!");
ZYSTM32_Right(80,100);
}
else if(strcmp((const char*)USART2_RX_BUF,"OND")==0)
{
u2_printf("go left!");
ZYSTM32_Left(80,100);
}
else if(strcmp((const char*)USART2_RX_BUF,"ONF")==0)
{
u2_printf("Stop!");
ZYSTM32_brake(100);
}
else if(strcmp((const char*)USART2_RX_BUF,"ONE")==0)
{
u2_printf("Stop!");
ZYSTM32_brake(100);
}
}
USART2_RX_STA=0;
}
}
}
总结:
手机端蓝牙上位机发送指令,例如:ENA 前进
HC06蓝牙模块接收到指令之后,将指令传给串口2
串口收到指令之后,触发串口接收中断
在接收中断中,将DR里面的数据传送到USART2_RX_STA接收缓冲器中
定时器TIM2每10秒进入一次中断,并且标记接收完成
标记完之后就能进入main函数的第一个if里面
如果真的接收到ENA,则reclen3||reclen4,为正确指令
进入第二个if语句进行判断是什么指令
如果没有接受到指令,则无法进入if。进入下一步
最后清除标志位USART2_RX_STA=0;
在while中重新检测。等待下一个10ms检测是否按下按键