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;

}

相关推荐
EVERSPIN2 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
芯橦4 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海8 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu9 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白9 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_9 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人9 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时10 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件
bai_lan_ya10 小时前
stm32定时器中断和外部中断
stm32·单片机·嵌入式硬件
玄奕子10 小时前
GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。
stm32·单片机·gpt·嵌入式·嵌入式驱动