12.11

news2024/12/22 19:05:36

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.coloradmin.cn/o/1302524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机科学与技术认识实习【报告】

一、实习目的 此次认识实习主要面对计算机科学与技术专业的同学&#xff0c;了解专业在未来的发展趋势&#xff0c;通过观看公司的介绍视频和技术发展情况招聘信息后的感想和学习体会等多种方式&#xff0c;使我们了解本专业相关领域的发展现状&#xff0c;让我们在校园内课堂上…

(纯原创)基于JavaWeb的宠物领养商城(详细源码以及开发设计报告)

摘要 本宠物领养系统以MVC分层为原则&#xff0c;数据持久化使用Mybatis&#xff0c;数据库使用MySQL&#xff0c;这些技术目前相对比较成熟&#xff0c;方便系统的维护与扩展 商城系统包括了宠物领养、用户注册、用户登录、商品查询、商品添加到购物车、删除商品等几大功能…

Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 平衡二叉树 1.1 实现判断平衡二叉树的思路 1.2 代码实现判断平衡二叉树 2.0 二叉树的层序遍历 2.1 实现二叉树层序遍历的思路 2.2 代码实现二叉树层序遍历 3.0 …

【C语言】【数据结构】自定义类型:结构体

引言 这是一篇对结构体的详细介绍&#xff0c;这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&am…

Linux安装Nginx并部署Vue项目

今天部署了一个Vue项目到阿里云的云服务器上&#xff0c;现记录该过程。 1. 修改Vue项目配置 我们去项目中发送axios请求的文件里更改一下后端的接口路由&#xff1a; 2. 执行命令打包 npm run build ### 或者 yarn build 打包成功之后&#xff0c;我们会看到一个dist包&a…

中文语音标注工具FunASR(语音识别)

全称 A Fundamental End-to-End Speech Recognition Toolkit&#xff08;一个语音识别工具&#xff09; 可能大家用过whisper&#xff08;openAi&#xff09;&#xff0c;它【标注英语的确很完美】&#xff0c;【但中文会出现标注错误】或搞了个没说的词替换上去&#xff0c;所…

万户协同办公平台ezoffice wpsservlet接口任意文件上传漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞描述 万户ezOFFICE协同管理平台是一个综合信息基础应用平台&am…

Linux网络——高级IO

目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO&#xff1a; 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…

3.c++进阶语法函数和指针

1.函数 5&#xff1a;03 2.指针

【51单片机系列】74HC595扩展实验之使用74HC595芯片在LED点阵中显示数字

本实验实现的功能是使用74HC595芯片实在LED点阵中显示数字字符0。 要点亮多个LED灯&#xff0c;需要用到动态数码管的动态扫描原理。 首先如何点亮一行上面的多个灯或一列上面的多个灯&#xff0c;明显就是需要某行或某列有效&#xff0c;同时使多列或多行有效。比如在第一行有…

记录 | xftp远程连接两台windows

1、打开openssh 设置 -> 应用 -> 可选功能 -> 添加功能 -> OpenSSH 客户端&#xff0c;将 ssh 客户端安装将两台电脑的 ssh 开启&#xff0c;cmd 中输入 net start sshd2、配置 win10 账号密码 3、进行 xftp 连接

【Spring】@SpringBootApplication注解解析

前言&#xff1a; 当我们第一次创建一个springboot工程时&#xff0c;我们会对启动类&#xff08;xxxApplication&#xff09;有许多困惑&#xff0c;为什么只要运行启动类我们在项目中自定义的bean无需配置类配置&#xff0c;扫描就能自动注入到IOC容器中&#xff1f;为什么我…

java--LinkedList集合的底层原理

1.什么是链表&#xff1f;有啥特点&#xff1f; ①链表中的结点是独立的对象&#xff0c;在内存中是不连续的&#xff0c;每个结点包含数据值和下一个结点的地址。 ②链表的特点1&#xff1a;查询慢&#xff0c;无论查询那个数据都要从头开始找。 ③链表的特点2&#xff1a;链…

day3_qt

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

进程、容器与虚拟机的区别

进程、容器与虚拟机 参考&#xff1a;关于进程、容器与虚拟机的区别&#xff0c;你想知道的都在这&#xff01; 进程、容器与虚拟机的结构图 进程 介绍 进程是一个正在运行的程序&#xff0c;它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候&#xf…

安装Anconda时出现Failed to extract packages的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法 1. 问题所示 在win7安装Anconda的时候&#xff0c;出现Failed to extract packages 截图如下所示&#xff1a; 2. 原理分析 该版本过于新&#xff0c;无法兼容win7系统&#xff0c;要么更换系统 要么将anconda版本降低即可 3. 解决…

基于SSM超市订单管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

计算机二级Python基本操作题-序号46

Python 函数查询 1. 《卖火柴的小女孩》是丹麦童话故事作家安徒生的一篇童话故事&#xff0c;发表于1846年。主要讲了一个卖火柴的小女孩在富人阖家欢乐、举杯共庆的大年夜冻死在街头的故事。这里给出《卖火柴的小女孩》的一个网络版本文件&#xff0c;文件名为“小女孩.txt”…

IOday8作业

使用消息队列完成两个进程之间相互通信(多进程) #include<myhead.h>//定义结构体 struct buf {long mtype;char mtest[1024]; };#define SIZE (sizeof(struct buf)-sizeof(long))//进程 int main(int argc, const char *argv[]) {//创建keykey_t key1 ftok("/&quo…

关于北京医学sci论文翻译

在医学领域&#xff0c;翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨&#xff0c;同时也需要考虑到医学领域的特殊性和复杂性。那么&#xff0c;如何翻译医学论文呢&#xff1f;北京医学SCI论文翻译哪家好呢&#xff1f; 首先&#xff0c;需要具备专业的…