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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CGAL中三角形曲面网格近似

1、介绍 此软件包实现了变分形状近似&#xff08;VSA&#xff09;方法&#xff0c;通过更简单的表面三角形网格来近似输入表面网格。该算法的输入必须是&#xff1a; 三角形分割&#xff1b;组合2流形 输出是一个三角形汤&#xff0c;可以构建成多边形曲面网格。 给定一个输入曲…

若依SQL Server开发使用教程

1. sys_menu表中的将菜单ID修改为自动ID,解决不能增加菜单的问题&#xff0c;操作流程如下&#xff1a; 解决方案如下 菜单栏->工具->选项 点击设计器&#xff0c;去掉阻止保存要求更新创建表的更改选项&#xff0c;点确认既可以保存了 2 自动生成代码找不表的解决方案…

由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。

问题描述&#xff1a; 由于被认为是客户端对错误&#xff08;例如&#xff1a;畸形的请求语法、无效的请求信息帧或者虚拟的请求路由&#xff09;&#xff0c;服务器无法或不会处理当前请求。 在实现向数据库中添加记录时&#xff0c;请求发送无效&#xff0c;参数也未传递到控…

Java架构师系统架构需求分析实战

目录 1 导语2 需求分析实战3 核心方法论-架构立方体4 功能性模型-模块定义5 功能性模型-模块关系图6 功能性模型-模块细化 想学习架构师构建流程请跳转&#xff1a;Java架构师系统架构设计 1 导语 架构设计的实战和思维方法的讨论&#xff0c;主要聚焦于需求分析的重要性和方…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-5比例积分控制器Proportional-Intefral Controller

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-5比例积分控制器Proportional-Intefral Controller 消除稳态误差——设计新的控制器

嵌入式中一文搞定C语言数据结构--跳表

大家好&#xff0c;今天分享一篇C语言数据结构相关的文章--跳表。 1. 什么是跳表 跳表是 链表 索引 的一种数据结构 &#xff0c;是以空间换取时间的方式&#xff0c;关于跳表参考: https://baike.baidu.com/item/跳表/22819833?fraladdin 2. 跳表概念 跳表在原有链表的基…

链表的实现

单向循环链表 定义 在计算机科学中&#xff0c;链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续。 图解 链表内还有一种特殊的节点被称为哨兵&#xff08;Sentinel&#xff09;节点&#xff0c;也叫做哑元&#xff0c;它不存…

kubelet源码学习(二):kubelet创建Pod流程

本文基于Kubernetes v1.22.4版本进行源码学习 4、kubelet创建Pod流程 syncLoop()的主要逻辑是在syncLoopIteration()方法中实现&#xff0c;Pod创建相关代码只需要看处理configCh部分的代码 // pkg/kubelet/kubelet.go // 该方法会监听多个channel,当发现任何一个channel有数…

ssh工具 从ssh服务器下载文件夹

此文分享一个python脚本,用于快速的定位、选择ssh服务器上的文件夹,并将其下载到本地指定的位置。 效果演示 🔥完整演示效果 👇 第一步,显然,我们需要选择功能 👇 第二步,确认我们需要从哪个ssh服务器上下载文档 👇 第三步,定位、选择、确认需要下载的文件夹…

c 语言学习:输出阶乘的算式

c 语言学习&#xff1a;输出阶乘的算式 代码 #include "stdio.h"int fact(int num){if (num < 1){printf("1 ");return 1;} else {printf("%d x ",num);return num * fact(num-1);} }int main(){int num 10; // printf("plz inpu…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

simulink代码生成(四)——SCI发送模块(串口通信)

C2000中的SCI模块分为两种&#xff0c;一种是接收模块&#xff0c;一种是发送模块&#xff1b; 1 发送模块 发送模块如下图所示&#xff1a; SCI传输块使用指定的SCI硬件模块传输标量或矢量数据。采样率和数据类型是与输入端口一致&#xff1b; 注意&#xff1a;一个模型只能…