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;

}

相关推荐
happygrilclh2 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计3 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
嵌入式阿蔡6 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
天空'之城7 小时前
单片机基础核心知识点汇总(三)
单片机·嵌入式硬件
嵌入式阿蔡7 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
离凌寒8 小时前
一、对stm32mp157配置freertos后,任务挂掉无法启动问题总结
stm32·单片机·嵌入式硬件
消失的旧时光-194310 小时前
7-fix补充篇:机器人为什么需要多级控制仲裁?Cloud、Linux 与 MCU 分别管什么
linux·单片机·机器人·仲裁机制·安全保护机制
Hello_Damon_Nikola11 小时前
CH573从入门到精通
c语言·开发语言·单片机·嵌入式硬件
oshan201211 小时前
华大小华HC32F460单片机在线烧录
单片机·嵌入式硬件
LCG元11 小时前
STM32 USB HID 自定义免驱设备开发:从报告描述符到上位机 64 字节收发实战
stm32·单片机·嵌入式硬件