作业
主函数
int main()
{
uart4_init();
all_led_init();
char i;
while(1)
{
i=getchar();
putchar(i);
if(i=='1')
{
LED1_ON();
LED2_OFF();
LED3_OFF();
}else if(i=='2')
{
LED2_ON();
LED1_OFF();
LED3_OFF();
}else if(i=='3')
{
LED3_ON();
LED1_OFF();
LED2_OFF();
}
}
return 0;
}
usart4.c
#include "uart4.h"
void uart4_init()
{
//配置串口相关设置
//使能gpiob gpiog uart4
RCC->MP_AHB4ENSETR |=(0x1<<1);
RCC->MP_AHB4ENSETR |=(0x1<<6);
RCC->MP_APB1ENSETR |=(0x1<<16);
//设置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);
GPIOB->AFRH &=(~(0xF<<12));
GPIOB->AFRH |=(0x6<<12);
//设置串口不使能
USART4->CR1 &=(~(0x1));
//设置8位数据位
USART4->CR1 &=(~(0x1<<12));
USART4->CR1 &=(~(0x1<<28));
//设置没有奇偶校验位
USART4->CR1 &=(~(0x1<<10));
//设置1位停止位
USART4->CR2 &=(~(0x3<<12));
//设置16倍过采样
USART4->CR1 &=(~(0x1<<15));
//设置时钟不分频
USART4->PRESC &=(~(0xF));
//设置波特率115200
USART4->BRR=0x22B;
//使能发送器
USART4->CR1 |=(0x1<<3);
//使能接收器
USART4->CR1 |=(0x1<<2);
//使能usart4
USART4->CR1 |=(0x1<<0);
}
void putchar(char a)
{
while(!(USART4->ISR&(0x1<<7)));
USART4->TDR=a;
while(!(USART4->ISR&(0x1<<6)));
}
char getchar()
{
char a;
while(!(USART4->ISR&(0x1<<5)));
a=USART4->RDR;
return a;
}
led.c
void all_led_init()
{
RCC->MP_AHB4ENSETR |= (0x3<<4);
//pe10 设置输出
GPIOE->MODER &= (~(0x3 <<20));
GPIOE->MODER |= (0x1 <<20);
//pf10设置输出
GPIOF->MODER &= (~(0x3 <<20));
GPIOF->MODER |= (0x1 <<20);
//pe8设置输出
GPIOE->MODER &= (~(0x3 <<16));
GPIOE->MODER |= (0x1 <<16);
//设置推挽
GPIOE->OTYPER &= (~(0x1 <<10));
GPIOF->OTYPER &= (~(0x1 <<10));
GPIOE->OTYPER &= (~(0x1 <<8));
//设置低速
GPIOE->OSPEEDR &= (~(0x3 <<20));
GPIOF->OSPEEDR &= (~(0x3 <<20));
GPIOE->OSPEEDR &= (~(0x3 <<16));
//设置无上拉下拉
GPIOE->PUPDR &= (~(0x3 <<20));
GPIOF->PUPDR &= (~(0x3 <<20));
GPIOE->PUPDR &= (~(0x3 <<16));
//默认输出低电平
GPIOE->ODR &=(~(0x1 <<10));
GPIOF->ODR &=(~(0x1 <<10));
GPIOE->ODR &=(~(0x1 <<8));
}
void LED1_ON()
{
GPIOE->ODR |=(0x1 <<10);
}
void LED2_ON()
{
GPIOF->ODR |= (0x1 <<10);
}
void LED3_ON()
{
GPIOE->ODR |=(0x1 <<8);
}
void LED1_OFF()
{
GPIOE->ODR &=(~(0x1 <<10));
}
void LED2_OFF()
{
GPIOF->ODR &=(~(0x1 <<10));
}
void LED3_OFF()
{
GPIOE->ODR &=(~(0x1 <<8));
}