使用串口控制LED灯的亮灭
//uartt.c
#include "uartt.h"
char buf[50]={0};
//串口数据初始化
void uart4_init()
{
//1.UART4和GPIOB\GPIOG的时钟使能
RCC->MP_AHB4ENSETR |=(0x1<<2); //使能GPIOB时钟
RCC->MP_AHB4ENSETR |=(0x1<<6); //使能GPIOG时钟
RCC->MP_APB1ENSETR |=(0x1<<16); //使能UART4时钟
//2.设置PB2和PG11的管脚复用
GPIOB->MODER &=(~(0x3<<4));
GPIOB->MODER |=(0x2<<4);
GPIOB->AFRL &=(~(0xF<<8));
GPIOB->AFRL |=(0x8<<8);
GPIOG->MODER &=(~(0x3<<22));
GPIOG->MODER |=(0x2<<22);
GPIOG->AFRL &=(~(0xF<<12));
GPIOG->AFRL |=(0x8<<12);
//3.先去设置串口禁用,方便设置数据结构
USART4->CR1 &=(~0x1);
//设置8位数据位
USART4->CR1 &=(~(0x1<<28));
USART4->CR1 &=(~(0x1<<12));
//设置没有奇偶校验
USART4->CR1 &=(~(0x1<<10));
//设置16倍采样
USART4->CR1 &=(~(0x1<<15));
//设置1位停止位
USART4->CR2 &=(~(0x3<<12));
//设置1分频
USART4->PRESC &=(~(0xF));
//设置波特率为115200bps
USART4->BRR=0x22B;
//发送器,接收器使能
USART4->CR1 |=(0x3<<2);
//串口使能
USART4->CR1 |=0x1;
}
//封装函数发送一个字符数据
void myputchar(char i)
{
//判断TDR寄存器是否为空,如果为空,向TDR寄存器写入数据
while(!(USART4->ISR &(0x1<<7)));
//阻塞等待数据传输完成,函数返回
USART4->TDR=i;
while(!(USART4->ISR &(0x1<<6)));
}
char mygetchar()
{
char a;
//判断RDR寄存器是否有就绪的数据,如果有就读取,否则等待
while(!(USART4->ISR &(0x1<<5)));
a=USART4->RDR;
return a;
}
//读取一个字符串
char* mygets()
{
unsigned int i;
for(i=0;i<50;i++)
{
buf[i]=mygetchar(); //接收字符串
myputchar(buf[i]); //回显
if(buf[i]=='\r')
{
break;
}
}
buf[i]='\0';
myputchar('\n');
return buf;
}
//输出一个字符串
void puts(char* s)
{
while(*s)
{
myputchar(*s);
s++;
}
myputchar('\n'); //切换到下一行
myputchar('\r'); //切换到下一行开头
}
//比较函数
int mystrcmp(char* str1,char* str2)
{
while((*str1==*str2)&&(*str1!='\0')&&(*str2!='\0'))
{
str1++;
str2++;
}
if(*str1==*str2)
{
return 1;
}
else
{
return 0;
}
}
//main.c
#include "uartt.h"
#include "led.h"
//封装延时函数
void delay(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++);
}
}
int main()
{
//串口初始化
uart4_init();
/*
char a;
//现象是发送一个a串口工具打印一个b
while(1)
{
//从串口中读取一个字符
a=mygetchar();
//将读取到的字符+1发送回去
myputchar(a+1);
}
*/
//输出字符串
all_led_init();
while(1)
{
char* str=mygets();
if(mystrcmp(str,"ledon")==1)
{
led1_on();
}
else if(mystrcmp(str,"ledoff")==1)
{
led1_off();
}
}
return 0;
}