12.11

1.q,w,e亮led1,2,3;

    a,s,d灭led1,2,3;

main.c

#include "uar1.h"

#include "led.h"

void delay(int ms)

{

  int i,j;

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

  {

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

  }

}

int main()

{

	//1.串口的初始化

	uart4_init();

  //LED初始化

  all_led_init();

	char a;

	//现象是发送一个a串口工具打印一个b

	while(1)

	{

		//2.从串口读取一个字符

		a=mygetchar();

		//3.将读取到的字符+1发送回去

		myputchar(a);

    

    switch (a)

    {

      case 'q': led1_on();

      break;

      case 'w': led2_on();

      break;

      case 'e': led3_on();

      break;

      case 'a': led1_off();

      break;

      case 's': led2_off();

      break;

      case 'd': led3_off(); 

      break;   

    }

  }

	return 0;

}

led.h

#ifndef __LED_H__
#define __LED_H__
 
typedef struct
{
    unsigned int moder;
    unsigned int otyper;
    unsigned int ospeedr;
    unsigned int pupdr;
    unsigned int idr;
    unsigned int odr;
    unsigned int bsrr;
} gpio_t1;
 
 
#define GPIOE1 ((gpio_t1 *)0X50006000)
#define GPIOF1 ((gpio_t1 *)0X50007000)
#define RCC_MP_AHB4ENSETR (*(unsigned int *)0X50000a28)
void all_led_init();
void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();
 
#endif

uar1.h

#ifndef __UART_H__
#define __UART_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
void uart4_init();
void myputchar(char i);
char mygetchar();
#endif

led.c

#include "led.h"
void all_led_init()
{
  // 1.使能外设时钟
  RCC_MP_AHB4ENSETR |= (0x3 << 4);
  // 2.设置PF10 PE10 PE8为输出输出
  GPIOE1->moder &= (~(0x3 << 20));
  GPIOE1->moder |= (0x1 << 20);
  GPIOF1->moder &= (~(0x3 << 20));
  GPIOF1->moder |= (0x1 << 20);
  GPIOE1->moder &= (~(0x3 << 16));
  GPIOE1->moder |= (0x1 << 16);
  // 3.设置推挽输出
  GPIOE1->otyper &= (~(0x1 << 10));
  GPIOF1->otyper &= (~(0x1 << 10));
  GPIOE1->otyper &= (~(0x1 << 8));
  // 4.设置输出速度为低速
  GPIOE1->ospeedr &= (~(0x3 << 20));
  GPIOF1->ospeedr &= (~(0x3 << 20));
  GPIOE1->ospeedr &= (~(0x3 << 16));
  // 5.设置无上拉下拉
  GPIOE1->pupdr &= (~(0x3 << 20));
  GPIOF1->pupdr &= (~(0x3 << 20));
  GPIOE1->pupdr &= (~(0x3 << 16));
}
 
void led1_on()
{
 
  GPIOE1->odr |= (0x1 << 10);
}
void led2_on()
{
 
  GPIOF1->odr |= (0x1 << 10);
}
void led3_on()
{
 
  GPIOE1->odr |= (0x1 << 8);
}
 
void led1_off()
{
  GPIOE1->odr &= (~(0x1 << 10));
}
void led2_off()
{
  GPIOF1->odr &= (~(0x1 << 10));
}
void led3_off()
{
  GPIOE1->odr &= (~(0x1 << 8));
}

uar1.c

#include"uar1.h"

 
//串口数据初始化
void uart4_init()
{
    //设置UART4的RCc时钟使能
    //RCC_MP_APB1ENSETR[16]->1
    RCC->MP_APB1ENSETR |= (0x1<<16);
    //设置GPIOB和GPIOG的时钟使能
    //RCC_MP_AHB4ENSETR[6]->1
    //RCC_MP_AHB4ENSETR[1]->1
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |= (0X1<<6);
    //设置PG11和PB2功能复用为UART4功能
    //PG11
    //GPIOG_MODER[23:22]->10
    GPIOG->MODER &= (~(0X3<<22));
    GPIOG->MODER |= (0X2<<22);
    //GPIOG_AFRH[15:12]->0110    
    GPIOG->AFRH &= (~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);
    //PB2
    //GPIOB_MODER[5:4]->10
    //GPIOB_AFRL[11:8]->1000
    GPIOB->MODER &= (~(0x3<<4));
    GPIOB->MODER |= (0X2<<4);
    GPIOB->AFRL &= (~(0xF<<8));
    GPIOB->AFRL |= (0x8<<8);
    //禁用串口
    USART4->CR1 &=(~0x1);
    //设置数据8个数据位 CR1[28]->0  CR1[12]-》0
    USART4->CR1 &= (~(0X1<<28));
    USART4->CR1 &= (~(0X1<<12));
    //设置没有校验位CR1[10]->0
    USART4->CR1 &= (~(0X1<<10));
    //设置1个停止位CR2[13:12]->00
    USART4->CR2 &= (~(0x3<<12));
    //设置16倍采样 CR1[15]->0
    USART4->CR1 &= (~(0X1<<15));
    //设置波特率为115200 BRR=0X22B
    USART4->BRR |= 0X22B;
    //设置1分频 PRESC[3:0]->0000
    USART4->PRESC &= (~(0XF));
    //使能发送器 CR1[3]->1
    USART4->CR1 |= (0X1<<3);
    //使能接收器 CR1[2]->1
    USART4->CR1 |= (0X1<<2);
    //使能串口 CR1[0]->1
    USART4->CR1 |= (0X1);
}
//封装函数发送一个字符数据
void myputchar(char c)
{
    //判断发送数据寄存器有没有数据,没有数据时可以发送
    while(!(USART4->ISR&(0X1<<7)));
    USART4->TDR=c;//将要发送的数据保存在发送寄存器中
    while(!(USART4->ISR&(0X1<<6)));//数据传输完成,函数结束
}
char mygetchar()
{
    char c;
    //判断是否有数据准备好
    while(!(USART4->ISR&(0X1<<5)));//数据传输完成,函数结束
    c=USART4->RDR;
    return c;
 
}

2.字符串点亮

uar1.c

#include"uar1.h"
#include"led.h"
char buf[51]={0};
//串口数据初始化
void uart4_init()
{
    //设置UART4的RCc时钟使能
    //RCC_MP_APB1ENSETR[16]->1
    RCC->MP_APB1ENSETR |= (0x1<<16);
    //设置GPIOB和GPIOG的时钟使能
    //RCC_MP_AHB4ENSETR[6]->1
    //RCC_MP_AHB4ENSETR[1]->1
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |= (0X1<<6);
    //设置PG11和PB2功能复用为UART4功能
    //PG11
    //GPIOG_MODER[23:22]->10
    GPIOG->MODER &= (~(0X3<<22));
    GPIOG->MODER |= (0X2<<22);
    //GPIOG_AFRH[15:12]->0110    
    GPIOG->AFRH &= (~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);
    //PB2
    //GPIOB_MODER[5:4]->10
    //GPIOB_AFRL[11:8]->1000
    GPIOB->MODER &= (~(0x3<<4));
    GPIOB->MODER |= (0X2<<4);
    GPIOB->AFRL &= (~(0xF<<8));
    GPIOB->AFRL |= (0x8<<8);
    //禁用串口
    USART4->CR1 &=(~0x1);
    //设置数据8个数据位 CR1[28]->0  CR1[12]-》0
    USART4->CR1 &= (~(0X1<<28));
    USART4->CR1 &= (~(0X1<<12));
    //设置没有校验位CR1[10]->0
    USART4->CR1 &= (~(0X1<<10));
    //设置1个停止位CR2[13:12]->00
    USART4->CR2 &= (~(0x3<<12));
    //设置16倍采样 CR1[15]->0
    USART4->CR1 &= (~(0X1<<15));
    //设置波特率为115200 BRR=0X22B
    USART4->BRR |= 0X22B;
    //设置1分频 PRESC[3:0]->0000
    USART4->PRESC &= (~(0XF));
    //使能发送器 CR1[3]->1
    USART4->CR1 |= (0X1<<3);
    //使能接收器 CR1[2]->1
    USART4->CR1 |= (0X1<<2);
    //使能串口 CR1[0]->1
    USART4->CR1 |= (0X1);
}
//封装函数发送一个字符数据
void myputchar(char c)
{
    //判断发送数据寄存器有没有数据,没有数据时可以发送
    while(!(USART4->ISR&(0X1<<7)));
    USART4->TDR=c;//将要发送的数据保存在发送寄存器中
    while(!(USART4->ISR&(0X1<<6)));//数据传输完成,函数结束
}
char mygetchar()
{
    char c;
    //判断是否有数据准备好
    while(!(USART4->ISR&(0X1<<5)));//数据传输完成,函数结束
    c=USART4->RDR;
    return c;

}

//输出一个字符串
void puts(char *s)
{
   while(*s)
   {
    myputchar(*s);
    s++;
   }
   myputchar('\n');//切换到下一行
   myputchar('\r');//切换到一行的开头
}

//读取一个字符串
char *gets()
{
    unsigned int i;
    for(i=0;i<50;i++)
    {
        buf[i]=mygetchar();//接受字符串
        myputchar(buf[i]);//回显
        if(buf[i]=='\r')
        break;
    }
    buf[i]='\0';
    myputchar('\n');//换行
    return buf;
}
//字符串比较
int strcmp(char *str,char *dst)
{
    while(*str)
    {
        if(*str != *dst)
        {
            return 1;
        }   
        str++;
        dst++;          
    }
    return 0;
}
void deal(char*str)
{
    if(strcmp(str,"led1_on")==0)
    {
        led1_on();
    }
    else if(strcmp(str,"led1_off")==0)
    {
        led1_off();
    }
    else if(strcmp(str,"led2_on")==0)
    {
        led2_on();
    }
    else if(strcmp(str,"led2_off")==0)
    {
        led2_off();
    }
    else if(strcmp(str,"led3_on")==0)
    {
        led3_on();
    }
    else if(strcmp(str,"led3_off")==0)
    {
        led3_off();
    }
}

 main.c

#include "uar1.h"

#include "led.h"

void delay(int ms)

{

  int i,j;

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

  {

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

  }

}

int main()

{

   all_led_init();

    //1.串口的初始化

    uart4_init();



    char a;

    char *str;

    //现象是发送一个a串口工具打印一个b

    while(1)

    {

        myputchar('\n');//切换到下一行

        myputchar('\r');//切换到一行的开头

        //2.从串口读取一个字符

        //a=mygetchar();

        //3.将读取到的字符+1发送回去

        //myputchar(a+1);

        str=gets();

       // puts(str);

       deal(str);

       

    }

    return 0;

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/236711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红队攻防实战之Redis-RCE集锦

心若有所向往&#xff0c;何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379&#xff0c;尝试Redis弱口令或未授权访问 尝试进行连接Redis&#xff0c;连接成功&#xff0c;存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …

透析跳跃游戏

关卡名 理解与贪心有关的高频问题 我会了✔️ 内容 1.理解跳跃游戏问题如何判断是否能到达终点 ✔️ 2.如果能到终点&#xff0c;如何确定最少跳跃次数 ✔️ 1. 跳跃游戏 leetCode 55 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表…

[MySQL]SQL优化之索引的使用规则

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引失效 &#x1f4d5;最左前缀法则 &#x1f4d5;范围查询> &#x1f4d5;索引列运算&#xff0c;索引失效 &#x1f4d5;前模糊匹配 &#x1f4d5;or连接的条件 &#x1f4d5;字符串类型不加 …

C语言中的一维数组与二维数组

目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建&#xff1f; int count…

计算机丢失msvcp140dll怎么恢复?快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140dll丢失”。msvcp140.dll是一个动态链接库文件&#xff0c;它包含了许多C标准库函数的实现。这些动态链接库文件是程序运行所必需的&#xff0c;它们包含了许多函数和资源&#xf…

spring结合设计模式之策略模式

策略模式基本概念&#xff1a; 一个接口或者抽象类&#xff0c;里面两个方法&#xff08;一个方法匹配类型&#xff0c;一个可替换的逻辑实现方法&#xff09;不同策略的差异化实现(就是说&#xff0c;不同策略的实现类) 使用策略模式替换判断&#xff0c;使代码更加优雅。 …

Guava反射工具详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Java反射&#xff0c;特别是在Guava这个强大的库中&#xff0c;它是怎么让反射变得更简单&#xff0c;更有趣的。咱们都知道&#xff0c;反射在Java中是个相当强大的特性&#xff0c;它允许程序在运…

AcWing 95. 费解的开关(递推)

题目链接 活动 - AcWing 本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向有一定编程基础的同学。https://www.acwing.com/problem/content/97/ 题解 只要第一行开关的状态确定&#xff0c;则所有开关的状态都可以被推出来。第一行开关总共有种操…

从零开始学R语言?这个网站帮你快速入门,成为数据分析高手!

介绍&#xff1a;R语言&#xff0c;全称The R Programming Language&#xff0c;是一种属于GNU系统的自由、免费、源代码开放的软件。它主要被用于统计计算和统计制图&#xff0c;因此&#xff0c;它是统计分析和数据可视化的优秀工具。 R语言的特点丰富多样。首先&#xff0c;…

入职字节外包一个月,我离职了。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

AWS攻略——使用Public NAT解决私有子网实例访问互联网

文章目录 创建NAT网关编辑Private子网路由测试知识点参考资料 在《AWS攻略——子网》一文中&#xff0c;我们分别创建了一个Public子网和一个Private子网&#xff0c;并让Public子网中的实例可以SSH登录到Private子网的实例中。 现实场景中&#xff0c;我们可能存在如下需求&a…

用微元思想求解三重积分——基于Matlab

仅作自己学习使用 1. 题目 求解下列三重积分&#xff0c;其中A&#xff0c;μ&#xff0c;r都是常数。 求解的准确性可以用下式进行评估&#xff1a; 听过考研数一张宇课程的朋友应该指导&#xff0c;求解三重积分就是就一个面包&#xff0c;我们将面包无限细分为一个小块&a…

Python常见面试知识总结(二):数据结构、类方法及异常处理

【十三】Python中assert的作用&#xff1f; Python中assert&#xff08;断言&#xff09;用于判断一个表达式&#xff0c;在表达式条件为 f a l s e false false的时候触发异常。 断言可以在条件不满足程序运行的情况下直接返回错误&#xff0c;而不必等待程序运行后出现崩溃…

2023最新版JavaSE教程——第10天:多线程

目录 一、相关概念1.1 程序、进程与线程1.2 查看进程和线程1.3 线程调度1.4 多线程程序的优点1.5 补充概念1.5.1 单核CPU和多核CPU1.5.2 并行与并发 二、创建和启动线程2.1 概述2.2 方式1&#xff1a;继承Thread类2.3 方式2&#xff1a;实现Runnable接口2.4 变形写法2.5 对比两…

OpenAI接口调用示例

最近为公司做了一个ChatGPT工具&#xff0c;这里展示一下OpenAI接口的调用 前提条件 访问OpenAI官网&#xff08;国内需要翻墙&#xff09;的账号&#xff0c;需要sk 地址&#xff1a;https://platform.openai.com 依赖 使用开源工具调用OpenAI接口&#xff0c;依赖如下&am…

使用yum/dnf管理软件包

本章主要介绍使用 yum 对软件包进行管理。 yum 的介绍搭建yum源创建私有仓库yum客户端的配置yum的基本使用使用第三方yum源 使用rpm安装包时经常会遇到一个问题就是包依赖&#xff0c;如下所示。 [rootrhel03 ~]# rpm -ivh /mnt/AppStream/Packages/httpd-2.4.37-41.modulee…

mysql原理--B+树索引

1.没有索引的查找 1.1.在一个页中的查找 (1). 以主键为搜索条件 可以在 页目录 中使用二分法快速定位到对应的槽&#xff0c;然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 (2). 以其他列作为搜索条件 这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录&am…

Python爬虫实战之爬取京东商品数据并实实现数据可视化

文章目录 一、开发工具二、环境搭建三、原理简介四、数据可视化关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 …

《人工智能导论》知识思维导图梳理【1~5章节】

文章目录 说明第一章 绪论人工只能概述 第二章 知识表示和知识图谱一阶谓词逻辑和知识表示法产生式表示和框架表示法 第三章 确定性推理方法推理的基本概念自然演绎推理归结演绎推理谓词公式化子句集鲁宾孙归结原理归结反演归结反演求解问题 第四章 不确定性推理方法似然推理可…