uart4.h
#ifndef __LED_H__
#define __LED_H__
typedef struct{
unsigned int moder;
unsigned int otyper;
unsigned int ospeeder;
unsigned int pupdr;
unsigned int idr;
unsigned int odr;
unsigned int bsrr;
unsigned int lckr;
unsigned int afrl;
unsigned int afrh;
}gpio_t;
#define GPIOB ((gpio_t*)0x50003000)
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
#define GPIOG ((gpio_t *)0x50008000)
#define RCC_GPIO (*((unsigned int *)0x50000a28))
#define RCC_UART4 (*((unsigned int *)0x50000a00))
#define USART4_CR1 (*((unsigned int *)0x40010000))
#define USART4_CR2 (*((unsigned int *)0x40010004))
#define USART4_BRR (*((unsigned int *)0x4001000c))
#define USART4_ISR (*((unsigned int *)0x4001001c))
#define USART4_RDR (*((unsigned int *)0x40010024))
#define USART4_TDR (*((unsigned int *)0x40010028))
#define USART4_PRESC (*((unsigned int *)0x4001002c))
void uputchar( char a);
char ugetchar();
void uart4_config();
void gets(char *s);
void puts(char *s);
int strcmp(char *a,char *b);
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();
void fen_on();
void fen_off();
void ma_on();
void ma_off();
void qi_on();
void qi_off();
#endif
uart4.c
#include "uart4.h"
void uart4_config()
{
//给UE设置为0
USART4_CR1 &=(~0x1);
//设置外设时钟
RCC_UART4 |= (0X1<<16);
RCC_GPIO |=(0x1<<1); //PB
RCC_GPIO |=(0x1<<6); //PG
//UART4_RX
GPIOB->moder &=(~(0X3<<4));//设置PB2复用
GPIOB->moder |= (0X1<<5);
//设置GPIOB2 AF8 为rx模式
GPIOB->afrl &=(~(0xf<<8));
GPIOB->afrl |=((0x1<<11));
//UART4_TX
GPIOG->moder &=(~(0X3<<22));
GPIOG->moder |= (0X1<<23);
//设置GPIOB2 AF8 为tx模式
GPIOG->afrh &=(~(0xf<<12));
GPIOG->afrh |=(0x3<<13);
//设置数据位宽 12位0 28位0
USART4_CR1 &=(~(0x1<<12));
USART4_CR1 &=(~(0x1<<28));
//设置16倍过采样 15位为0
USART4_CR1 &=(~(0x1<<15));
//设置奇偶校验为无 10位0
USART4_CR1 &=(~(0x1<<10));
//设置发送器使能 3位1 设置接收器使能 2位1
USART4_CR1 |=(0x3<<2);
//设置1位停止位 13:12位00
USART4_CR2 &=(~(0x3<<12));
//设置不分频
USART4_PRESC &=(~(0xf));
//设置波特率为 115200
USART4_BRR =0x22b;
//使能串口
USART4_CR1 |=(0x1);
//设置PE10 PF0 PE8
RCC_GPIO |= (0X3<<4);//时钟使能
GPIOE->moder &=(~(0X3<<20));//设置PE10输出
GPIOE->moder |= (0X1<<20);
//设置PE10为推挽输出
GPIOE->otyper &=(~(0x1<<10));
//PE10为低速输出
GPIOE->ospeeder &= (~(0x3<<20));
//设置无上拉下拉
GPIOE->pupdr &= (~(0x3<<20));
//LED2
GPIOF->moder &=(~(0X3<<20));//设置Pf10输出
GPIOF->moder |= (0X1<<20);
//设置Pf10为推挽输出
GPIOF->otyper &=(~(0x1<<10));
//Pf10为低速输出
GPIOF->ospeeder &= (~(0x3<<20));
//设置无上拉下拉
GPIOF->pupdr &= (~(0x3<<20));
//LED3
GPIOE->moder &=(~(0X3<<16));//设置PE8输出
GPIOE->moder |= (0X1<<16);
//设置PE8为推挽输出
GPIOE->otyper &=(~(0x1<<8));
//PE8为低速输出
GPIOE->ospeeder &= (~(0x3<16));
//设置无上拉下拉
GPIOE->pupdr &= (~(0x3<<16));
//风扇
GPIOE->moder &=(~(0X3<<18));//设置PE9输出
GPIOE->moder |= (0X1<<18);
//设置PE9为推挽输出
GPIOE->otyper &=(~(0x1<<9));
//PE9为低速输出
GPIOE->ospeeder &= (~(0x3<18));
//设置无上拉下拉
GPIOE->pupdr &= (~(0x3<<18));
//蜂鸣器
GPIOB->moder &=(~(0X3<<12));//设置PB6输出
GPIOB->moder |= (0X1<<12);
//设置PE9为推挽输出
GPIOB->otyper &=(~(0x1<<6));
//PE9为低速输出
GPIOB->ospeeder &= (~(0x3<12));
//设置无上拉下拉
GPIOB->pupdr &= (~(0x3<<12));
//马达
GPIOF->moder &=(~(0X3<<12));//设置PF6输出
GPIOF->moder |= (0X1<<12);
//设置PE9为推挽输出
GPIOF->otyper &=(~(0x1<<6));
//PE9为低速输出
GPIOF->ospeeder &= (~(0x3<12));
//设置无上拉下拉
GPIOF->pupdr &= (~(0x3<<12));
}
char ugetchar()
{
char a;
while( ! (USART4_ISR & (0x1<<5)));
a= USART4_RDR;
return a;
}
void uputchar( char a)
{
while( ! (USART4_ISR & (0x1<<7)));
USART4_TDR=a;
while(!(USART4_ISR & (0x1<<6)));
}
void puts(char *s)
{
while(*s)
{
uputchar(*s);
s++;
}
uputchar('\r');
uputchar('\n');
}
void gets(char *s)
{
while(1)
{
*s=ugetchar();
uputchar(*s);
if(*s=='\r')
break;
s++;
}
*s='\0';
uputchar('\n');
}
int strcmp(char *a,char *b)
{
while(*a!='\0')
{
if(*a != *b)
{
return -1;
}
a++;
b++;
}
return 0;
}
void led1_on()
{
GPIOE->odr |= (0x1<<10);
}
void led1_off()
{
GPIOE->odr &= (~(0x1<<10));
}
void led2_on()
{
GPIOF->odr |= (0x1<<10);
}
void led2_off()
{
GPIOF->odr &= (~(0x1<<10));
}
void led3_on()
{
GPIOE->odr |= (0x1<<8);
}
void led3_off()
{
GPIOE->odr &= (~(0x1<<8));
}
void fen_on()
{
GPIOE->odr |= (0x1<<9);
}
void fen_off()
{
GPIOE->odr &= (~(0x1<<9));
}
void ma_on()
{
GPIOF->odr |= (0x1<<6);
}
void ma_off()
{
GPIOF->odr &= (~(0x1<<6));
}
void qi_on()
{
GPIOB->odr |= (0x1<<6);
}
void qi_off()
{
GPIOF->odr &= (~(0x1<<6));
}
main.c
#include "uart4.h"
int main()
{
uart4_config();
char a;
char buf[128];
while(1)
{
/* a=ugetchar();
uputchar(a+1);*/
gets(buf);
// puts(buf);
if(strcmp(buf,"led1_on")==0)
led1_on();
if(strcmp(buf,"led1_off")==0)
led1_off();
if(strcmp(buf,"led2_on")==0)
led2_on();
if(strcmp(buf,"led2_off")==0)
led2_off();
if(strcmp(buf,"led3_on")==0)
led3_on();
if(strcmp(buf,"led3_off")==0)
led3_off();
if(strcmp(buf,"fen_on")==0)
fen_on();
if(strcmp(buf,"fen_off")==0)
fen_off();
if(strcmp(buf,"ma_on")==0)
ma_on();
if(strcmp(buf,"ma_off")==0)
ma_off();
if(strcmp(buf,"qi_on")==0)
qi_on();
if(strcmp(buf,"qi_off")==0)
qi_off();
}
return 0;
}