2023/12/25日作业

串口通信

成果图

头文件uart4.h

#ifndef __UART4_H__

#define __UART4_H__

#include "stm32mp1xx_rcc.h"

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_uart.h"

//灯初始化

void led_init();

//灯1

void led_1_on();

void led_1_off();

//灯2

void led_2_on();

void led_2_off();

//风扇

void staff_on();

void staff_off();

int my_strcmp(char *str1,char *str2);

void uart4_config();

void putchar(char a);

void puts(char *s);

char getchar();

void gets(char *s);

#endif

                                                         函数库文件

=============================uart4.c=======================================

#include "uart4.h"

void uart4_config()

{

    // PG11 50008000

    // PB2  50003000

//使能gpiob\GPIOG\UART4

    RCC->MP_AHB4ENSETR |= (0X1 << 1);//GPIOB

    RCC->MP_AHB4ENSETR |= (0X1 << 6);//GPIOG

    RCC->MP_APB1ENSETR |= (0X1 << 16);//UART4

    // PG11

    GPIOG->MODER &= (~(0x3 << 22));

    GPIOG->MODER |= (0x2 << 22);

    GPIOG->AFRH &= (~(0xf << 12));

    GPIOG->AFRH |= (0x6 << 12);

    // PB2

    GPIOB->MODER &= (~(0x3 << 4));

    GPIOB->MODER |= (0x2 << 4);

    GPIOB->AFRL &= (~(0xf << 8));

    GPIOB->AFRL |= (0x8 << 8);

    // 禁用串口

    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);

}

int my_strcmp(char *str1,char *str2)

{

    int i=0;

    while (*(str1+i)==*(str2+i))

    {

        if(*(str1+i)=='\0')

        {

            break;

        }

        i++;

    }

    return *(str1+i)-*(str2+i);

}

void putchar(char a)

{

    while (!(USART4->ISR & (0x1 << 7)));

    USART4->TDR = a;

    while (!(USART4->ISR & (0x1 << 6)));

}

void puts(char *s){

     while(*s)

     {

        putchar(*s);

        s++;

     }

     

     putchar('\r');

        putchar('\n');

}

char getchar()

{

    char a;

    //1.判断数据

    while (!(USART4->ISR & (0x1 << 5)));

    //2.读取数据

    a = USART4->RDR;

    return a;

}

void gets(char *s)

{

   while(1)

   {

      *s=getchar();

      putchar(*s);

      if(*s=='\r')

      {

        break;

      }

      s++;

   }

   *s='\0';

   putchar('\n');

}

====================led.c=================================================

#include "uart4.h"

void led_init()

{

    //LED 1 PE10或风扇 PE9

    RCC->MP_AHB4ENSETR |=(0x3<<4) ;

    //LED 2 PF10

    RCC->MP_AHB4ENSETR |=(0x3<<5) ;

    //LED1 PE10

    GPIOE->MODER &=(~(0x3)<<20);

    GPIOE->MODER |=((0x1)<<20);

    GPIOE->OTYPER &=(~(0x1<<10));

    GPIOE->OSPEEDR &=(~(0x3)<<20);

    GPIOE->PUPDR &=(~(0x3)<<20);

    //LED2 PF10

    GPIOF->MODER &=(~(0x3)<<20);

    GPIOF->MODER |=(0x1)<<20;

    GPIOF->OTYPER &=(~(0x1<<10));

    GPIOF->OSPEEDR &=(~(0x3)<<20);

    GPIOF->PUPDR &=(~(0x3)<<20);

    //风扇 PE9

    GPIOE->MODER &=(~(0x3)<<18);

    GPIOE->MODER |=((0x1)<<18);

    GPIOE->OTYPER &=(~(0x1<<9));

    GPIOE->OSPEEDR &=(~(0x3)<<18);

    GPIOE->PUPDR &=(~(0x3)<<18);    

}

//PE10

void led_1_on(){

   

GPIOE->ODR |=((0x1)<<10);

}

void led_1_off(){

GPIOE->ODR &=(~(0x1<<10));

}

//PF10

void led_2_on(){

GPIOF->ODR |=((0x1)<<10);

}

void led_2_off(){

GPIOF->ODR &=(~(0x1<<10));

}

//PE9

void staff_on(){

GPIOE->ODR |=((0x1)<<9);

}

void staff_off(){

GPIOE->ODR &=(~(0x1<<9));

}

==========================main 函数========================================

#include "gpio.h"

#include "uart4.h"

int main()

{

   

    char buf[128];

   

    uart4_config();

    led_init();

    while (1)

    {

     

   

        gets(buf);

       

        puts(buf);

        if(my_strcmp(buf,"led_1_on")==0)

        {

        led_1_on();

        }else if(my_strcmp(buf,"led_1_off")==0)

        {

            led_1_off();

        }else if(my_strcmp(buf,"led_2_on")==0)

        {

            led_2_on();

        }

        else if(my_strcmp(buf,"led_2_off")==0)

        {

            led_2_off();

        }

        else if(my_strcmp(buf,"staff_on")==0)

        {

            staff_on();

        }

        else if(my_strcmp(buf,"staff_off")==0)

        {

            staff_off();

        }

        else if(my_strcmp(buf,"quit")==0||my_strcmp(buf,"Quit")==0){

              break;

        }  

    }

   

    return 0;

}

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

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

相关文章

vue 项目/备案网页/ip网页打包成 apk 安装到平板/手机(含vue项目跨域代理打包成apk后无法访问接口的解决方案)

下载安装HBuilder X编辑器 https://www.dcloud.io/hbuilderx.html 新建 5APP 项目 打开 HBuilder X&#xff0c;新建项目 此处项目名以 ‘test’ 为例 含跨域代理的vue项目改造 若 vue 项目中含跨域代理&#xff0c;如 vue.config.js module.exports {publicPath: "./&…

C语言中关于if else的理解

if else我们可以理解为 if(条件1) //如果条件1成立 语句1&#xff1b; //执行语句1 else //如果条件1不成立 语句2; //执行语句2 这是一个经典的if els…

智慧幼儿园视频监管方案及实施建议:AI智能技术构建新引擎

一、背景需求 随着科技的快速发展&#xff0c;智慧化监管已成为幼儿园管理的重要趋势。智慧幼儿园监管解决方案通过引入先进的技术手段&#xff0c;提高幼儿园的管理效率&#xff0c;保障幼儿的安全与健康&#xff0c;为家长提供更便捷的服务。为了保障幼儿的安全&#xff0c;…

使用TLS/SSL Pinning保护安卓应用程序

使用TLS/SSL Pinning保护安卓应用程序 在现代术语中&#xff0c;“SSL”&#xff08;安全套接层&#xff09;通常指的是“TLS”&#xff08;传输层安全&#xff09;。虽然 SSL 和 TLS 不是同一个东西&#xff0c;但 TLS 是 SSL 的改进和更安全的版本&#xff0c;并且在实践中已…

git命令和docker命令

1、git git是分布式的版本控制工具 git可以通过本地仓库管理文件的历史版本记录 # 本地仓库操作的命令 # 初始化本地库 git init # 添加文件到暂存区 git add . git checkout 暂存区要撤销的文件名称 # 提交暂存区文件 git commit -m 注释# 版本穿梭 # 查看提交记录 git log…

SOLIDWORKS Plastics基础功能详解(二)

浇口顾问 浇口顾问可迭代确定填充型腔所需的最佳注塑位置数量&#xff08;最多 10 个&#xff09;。 位置数量的默认值为自动&#xff0c;这将激活用于查找最佳注塑位置数量的迭代方法。要指定注塑位置的自定义数量&#xff0c;请选择用户定义。 具有压力相关粘度的材料 填充和…

走向边缘智能,美格智能携手阿加犀成功在高算力AI模组上运行一系列大语言模型

近日&#xff0c;美格智能发挥软硬件一体协同开发能力&#xff0c;融合阿加犀卓越的AI优化部署技术&#xff0c;在搭载高通QCS8550平台的高算力AI模组上&#xff0c;成功运行了一系列大语言模型&#xff0c;包括LLaMA-2、通义千问Qwen、百川大模型、RedPajama、ChatGLM2、Vicun…

Linux驱动

字符设备驱动模型 在字符设备中使用struct cdev这种结构来描述设备。 应用程序&#xff1a;读写文件&#xff0c;点灯&#xff1b;获取按键。用一些接口调用驱动程序去实现一些引用。 open这些函数&#xff0c;是C库实现的。从而进入内核&#xff0c;C库怎么进入内核&#xf…

【开源】基于JAVA语言的企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

【大厂面试】之 美团(一面经含答案)

美团 一面 tcp三次握手&#xff0c;四次挥手。time-wait、close-wait状态。MSL代表什么&#xff1f;为什么time-wait是2MSL&#xff0c;可不可以更长&#xff1f;如果不设置time-wait有什么影响 time-wait是主动关闭方的一个状态&#xff1b;close-wait是被动关闭方的一个状态…

微擎模块 出现Error: template source ‘common/message’ is not exist!解决方法

今天有会员反馈微课堂分销中心打不开&#xff0c;错误提示模板找不到&#xff1a;Error: template source ‘common/message’ is not exist!&#xff0c;看了下这模板应该微擎框架通用的&#xff0c;进公众号会员管理-会员中心网址居然也打不开&#xff0c;提示一样的错误&…

多播ip地址配置和通信理解

经常有朋友问&#xff0c;为什么相同局域网的ip需要相同网段&#xff0c;为什么组播的网段可以不同&#xff1f; 比如&#xff1a; 在您的局域网&#xff08;192.168.1.0/24 网段&#xff09;中设置多播组时&#xff0c;您可以选择一个在本地网络范围内尚未使用的多播组地址。…

绿色装配式建筑——气膜建筑

伴随新时代的到来和发展理念的深入实施&#xff0c;装配式绿色建筑已经成为建筑业发展的主流趋势。本文将深入分析气膜建筑&#xff0c;采用绿色建筑技术和装配式的建筑模式&#xff0c;形成了一套完善的建筑体系。 气膜建筑以气膜结构为主体&#xff0c;采用新型高强度柔性薄膜…

批量归一化

目录 一、BN层介绍 1、深层神经网络存在的问题 2、批量归一化的解决方案 3、BN层作用位置 4、BN层在做什么 5、总结 二、批量归一化从零实现 1、实现批量归一化操作 2、创建BN层 3、对LeNet加入批量归一化 4、开始训练 三、简明实现 1、对LeNet加入批量归一化 2…

【Spring实战】02 配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

电商数据分析-01-电商数据分析指标

电商数据指标 电商数据分析涉及多个指标&#xff0c;这些指标可以帮助企业了解其业务表现、用户行为和市场趋势。以下是一些常见的电商数据分析指标&#xff1a; 销售指标&#xff1a; 总销售额&#xff08;GMV&#xff09;&#xff1a; 衡量特定时期内所有销售交易的总值。 平…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢&#xff0c;就是不管算法竞赛还是找工作笔试面试&#xff0c;都是非常爱问爱考的&#xff0c;其实也是因为这个算法比较难懂&#xff0c;其实就是很难&#xff0c;所以非常个…

【环境配置】虚拟环境配置

创建虚拟环境 conda create -n pytorch python3.9安装成功提示 激活虚拟环境 activate pytorch安装pytorch 查看 python 版本——python 退出 python——exit() 对照 python 与 pytorch 的对应关系 pytorch 地址&#xff1a; https://pytorch.org/get-started/previous-…

Python in Visual Studio Code 2023年12月发布

作者&#xff1a;Courtney Webster 排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 12 月发布&#xff01; 此版本包括以下公告&#xff1a; 可配置的调试选项已添加到“运行”按钮菜单可以使用 Pylance 显示类型层次…