uart.h
#ifndef __UART__H__
#define __UART__H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void all_set();
void putchar(char a);
char getchar();
void puts(char *s);
void gets(char *s);
#endif
led.h
#ifndef __LED_H__
#define __LED_H__
#define RCC_GPIO (*(unsigned int *)0x50000a28)
#define GPIOE_MODER (*(unsigned int *)0x50006000)
#define GPIOF_MODER (*(unsigned int *)0x50007000)
#define GPIOE_OTYPER (*(unsigned int *)0x50006004)
#define GPIOF_OTYPER (*(unsigned int *)0x50007004)
#define GPIOE_OSPEEDR (*(unsigned int *)0x50006008)
#define GPIOF_OSPEEDR (*(unsigned int *)0x50007008)
#define GPIOE_PUPDR (*(unsigned int *)0x5000600C)
#define GPIOF_PUPDR (*(unsigned int *)0x5000700c)
#define GPIOE_ODR (*(unsigned int *)0x50006014)
#define GPIOF_ODR (*(unsigned int *)0x50007014)
void all_led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();
void delay(int ms);
void feng_init();
void feng_off();
void feng_on();
#endif
led.c
#include "led.h"
#include"uart4.h"
void all_led_init()
{
RCC_GPIO |= (0X3<<4);//时钟使能
GPIOE_MODER &=(~(0X3<<20));//设置PE10输出
GPIOE_MODER |= (0X1<<20);
//设置PE10为推挽输出
GPIOE_OTYPER &=(~(0x1<<10));
//PE10为低速输出
GPIOE_OSPEEDR &= (~(0x3<<20));
//设置无上拉下拉
GPIOE_PUPDR &= (~(0x3<<20));
//LED2
GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出
GPIOF_MODER |= (0X1<<20);
//设置Pf10为推挽输出
GPIOF_OTYPER &=(~(0x1<<10));
//Pf10为低速输出
GPIOF_OSPEEDR &= (~(0x3<<20));
//设置无上拉下拉
GPIOF_PUPDR &= (~(0x3<<20));
//LED3
GPIOE_MODER &=(~(0X3<<16));//设置PE8输出
GPIOE_MODER |= (0X1<<16);
//设置PE8为推挽输出
GPIOE_OTYPER &=(~(0x1<<8));
//PE8为低速输出
GPIOE_OSPEEDR &= (~(0x3<16));
//设置无上拉下拉
GPIOE_PUPDR &= (~(0x3<<16));
}
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 delay(int ms)
{
int i,j;
for(i=0;i { for(j=0;j<2000;j++) {} } } void feng_init() { GPIOE_MODER &=(~(0X3<<18));//设置PE9输出 GPIOE_MODER |= (0X1<<18); //设置PE9为推挽输出 GPIOE_OTYPER &=(~(0x1<<9)); //PE9为低速输出 GPIOE_OSPEEDR &= (~(0x3<<18)); //设置无上拉下拉 GPIOE_PUPDR &= (~(0x3<<18)); } void feng_on() { GPIOE_ODR |= (0x1<<9); } void feng_off() { GPIOE_ODR &= (~(0x1<<9)); } uart4.c #include "uart4.h" #include "led.h" void all_set() { //1.使能GPIOB\GPIOG\UART4外设时钟 RCC->MP_AHB4ENSETR |=(0x1<<1); //AHB4 RCC->MP_AHB4ENSETR |=(0x1<<6); //AHB4 RCC->MP_APB1ENSETR |=(0x1<<16); //UART //2.设置PB2\PG11用于UART4的管脚复用 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->AFRH &=(0xf<<12); GPIOG->AFRH |=(0x6<<12); //3.0串口禁用 --->在UE为0时,初始化系统设置 USART4->CR1 &=(~0x1); //3.设置数据位宽为8位 USART4->CR1 &=(~(0x1<<12)); USART4->CR1 &=(~(0x0<<28)); //4.设置无奇偶校验位 USART4->CR1 &=(~(0x1<<10)); //5.设置16倍过采样 USART4->CR1 &=(~(0x1<<15)); //6.设置1位停止位 USART4->CR2 &=(~(0x3<<12)); //7.设置不分频 USART4->PRESC &=(~0xf); //8.设置波特率为115200 USART4->BRR = 0x22b; //9.使能发送器 USART4->CR1 |=(0x1<<3); //10.使能接收器 USART4->CR1 |=(0x1<<2); //11.使能串口 USART4->CR1 |=(0x1); } void putchar(char a) { //1.先判断发送器是否为空,不为空等待 while(!(USART4->ISR &(0X1<<7))); //2.向发送寄存器写入数据 USART4->TDR = a; if(a == 'a') { led1_on(); led2_off(); led3_off(); }else if(a == 's') { led1_off(); led2_on(); led3_off(); }else if(a == 'd') { led1_off(); led2_off(); led3_on(); }else if(a == 'f') { feng_on(); }else if(a == 'g') { feng_off(); } //3.等待发送完成 while(!(USART4->ISR &(0x1<<6))); } char getchar() { char a; //1.判断接收器是否有准备好的数据,没有就等待 while(!(USART4->ISR &(0x1<<5))); //2.读取数据 a=USART4->RDR; //3.返回 return a; } void puts(char *s) { // while(*s) // { // putchar(*s); // s++; // } // putchar('\r'); // putchar('\n'); } void gets(char *s) { // while(1) // { // *s = getchar(); // putchar(*s); // if(*s == '\r') break; // s++; // } // *s='\0'; // putchar('\n'); } man.c #include "gpio.h" #include"uart4.h" #include "led.h" int main() { char a; //char buf[128]; all_set(); all_led_init(); feng_init(); while(1) { a=getchar(); putchar(a); putchar('\r'); putchar('\n'); // gets(buf); // puts(buf); } return 0; } 相关文章
发表评论