arm-day6控制灯

1、main.c

#include"uart4.h"

#include"led.h"

//手动封装一个延时函数

void delay_ms(int ms)

{

    int i,j;

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

    {

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

        {

        }

    }

}

int main()

{

    //led的初始化

    *((unsigned int *)0x50000A28) |=(0x3<<4);

    led1_init();

    led2_init();

    led3_init();

    //uart的初始化

    uart4_config();

    char a;

    char buf[32];

    while(1)

    {

        puts(buf);

        gets(buf);//读取字符串

       

        if(!(my_strcmp("open",buf)))//打开

        {

            led1_ctl(1);

            led2_ctl(1);

            led3_ctl(1);

        }

         else if(!(my_strcmp("close",buf)))//关闭

        {

            led1_ctl(0);

            led2_ctl(0);

            led3_ctl(0);

        }

       

        else if(!(my_strcmp("11",buf)))//流水灯

        {

            for(int i=20;i>0;i--)//20的递减,可改成while(1)成死循环流水灯

            {

            led1_ctl(1);

            led2_ctl(0);

            led3_ctl(0);

            delay_ms(500);

            led1_ctl(0);

            led2_ctl(1);

            led3_ctl(0);

            delay_ms(500);

            led1_ctl(0);

            led2_ctl(0);

            led3_ctl(1);

            delay_ms(500);

            }

        }

       

       

       

     

    }

    return 0;

}

2、led.c/uart.c

#include "led.h"

void led1_init()

{

    //输出模式的配置

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

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

    //设置管脚输出类型-推挽

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

    //设置输出速度

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

    //设置上拉电阻

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

   

}

void led2_init()

{

    //输出模式的配置

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

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

    //设置管脚输出类型-推挽

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

    //设置输出速度

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

    //设置上拉电阻

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

   

}

void led3_init()

{

    //输出模式的配置

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

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

    //设置管脚输出类型-推挽

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

    //设置输出速度

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

    //设置上拉电阻

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

   

}

//PE10的控制

void led1_ctl(int flag)

{

    if(flag==1)

    {

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

    }

    else if(flag==0)

    {

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

    }

}

//PE8的控制

void led2_ctl(int flag)

{

    if(flag==1)

    {

        GPIOE->ODR |=(0X1<<8);

    }

    else if(flag==0)

    {

        GPIOE->ODR &=(~(0X1<<8));

    }

}

//PF10的控制

void led3_ctl(int flag)

{

    if(flag==1)

    {

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

    }

    else if (flag==0)

    {

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

    }

}

#include "uart4.h"

//UART4的初始化函数

void uart4_config()

{

    //使能UART4、GPIOG\GPIOB的外设时钟

    RCC->MP_APB1ENSETR |= (0x1<<16);

    RCC->MP_AHB4ENSETR |= (0x1<<1);

    RCC->MP_AHB4ENSETR |= (0x1<<6);

    //设置PB2为复用功能

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

    GPIOB->MODER |=(0x1<<5);

    //设置PB2为UART_RX复用功能

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

    GPIOB->AFRL |=(0x1<<11);

    //设置PG11为复用功能

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

    GPIOG->MODER |=(0x1<<23);

    //设置PG11为UART_TX复用功能

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

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

    //禁用串口,UE=0

    USART4->CR1 &=(~0x1);

    //设置8位数据位

    USART4->CR1 &=(~(0x1<<12));

    USART4->CR1 &=(~(0x1<<28));

    //设置无奇偶校验

    USART4->CR1 &=(~(0x1<<10));

    //设置1位停止位

    USART4->CR2 &=(~(0x3<<12));

    //设置波特率为115200

    USART4->BRR = 0x22b;

    //设置频率不分频

    USART4->PRESC &=(~0xF);

    //设置16倍过采样倍数

    USART4->CR1 &=(~(0x1<<15));

    //使能发送器

    USART4->CR1 &=(~(0x1<<3));

    USART4->CR1 |=(0x1<<3);

    //使能接收器

    USART4->CR1 &=(~(0x1<<2));

    USART4->CR1 |=(0x1<<2);                            

    //使能串口

    USART4->CR1 |= (0x1);

}

//封装单个字符发送函数

void putchar(char c)

{

    //判断发送数据寄存器是否为空,不为空则阻塞等待

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

    //当为空时将数据写入到数据发送寄存器

    USART4->TDR=c;

    //阻塞等待数据发送完毕,函数结束

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

}

//封装单个字符接收的函数

char getchar()

{

    //判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取

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

    //将读取的数据返回

    return USART4->RDR;

}

//发送一个字符串

void puts(char *s)

{

    while(*s)

    {

        putchar(*s);

        s++;

    }

    //发送完字符串让光标显示在下一行最开头

    putchar('\n');

    putchar('\r');

}

//接收字符串

void gets(char *s)

{

    while(1)

    {

        *s=getchar();

        putchar(*s);//将读取到的字符回显到串口

        if(*s=='\r')

        {

            break;

        }

        s++;

    }

    *s='\0';//手动补上一个'\0'

    putchar('\n');//让光标显示在下一行

}

//比较函数

int my_strcmp(char* str1, char* str2)//strcmp函数具体实现。

{

    while ((*str1 != '\0') && (*str1 == *str2))//判断字符串是否结束。

    {

        str1++;

        str2++;//

    }

    int t;

    t = *str1 - *str2;//比较对应字符大小。

    return t;//若相等返回0,前者大返回正值,后者大则负。

}

3、led.h/uart.h

#ifndef __LED_H__

#define __LED_H__

#include"stm32mp1xx_gpio.h"

#include"stm32mp1xx_rcc.h"

void led1_init();

void led2_init();

void led3_init();

void led1_ctl(int flag);

void led2_ctl(int flag);

void led3_ctl(int flag);

#endif

#ifndef __UART4_H__

#define __UART4_H__

#include"stm32mp1xx_gpio.h"

#include"stm32mp1xx_rcc.h"

#include"stm32mp1xx_uart.h"

void uart4_config();

void putchar(char c);

char getchar();

void puts(char *s);

void gets(char *s);

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

#endif

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

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

相关文章

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例&#xff0c;抓取2010-2024年所有的微博数据excel&#xff0c;包含微博链接&#xff0c;微博内容&#xff0c;发布时间&#xff0c;点赞数&#xff0c;转发数&#xff0c;评论数&#xff0c;话题等。 每个月的微博转评赞总数曲线&#xff0c;2015年是高峰。 微…

Centos7静态路由和动态路由

路由&#xff0c;即路由选择&#xff08;Routing&#xff09;&#xff0c;是指在计算机网络中选择数据传输路径的过程。路由器&#xff08;Router&#xff09;是执行路由选择功能的网络设备。路由的主要目的是在复杂的网络结构中&#xff0c;选择最佳路径将数据包从源节点传递到…

Linux文件操作——标准c库对文件操作

Linux、标准c库对文件操作的区别 1.来源 从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别: open是UNIX系统调用函数 (包括LINUX等) ,返回的是文件描述符 (File Descriptor),它是文件在文件描述符表里的索引。fopen是ANSIC标准中的C语言库函数,在不同的系…

Python学习---基于TCP的模拟浏览器请求响应案例

模拟浏览器请求web服务器的网页过程&#xff0c;使用TCP实现http协议 # 1 、导入模块 import socket# 2 、创建套接字 tcp_client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 3建立连接 tcp_client_socket.connect(("www.icoderi.com", 80)) # 4…

自回归模型(二):具有自回归误差的回归

让我们考虑一个问题&#xff0c;其中我们有一个y变量和多个x变量&#xff0c;它们都被测量为时间序列。举个例子&#xff0c;我们可以将y设定为高速公路上每月的事故数量&#xff0c;而x则表示每月在高速公路上的交通量&#xff0c;观测时间为连续的120个月。一个多元&#xff…

使用 MPI 做 3D 带状矩阵的转置

目的&#xff1a;整个大矩阵从 [Nx, Ny, Nz] 转到 [Nz, Nx, Ny] 每个进程的输入&#xff1a;大矩阵的 [Nx / total_proc_num, Ny, Nz] 的部分 每个进程的输出&#xff1a;大矩阵的 [Nz / total_proc_num, Nx, Ny] 的部分 一开始我大概有一个想法&#xff0c;假设两个进程的话…

Web学习篇

(本文仅为学习记录,请不要做违法犯罪行为) 目录 一、SSH远程攻击 二、sql注入 三、xss漏洞 四、文件上传漏洞 五、文件包含漏洞 一、SSH远程攻击 攻击机:192.168.xxx.130 靶机:10.133.xxx.159(目标主机) 0、信息收集,端口扫描(发现22端口开放,尝试爆破ssh)…

java单元测试:JUnit测试框架

JUnit是Java语言中最常用的单元测试框架之一&#xff0c;用于编写和运行可重复的测试。它的主要功能是帮助开发者验证代码的正确性&#xff0c;确保代码在变更后仍然工作正常。以下是关于JUnit的详细介绍&#xff1a; 1. JUnit简介 JUnit是一个开源的单元测试框架&#xff0c…

HTTP 请求的完整过程

HTTP 请求的完整过程 当用户在浏览器输入网址回车之后&#xff0c;网络协议都做了哪些工作呢? 首先工作的是 浏览器应用程序&#xff0c;他要解析出 URL中的域名 根据域名获取对应的ip地址&#xff0c;首先从浏览器缓存中査看&#xff0c;如下可以査看浏览器中域名对应ip的解…

想当安卓开发工程师?学习路线分享!

安卓开发学习路线 在前几篇文章中,对安卓开发岗位的岗位要求做了一些科普,本节文章将介绍安卓开发岗位的学习路线。 目前,网络上有很多面经、算法题解、算法课等学习资料,如何合理利用这些资料成为技术求职者的一大困惑。笔者整理了一份安卓开发岗位学习路线供大家参考,…

(1)无线电失控保护(一)

文章目录 前言 1 何时触发失控保护 2 将会发生什么 3 接收机配置

两篇文章讲透数据结构之堆(一)!

目录 1.堆的概念 2.堆的实现方式 3.堆的功能 4.堆的声明 5.堆的实现 5.1堆的初始化 5.2堆的插入 5.2.1向上调整算法 5.2.2堆的插入 5.3堆的删除 5.3.1向下调整算法 5.3.2堆的删除 5.4获取堆顶元素 5.5获取堆的元素个数 5.6判断堆是否为空 5.7打印堆 5.8建堆 …

[BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)

第29天 盲注 基于布尔 ?id1 and length(database())7通过AND&#xff0c;当数据库名字长度等于7时返回正常页面&#xff0c;否则返回其他&#xff08;或错误&#xff09;页面 其他函数&#xff1a; left(databse(),a)&#xff1a;截取数据库名的左侧前a位字符 substr(a,b,c…

亚马逊自养号测评环境搭建技巧:打造防关联底层环境的关键步骤

今天我们要聊的是完全由人工操作的自养号方法&#xff0c;相信有过相关经验的朋友们都清楚&#xff0c;在实现自养号的过程中&#xff0c;所使用的 IP 和浏览器究竟有哪些选择&#xff0c;以及可能会遇到哪些问题。 首先&#xff0c;我们来看看市场上现有的 IP 类型以及可能出现…

[LDAP: error code 34 - invalid DN]

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.InvalidNameException: [LDAP: error code 34 - invalid DN]; nested exception is javax.naming.InvalidNameException: [LDAP: error code 34 - invalid DN]at org.s…

zabbix实现企业微信机器人推送

0、前置条件 已经申请到企业微信机器人webhook&#xff0c;参考链接https://developer.work.weixin.qq.com/document/path/91770 1、创建报警媒介类型 在报警媒介类型右上角创建媒体类型 新增Token参数&#xff0c;将申请获得的Token填入 在脚本处填入脚本&#xff1a; 脚…

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况&#xff1f;出现amtlib.dll打不开怎么办&#xff1f;这样的情况有什么解决方法呢&#xff1f;今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法&#xff1f;一起来看看amtlib.dll文件丢失会有哪些方法修复&#xff1f; a…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…

揭秘k-NN算法:简单技术背后的强大力量

近邻算法&#xff08;k-Nearest Neighbors, k-NN&#xff09;是一种基本且常用的分类与回归方法。它的主要特点是模型简单、易于理解&#xff0c;且在许多实际应用中表现良好。本文将详细介绍近邻算法的原理、实现步骤以及优缺点。 1. 原理简介 近邻算法基于一个核心思想&…