12.25作业

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;

}

你可能感兴趣的:(c语言)