ARM串口通信编程实验

完成:从终端输入选项,完成点灯关灯,打开风扇关闭风扇等操作

#include "gpio.h"
int main()
{
   
 	  char a;
	//char buf[128];
	uart4_config();
	gpio_config();
    while(1)
    {
   
       //接收一个字符数据
	   a = getchar();
	   //发送接收的字符
	    putchar(a);
	   switch(a)
	   {
   
		   case '1':
		   	{
   
				   light1_on();
			}break;
			case '2':
			{
   
					light2_on();
			}break;
			case '3':
			{
   
					light3_on();
			}break;
			case '4':
			{
   
					fans_on();
			}break;
			case '0':
			{
   
					light_off();
			}break;
	   }
    }
    return 0;
}
#include "gpio.h"
 void uart4_config()
 {
   
	 //使能GPIOB\GPIOG\UART4外设时钟
	RCC->MP_AHB4ENSETR |= (0x1<<6);  //gpioB
	RCC->MP_AHB4ENSETR |= (0x1<<1);  //gpioG
	RCC->MP_APB4ENSETR |= (0x1<<16); //uart4
	 //设置PB2、PG11用于UART4管脚复用
	GPIOB->MODER &=~(0x3<<4);
	GPIOB->MODER |= (0x2<<4);
	GPIOB->AFRL &=~(0xf<<8);
	GPIOB->AFRL |= (0x8<<8);


	GPIOG->MODER &= ~(0x3<<22);
	GPIOG->MODER |= (0x2<<22);
	GPIOG->AFRH &=~(0xf<<12);
	GPIOG->AFRH |= (0x6<<12);
	//设置串口禁用
	USART4->CR1 &= ~(0x1);
	 //设置数据位宽为8位
	USART4->CR1 &=(~(0x1<<12));
	USART4->CR1 &=(~(0x1<<28));
	//设置无奇偶校验位
	USART4->CR1 &=(~(0x1<<10));
	//设置16倍过采样
	USART4->CR1 &=(~(0x1<<15));
	//设置1位停止位
	USART4->CR2 &=(~(0x3<<12));
	//设置不分频
	USART4->PRESC &= (~0xf);
	//设置波特率为115200
	USART4->BRR = 0x22B;
	//使能发送器
	USART4->CR1 |= (0x1<<3);
	//使能接收器
	USART4->CR1 |= (0x1<<2);
	//使能串口
	USART4->CR1 |= (0x1);
 }

void putchar(char a)
{
   
	while(!(USART4->ISR &(0x1<<7)));
	USART4->TDR=a;
	while(!(USART4->ISR &(0x1<<6)));
}

char getchar()
{
   
	char a;
	while(!(USART4->ISR &(0x1<<5)));
	a=USART4->RDR;
	return a;
}

void puts(char *s)
{
   
	while(*s)
	{
   
		putchar(*s);
		s++;
	}
	putchar('\r');
	putchar('\n');
}

void gets(char *s)
{
   
	while(1)
	{
   
		*s = getchar();
		putchar(*s);
		if(*s == 'r')
			break;
		s++;
	}
	*s = '\0';
	putchar('\n');
}

void gpio_config()
{
   
	RCC_GPIO |=(0x3<<4);
	GPIOE->MODER &=(~(0x3<<20));
	GPIOE->MODER |=(0x1<<20);
	GPIOE->OTYPER &=(~(0x1<<10));
	GPIOE->OSPEEDR &=(~(0x3<<20));
	GPIOE->PUPDR &=(~(0x3<<20));

	GPIOF->MODER &=(~(0x3<<20));
	GPIOF->MODER |=(0x1<<20);
	GPIOF->OTYPER &=(~(0x1<<10));
	GPIOF->OSPEEDR &=(~(0x3<<20));
	GPIOF->PUPDR &=(~(0x3<<20));

	GPIOE->MODER &=(~(0x3<<16));
	GPIOE->MODER |=(0x1<<16);
	GPIOE->OTYPER &=(~(0x1<<8));
	GPIOE->OSPEEDR &=(~(0x3<<16));
	GPIOE->PUPDR &=(~(0x3<<16));

	GPIOE->MODER &=(~(0x3<<18));
	GPIOE->MODER |=(0x1<<18);
	GPIOE->OTYPER &=(~(0x1<<9));
	GPIOE->OSPEEDR &=(~(0x3<<18));
	GPIOE->PUPDR &=(~(0x3<<18));

}

void light1_on()
{
   
	GPIOE->ODR |= (0x1<<10);
}

void light2_on()
{
   
	GPIOF->ODR |= (0x1<<10);
}

void light3_on()
{
   
	GPIOE->ODR |= (0x1<<8);
}

void fans_on()
{
   
	GPIOE->ODR |= (0x1<<9);
}

void light_off()
{
   
	GPIOE->ODR &= (~(0x1<<10));
	GPIOF->ODR &= (~(0x1<<10));
	GPIOE->ODR &= (~(0x1<<8));
	GPIOE->ODR &= (~(0x1<<9));
}

#include "gpio.h"
 void uart4_config()
 {
   
	 //使能GPIOB\GPIOG\UART4外设时钟
	RCC->MP_AHB4ENSETR |= (0x1<<6);  //gpioB
	RCC->MP_AHB4ENSETR |= (0x1<<1);  //gpioG
	RCC->MP_APB4ENSETR |= (0x1<<16); //uart4
	 //设置PB2、PG11用于UART4管脚复用
	GPIOB->MODER &=~(0x3<<4);
	GPIOB->MODER |= (0x2<<4);
	GPIOB->AFRL &=~(0xf<<8);
	GPIOB->AFRL |= (0x8<<8);


	GPIOG->MODER &= ~(0x3<<22);
	GPIOG->MODER |= (0x2<<22);
	GPIOG->AFRH &=~(0xf<<12);
	GPIOG->AFRH |= (0x6<<12);
	//设置串口禁用
	USART4->CR1 &= ~(0x1);
	 //设置数据位宽为8位
	USART4->CR1 &=(~(0x1<<12));
	USART4->CR1 &=(~(0x1<<28));
	//设置无奇偶校验位
	USART4->CR1 &=(~(0x1<<10));
	//设置16倍过采样
	USART4->CR1 &=(~(0x1<<15));
	//设置1位停止位
	USART4->CR2 &=(~(0x3<<12));
	//设置不分频
	USART4->PRESC &= (~0xf);
	//设置波特率为115200
	USART4->BRR = 0x22B;
	//使能发送器
	USART4->CR1 |= (0x1<<3);
	//使能接收器
	USART4->CR1 |= (0x1<<2);
	//使能串口
	USART4->CR1 |= (0x1);
 }

void putchar(char a)
{
   
	while(!(USART4->ISR &(0x1<<7)));
	USART4->TDR=a;
	while(!(USART4->ISR &(0x1<<6)));
}

char getchar()
{
   
	char a;
	while(!(USART4->ISR &(0x1<<5)));
	a=USART4->RDR;
	return a;
}


void gpio_config()
{
   
	RCC_GPIO |=(0x3<<4);
	GPIOE->MODER &=(~(0x3<<20));
	GPIOE->MODER |=(0x1<<20);
	GPIOE->OTYPER &=(~(0x1<<10));
	GPIOE->OSPEEDR &=(~(0x3<<20));
	GPIOE->PUPDR &=(~(0x3<<20));

	GPIOF->MODER &=(~(0x3<<20));
	GPIOF->MODER |=(0x1<<20);
	GPIOF->OTYPER &=(~(0x1<<10));
	GPIOF->OSPEEDR &=(~(0x3<<20));
	GPIOF->PUPDR &=(~(0x3<<20));

	GPIOE->MODER &=(~(0x3<<16));
	GPIOE->MODER |=(0x1<<16);
	GPIOE->OTYPER &=(~(0x1<<8));
	GPIOE->OSPEEDR &=(~(0x3<<16));
	GPIOE->PUPDR &=(~(0x3<<16));

	GPIOE->MODER &=(~(0x3<<18));
	GPIOE->MODER |=(0x1<<18);
	GPIOE->OTYPER &=(~(0x1<<9));
	GPIOE->OSPEEDR &=(~(0x3<<18));
	GPIOE->PUPDR &=(~(0x3<<18));

}

void light1_on()
{
   
	GPIOE->ODR |= (0x1<<10);
}

void light2_on()
{
   
	GPIOF->ODR |= (0x1<<10);
}

void light3_on()
{
   
	GPIOE->ODR |= (0x1<<8);
}

void fans_on()
{
   
	GPIOE->ODR |= (0x1<<9);
}

void light_off()
{
   
	GPIOE->ODR &= (~(0x1<<10));
	GPIOF->ODR &= (~(0x1<<10));
	GPIOE->ODR &= (~(0x1<<8));
	GPIOE->ODR &= (~(0x1<<9));
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

相关推荐

  1. 51单片机——串口通信编程

    2023-12-26 09:00:04       49 阅读
  2. ARM实验串口控制LED亮灭

    2023-12-26 09:00:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-26 09:00:04       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-26 09:00:04       97 阅读
  3. 在Django里面运行非项目文件

    2023-12-26 09:00:04       78 阅读
  4. Python语言-面向对象

    2023-12-26 09:00:04       88 阅读

热门阅读

  1. Android开发中常见的Hook技术有哪些?

    2023-12-26 09:00:04       59 阅读
  2. redisson分布式锁实现方式

    2023-12-26 09:00:04       63 阅读
  3. Servlet技术之Cookie对象与HttpSession对象

    2023-12-26 09:00:04       43 阅读
  4. LLM调研笔记

    2023-12-26 09:00:04       57 阅读
  5. 遇到DDOS了怎么去防御

    2023-12-26 09:00:04       48 阅读
  6. 不同领域环境中的“组分分析”

    2023-12-26 09:00:04       53 阅读
  7. 嵌入式——RTC闹钟Alarm

    2023-12-26 09:00:04       51 阅读
  8. linux 可睡眠RCU

    2023-12-26 09:00:04       44 阅读
  9. Linux 定时器介绍

    2023-12-26 09:00:04       68 阅读
  10. 简单工厂、工厂方法、抽象工厂和策略模式

    2023-12-26 09:00:04       56 阅读