led.h:
#ifndef __LED_H__
#define __LED_H__
//防止头文件重复包含
//RCC_MP_AHB4ENSETR寄存器封装
#define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)
//GPIO使用结构体封装
typedef struct{
volatile unsigned int MODER;
volatile unsigned int OTYPER;
volatile unsigned int OSPEEDR;
volatile unsigned int PUPDR;
volatile unsigned int IDR;
volatile unsigned int ODR;
}gpio_t;
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
//LED1-->PE10
//封装初始化函数
void LED1_RCC_GPIO_INIT();
//LED1点亮函数
void LED1_ON();
//LED1熄灭函数
void LED1_OFF();
#endif
led.c:
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
// UART4_TX : PG11 AF6
// UART4_RX : PB2 AF8
void __uart_init()
{
// GPIOB2 设置为复用功能
GPIOB->MODER &= (~(0x3 << 4));
GPIOB->MODER |= (0x2 << 4);
GPIOB->AFRL &= (~(0xF << 8));
GPIOB->AFRL |= (0x8 << 8);
// GPIOG11 设置为复用功能
GPIOG->MODER &= (~(0x3 << 22));
GPIOG->MODER |= (0x2 << 4);
GPIOG->AFRH &= (~(0xF << 12));
GPIOG->AFRH |= (0x6 << 12);
// 设置数据长度为8位 USART_CR1
USART4->CR1 &= (~(0x1 << 28));
USART4->CR1 &= (~(0x1 << 12));
// 采样率为16位
USART4->CR1 &= (~(0x1 << 15));
// 设置波特率为115200bps
USART4->PRESC &= (~(0xF << 0));
USART4->BRR = 0xD0;
// 停止位1位
USART4->CR2 &= (~(0x3 << 12));
// 使能USART串口
USART4->CR1 |= (0x1 << 0);
// 使能USART的发送或者接收功能
USART4->CR1 |= (0x1 << 3);
USART4->CR1 |= (0x1 << 2);
}
void __uart_putc(const char data)
{
while (!(USART4->ISR & (0x1 << 7)));
USART4->TDR = data;
if (data == '\n')
__uart_putc('\r');
}
void __uart_puts(const char *pstr)
{
while(*pstr != '\0')
__uart_putc(*pstr++);
}
char __uart_getc(void)
{
char ch;
while(!(USART4->ISR & (0x1 << 5)));
ch = (char)USART4->RDR;
return ch;
}
main.c:
#include "gpio.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
hal_gpio_init(); // LED灯初始化
while(1)
{
hal_gpio_output_high(LED1);
delay_ms(500);
hal_gpio_output_low(LED1);
delay_ms(500);
}
return 0;
}