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;

}

相关推荐
文科比理科更擅长的工科男3 小时前
012-51单片机CLD1602显示万年历+闹钟+农历+整点报时
单片机·嵌入式硬件·51单片机
云山工作室5 小时前
基于单片机的盲人智能水杯系统(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
2401_843785238 小时前
STM32 PWM驱动舵机
stm32·单片机·嵌入式硬件
charlie11451419112 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
c语言·stm32·单片机·教程·oled·嵌入式软件
2401_8437852318 小时前
STM32 AD多通道
stm32·单片机·嵌入式硬件
厂太_STAB_丝针18 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
charlie11451419120 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
简知圈1 天前
【04-自己画P封装,并添加已有3D封装】
笔记·stm32·单片机·学习·pcb工艺
徐某人..1 天前
ARM嵌入式学习--第十天(UART)
arm开发·单片机·学习·arm
stm32发烧友1 天前
基于 STM32 的智能电梯控制系统
stm32·单片机·嵌入式硬件