ARM day6

uart4.h:

#ifndef UART_H

#define UART_H

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_rcc.h"

#include "stm32mp1xx_uart.h"

void uart4_init();

void putchar(char a);

char getchar();

#define RCCT (*(unsigned int *)0X50000A28)

#define GPIOE_MODER (*(unsigned int *)0X50006000)

#define GPIOF_MODER (*(unsigned int *)0X50007000)

#define GPIOE_OTYPER (*(unsigned int *)0X50006004)

#define GPIOE_OSPEEDR (*(unsigned int *)0X50006008)

#define GPIOE_OPUPDR (*(unsigned int *)0X5000600C)

#define GPIOE_ODR (*(unsigned int *)0X50006014)

#define GPIOF_OTYPER (*(unsigned int *)0X50007004)

#define GPIOF_OSPEEDR (*(unsigned int *)0X50007008)

#define GPIOF_OPUPDR (*(unsigned int *)0X5000700C)

#define GPIOF_ODR (*(unsigned int *)0X50007014)

void all_led_init();

void LED1_ON();

void LED2_ON();

void LED3_ON();

void LED1_OFF();

void LED2_OFF();

void LED3_OFF();

#endif

uart4.c:

#include "uart4.h"

void uart4_init()

{

//使能GPIOB GPIOG UART4外设时钟

RCC->MP_AHB4ENSETR |= (0x1<<1);//GPIOB

RCC->MP_AHB4ENSETR |= (0x1<<6);//GPIOG

RCC->MP_APB1ENSETR |= (0X1<<16);//UART4

//设置PB2和PG11管脚复用

//PB2

GPIOB->MODER &= (~(0x3<<4));

GPIOB->MODER |=(0x2<<4);

GPIOB->AFRL &= (~(0XF<<8));

GPIOB->AFRL |= (0x8<<8);

//PG11

GPIOG->MODER &= (~(0x3<<22));

GPIOG->MODER |=(0x2<<22);

GPIOG->AFRH &= (~(0XF<<12));

GPIOG->AFRH |= (0x6<<12);

//设置串口不使能 UE=0

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);

//使能uart4

USART4->CR1 |= (0x1<<0);

}

//发送一个字符

void putchar(char a)

{

//先判断发送数据寄存器是否为空

//不为空阻塞等待

while(!(USART4->ISR&(0x1<<7)));

//为空向发送数据寄存器写入a的数据

USART4->TDR=a;//写入数据

//写入完成需要判断发送是否完成,不完成阻塞等待,完成了则函数结束

while(!(USART4->ISR&(0x1<<6)));

}

//接收一个字符

char getchar()

{

char a;

//先判断接收数据寄存器中有没有准备好的数据

//如果数据没有准备好则阻塞等待

while(!(USART4->ISR&(0x1<<5)));

//如果数据准备好了则读取

a=USART4->RDR;

//读取完毕将读取到的数据返回

return a;

}

void all_led_init()//led灯的初始化

{

//GPIOE/GPIOF时钟使能

RCCT |= (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);

//PE10设置为推挽输出

GPIOE_OTYPER &= (~(0X1<<10));

//PF10设置为推挽输出

GPIOF_OTYPER &= (~(0X1<<10));

//PE8设置为推挽输出

GPIOE_OTYPER &= (~(0X1<<8));

//PE10设置为低速输出

GPIOE_OSPEEDR &= (~(0X3<<20));

//PF10设置为低速输出

GPIOF_OSPEEDR &= (~(0X3<<20));

//PE8设置为低速输出

GPIOE_OSPEEDR &= (~(0X3<<16));

//PE10无上拉下拉电阻

GPIOE_OPUPDR &= (~(0X3<<20));

//PF10无上拉下拉电阻

GPIOF_OPUPDR &= (~(0X3<<20));

//PE8无上拉下拉电阻

GPIOE_OPUPDR &= (~(0X3<<16));

//三盏灯默认输出低电平

GPIOE_ODR &= (~(0X1<<10));

GPIOF_ODR &= (~(0X1<<10));

GPIOE_ODR &= (~(0X1<<8));

}

//led1亮

void LED1_ON()

{

GPIOE_ODR |= (0X1<<10);

}

//led2亮

void LED2_ON()

{

GPIOF_ODR |= (0X1<<10);

}

//led3亮

void LED3_ON()

{

GPIOE_ODR |= (0X1<<8);

}

//LED1灭

void LED1_OFF()

{

GPIOE_ODR &= (~(0X1<<10));

}

//LED2灭

void LED2_OFF()

{

GPIOF_ODR &= (~(0X1<<10));

}

//LED3灭

void LED3_OFF()

{

GPIOE_ODR &= (~(0X1<<8));

}

main.c:

#include "uart4.h"

void delay(int ms)

{

int i,j;

for(i=0;i<ms;i++)

{

for(j=0;j<2000;j++)

{}

}

}

int main()

{

//串口初始化

uart4_init();

//led灯的初始化

all_led_init();

char i;

while(1)

{

i=getchar();

putchar(i);

switch (i)

{

case 'a':

LED1_ON();

LED2_OFF();

LED3_OFF();

break;

case 'b':

LED1_ON();

LED2_OFF();

LED3_OFF();

break;

case 'c':

LED1_ON();

LED2_OFF();

LED3_OFF();

break;

default:

LED1_ON();

LED2_ON();

LED3_ON();

break;

}

}

return 0;

}

相关推荐
小莞尔1 天前
【51单片机】【protues仿真】基于51单片机四层电梯系统
单片机·嵌入式硬件
CFZPL1 天前
使用江科大串口发送函数发送freertos的vTaskList出现跑飞
单片机
F133168929571 天前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·51单片机·硬件工程·pcb工艺
易享电子1 天前
基于单片机电器断路器保护器系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
爱倒腾的老唐1 天前
01、如何学习单片机
单片机·嵌入式硬件·学习
点灯小铭1 天前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
雾削木2 天前
stm32解锁芯片
javascript·stm32·单片机·嵌入式硬件·gitee
三佛科技-134163842122 天前
手持小风扇MCU方案,智能风扇方案设计开发
单片机·嵌入式硬件
btzhy2 天前
STM32单片机:基本定时器应用:PWM 生成(STM32L4xx)
stm32·单片机·嵌入式硬件·基本定时器应用:pwm生成
guangshui5162 天前
18006.STM32通过SPI读取LAN9253数据
stm32·单片机·嵌入式硬件