杨桃32学习笔记,本文图片文字皆为转述
示例程序烧录验证
使用之前文章讲过的烧录软件烧录结束后,打开超级终端,按下回车弹出指令界面如
下,按照提示可以输入命令进行控制led状态。
基于上一节程序修改
全局变量
函数体内部的变量的作用域仅在该函数内,如果想要在别的文件和函数内调用该变量
就需要定义全局变量。具体方法如下
我们在超级终端输入的命令保存在,接收缓冲数组中,当我们按下回车的时候,程序
就会在数组中查找我们输入的内容
使能串口1中断
因为在串口处理函数当中,对串口接受的内容进行处理。
解读usart.c中实现超级终端控制的函数
修改主函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "buzzer.h"
#include "usart.h"
int main (void){//主程序
RCC_Configuration();
LED_Init();//LED初始化
KEY_Init();//按键初始化
BUZZER_Init();//蜂鸣器初始化
USART1_Init(115200); //串口初始化,参数中写波特率
USART1_RX_STA=0xC000; //初始值设为有回车的状态,即显示一次欢迎词
while(1){
if(USART1_RX_STA&0xC000){ //如果标志位是0xC000表示收到数据串完成,可以处理。
if((USART1_RX_STA&0x3FFF)==0){ //单独的回车键再显示一次欢迎词
printf("\033[1;47;33m\r\n"); //设置颜色(参考超级终端使用)
printf(" 1y--开LED1灯 1n--关LED1灯 \r\n");
printf(" 2y--开LED2灯 2n--关LED2灯 \r\n");
printf(" 请输入控制指令,按回车键执行! \033[0m\r\n");
}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='1' && USART1_RX_BUF[1]=='y'){ //判断数据是不是2个,第一个数据是不是“1”,第二个是不是“y”
GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
printf("1y -- LED1灯已经点亮!\r\n");
}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='1' && USART1_RX_BUF[1]=='n'){
GPIO_ResetBits(LEDPORT,LED1); LED灯都为低电平(0)
printf("1n -- LED1灯已经熄灭!\r\n");
}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='2' && USART1_RX_BUF[1]=='y'){
GPIO_SetBits(LEDPORT,LED2); //LED灯都为高电平(1)
printf("2y -- LED2灯已经点亮!\r\n");
}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='2' && USART1_RX_BUF[1]=='n'){
GPIO_ResetBits(LEDPORT,LED2); LED灯都为低电平(0)
printf("2n -- LED2灯已经熄灭!\r\n");
}else{ //如果以上都不是,即是错误的指令。
printf("指令错误!\r\n");
}
USART1_RX_STA=0; //将串口数据标志位清0
}
}
}