LED
main.c
#include "led.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++);
}
void leds_init()
{
//RCC章节
RCC->MP_AHB4ENSETR |= (0x1<<4);
RCC->MP_AHB4ENSETR |= (0x1<<5);
//GPIO章节
led_init init = {OUTPUT,PP,LOW,NO};
hal_gpio_init(GPIOE,&init,10);
hal_gpio_init(GPIOF,&init,10);
hal_gpio_init(GPIOE,&init,8);
}
int main()
{
leds_init();
while(1)
{
hal_led_write(GPIOE,10,SET);
delay_ms(500);
hal_led_write(GPIOE,10,RESET);
delay_ms(500);
hal_led_write(GPIOF,10,SET);
delay_ms(500);
hal_led_write(GPIOF,10,RESET);
delay_ms(500);
hal_led_write(GPIOE,8,SET);
delay_ms(500);
hal_led_write(GPIOE,8,RESET);
delay_ms(500);
}
return 0;
}
led.c
#include "led.h"
void hal_gpio_init(gpio_t* gpiox,led_init *init,unsigned int pin)
{
gpiox->MODER &= ~(0x3<<pin*2);
gpiox->MODER |= (init->moder<<pin*2);
gpiox->OTYPER &= ~(0x1<<pin);
gpiox->OTYPER |= (init->typer<<pin);
gpiox->OSPEEDR &= ~(0x3<<pin*2);
gpiox->OSPEEDR |= (init->speed<<pin*2);
gpiox->PUPDR &= ~(0x3<<pin*2);
gpiox->PUPDR |= (init->pupdr<<pin*2);
}
void hal_led_write(gpio_t* gpiox,unsigned int pin,status_t status)
{
if(status==RESET)
{
gpiox->ODR &= ~(0x1<<pin);
}
if(status==SET)
{
gpiox->ODR |= (0x1<<pin);
}
}
led.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
typedef enum//模式寄存器
{
INPUT,
OUTPUT,
ALT,
ANA
}moder_t;
typedef enum//输出类型寄存器
{
PP,
OD
}otyper_t;
typedef enum//输出速度寄存器
{
LOW,
MED,
HIGH,
VERY_HIGH
}speed_t;
typedef enum//有无上下拉电阻
{
NO,
P_UP,
P_DOWN,
RES
}pupdr_t;
typedef enum//亮灭状态
{
RESET,
SET
}status_t;
typedef struct //初始化结构体
{
moder_t moder;
otyper_t typer;
speed_t speed;
pupdr_t pupdr;
}led_init;
void hal_gpio_init(gpio_t* gpiox,led_init *init,unsigned int pin);
void hal_led_write(gpio_t* gpiox,unsigned int pin,status_t status);
#endif
串口
main.c
#include "uart4.h"
void delay_ms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1800;j++);
}
int main(int argc, const char *argv[])
{
hal_uart4_init();
while(1)
{
//put_char(get_char()+1);
put_string(get_string());
}
return 0;
}
uart.c
#include "uart4.h"
extern void delay_ms(int ms);
void hal_uart4_init()
{
//RCC章节
RCC->MP_AHB4ENSETR |= (0x1<<1);
RCC->MP_AHB4ENSETR |= (0x1<<6);
RCC->MP_APB1ENSETR |= (0x1<<16);
//GPIO章节
GPIOB->MODER &= ~(0x3<<4);
GPIOB->MODER |= (0x2<<4);
GPIOG->MODER &= ~(0x3<<22);
GPIOG->MODER |= (0x2<22);
GPIOB->AFRL &= ~(0xF<<8);
GPIOB->AFRL |= (0x8<<8);
GPIOG->AFRH &= ~(0xf<<12);
GPIOG->AFRH |= (0x6<<12);
//USART章节
if(USART4->CR1 & (0x1<<0))
{
delay_ms(500);
USART4->CR1 &= (~(0x1<<0));
}
USART4->CR1 &= ~(0x1<<28);//8,n
USART4->CR1 &= ~(0x1<<12);
USART4->CR1 &= ~(0x1<<15);//16倍采样率
USART4->CR1 &= ~(0x1<<10);//奇偶校验不启用
USART4->CR1 |= (0x1<<3);//发送器使能
USART4->CR1 |= (0x1<<2);//接收器使能
USART4->CR1 |= (0x1<<0);//UE使能
USART4->CR2 &= ~(0x3<<12);//1
USART4->BRR =0x22b;//115200
USART4->PRESC &= (~(0xff<<0));//不分频
}
void put_char(const char str)
{
while(!(USART4->ISR & (0x1<<7)));
USART4->TDR = str;
while(!(USART4->ISR & (0x1<<6)));
}
char get_char()
{
char c;
while(!(USART4->ISR & (0x1<<5)));
c=USART4->RDR;
return c;
}
void put_string(const char* string)
{
while(*string)
{
put_char(*string++);
}
put_char('\n');
put_char('\r');
}
char arr[50]={0};
char *get_string()
{
unsigned int i;
for(i=0;i<50;i++)
{
arr[i]=get_char();
put_char(arr[i]);//回显
if(arr[i]=='\r')
{
break;
}
}
arr[i]='\0';
put_char('\n');
return arr;
}
uart.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
//uart4初始化
void hal_uart4_init();
//发送一个字符
void put_char(const char str);
//发送一个字符串
void put_string(const char* string);
//接收一个字符
char get_char();
//接收一个字符串
char *get_string();
#endif