61、ARM/串口通信相关学习20240415

一、串口通信:实现PC端串口助手与开发板的字符串通信。

代码:

main:

#include "uart4.h"

int main()

{

	uart4_config();

	//char a;

	char s[64];

	while (1)

	{

		//a = getchar();

		//putchar(a+1);

		gets(s);

		puts(s);

	}

		

	return 0;

}

 usrt4.c:

#include "uart4.h"

void uart4_config()
{
    //使能GPIOB\GPIOG\UART4的外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<1);
    RCC->MP_AHB4ENSETR |=(0X1<<6);
    RCC->MP_APB1ENSETR |=(0X1<<16);
    //设置GP11和PB2为管脚复用功能
    //PB2
    GPIOB->MODER &=(~(0X3<<4));
    GPIOB->MODER |=(0X2<<4);
    //PG11
    GPIOG->MODER &= (~(0X3<<22));
    GPIOG->MODER |= (0X2<<22);
    //设置PG11为UART4_TX功能
    GPIOG->AFRH &= (~(0XF<<12));
    GPIOG->AFRH |=(0X6<<12);
    //设置PB2为UART4_RX功能
    GPIOG->AFRH &= (~(0XF<<8));
    GPIOG->AFRH |= (0X8<<8);
    //设置串口不使能
    USART4->CR1 &= (~0x1);
    //设置8位数据位
    USART4->CR1 &= (~(0x1<<12));
    USART4->CR1 &= (~(0x1<<28));
    //设置没有校验位
    USART4->CR1 &= (~(0x1<<10));
    //设置时钟频率不分频
    USART4->PRESC &= (~0xf);
    //设置16倍过采样
    USART4->CR1 &= (~(0x1<<15));
    //设置1位停止位
    USART4->CR2 &= (~(0x3<<12));
    //设置波特率为115200
    USART4->BRR=0X22B;
    //使能发送器
    USART4->CR1 |= (0X1<<3);
    //使能接收器
    USART4->CR1 |= (0X1<<2);
    //使能串口
    USART4->CR1 |= (0X1<<0);

}

void putchar(char dat)
{
    while (!(USART4->ISR & (0X1<<7)));
    USART4->TDR  =  dat;
    while (!(USART4->ISR & (0X1<<7)));
}

char getchar()
{
      while (!(USART4->ISR & (0X1<<5)));
      return USART4->RDR;
}
//发送字符串
void puts(char *s)
{
    putchar('\r');
    while (1)
    {
        if(*s == '\0')
        break;
        putchar(*s);
        s++;
    }
}
//接收字符串
void gets(char *s)
{
    while (1)
    {
        *s = getchar();
        if(*s == '\r')
        break;
        putchar(*s);
        s++;
    }
    *s = '\0';
    putchar('\n');
}

运行截图:

二、根据输入的字符串 控制开发板的灯亮灭(本次只设置LED1,LED2)

main:

#include "uart4.h"





void delay_ms(int ms)

{

	int i,j;

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

	{

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

		{



		}

	}

}



int main()

{

	uart4_config();

	led_init();

	//char a;

	char s[64];

	while (1)

	{

		//a = getchar();

		//putchar(a+1);

		gets(s);

		if(!strcmp(s,"ON"))

        {

			LED1_CTRL(1);

			LED2_CTRL(1);

        }else if(!strcmp(s,"OFF"))

		{

			LED1_CTRL(0);

			LED2_CTRL(0);

		}

		puts(s);

	}

		

	return 0;

}

 surt4.c:

#include "uart4.h"

void led_init()
{
    //使能GPIO的外设时钟
    RCC_01 |= (0x3<<4);
    //设置输出
    GPIOE->MODER &= (~(0x3<<20));
    GPIOE->MODER |=  (0x1<<20);
    GPIOF->MODER &= (~(0x3<<20));
    GPIOF->MODER |=  (0x1<<20);
    GPIOE->MODER &= (~(0x3<<16));
    GPIOE->MODER |=  (0x1<<16);

    //设置默认关闭状态
   GPIOE->ODR &= (~(0x1<<10));
   GPIOF->ODR &= (~(0x1<<10));
   GPIOE->ODR &= (~(0x1<<8));
}
void LED1_CTRL(int flag)
{
    if(flag == 1)
    {
        GPIOE->ODR |= (0x1<<10);
    }else if(flag == 0)
    {
        GPIOE->ODR &= (~(0x1<<10));
    }

}

void LED2_CTRL(int flag)
{
    if(flag == 1)
    {
        GPIOF->ODR |= (0x1<<10);
    }else if(flag == 0)
    {
       GPIOF->ODR &= (~(0x1<<10));
    }

}
void uart4_config()
{
    //使能GPIOB\GPIOG\UART4的外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<1);
    RCC->MP_AHB4ENSETR |=(0X1<<6);
    RCC->MP_APB1ENSETR |=(0X1<<16);
    //设置GP11和PB2为管脚复用功能
    //PB2
    GPIOB->MODER &=(~(0X3<<4));
    GPIOB->MODER |=(0X2<<4);
    //PG11
    GPIOG->MODER &= (~(0X3<<22));
    GPIOG->MODER |= (0X2<<22);
    //设置PG11为UART4_TX功能
    GPIOG->AFRH &= (~(0XF<<12));
    GPIOG->AFRH |=(0X6<<12);
    //设置PB2为UART4_RX功能
    GPIOG->AFRH &= (~(0XF<<8));
    GPIOG->AFRH |= (0X8<<8);
    //设置串口不使能
    USART4->CR1 &= (~0x1);
    //设置8位数据位
    USART4->CR1 &= (~(0x1<<12));
    USART4->CR1 &= (~(0x1<<28));
    //设置没有校验位
    USART4->CR1 &= (~(0x1<<10));
    //设置时钟频率不分频
    USART4->PRESC &= (~0xf);
    //设置16倍过采样
    USART4->CR1 &= (~(0x1<<15));
    //设置1位停止位
    USART4->CR2 &= (~(0x3<<12));
    //设置波特率为115200
    USART4->BRR=0X22B;
    //使能发送器
    USART4->CR1 |= (0X1<<3);
    //使能接收器
    USART4->CR1 |= (0X1<<2);
    //使能串口
    USART4->CR1 |= (0X1<<0);

}

void putchar(char dat)
{
    while (!(USART4->ISR & (0X1<<7)));
    USART4->TDR  =  dat;
    while (!(USART4->ISR & (0X1<<7)));
}

char getchar()
{
      while (!(USART4->ISR & (0X1<<5)));
      return USART4->RDR;
}

//发送字符串
void puts(char *s)
{
    putchar('\r');
    while (1)
    {
        if(*s == '\0')
        break;
        putchar(*s);
        s++;
    }
}
//接收字符串
void gets(char *s)
{
    while (1)
    {
        *s = getchar();
        if(*s == '\r')
        break;
        putchar(*s);
        s++;
    }
    *s = '\0';
    putchar('\n');
}
int  strcmp(char *s,char *p)
{
    while (*s==*p && *s )
    {
        s++;
        p++;
    }
    return *s-*p;
}

 uart4.h:

#ifndef  __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
#define RCC_01 *((unsigned int*)0x50000a28)

void uart4_config();
void putchar(char dat);
char getchar();
void puts(char *s);
void gets(char *s);
int  strcmp(char *s,char *p);
void led_init();
void LED1_CTRL(int flag);
void LED2_CTRL(int flag);

#endif

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

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

相关文章

protobuf 编码原理

简介 Protocol Buffers&#xff08;protobuf&#xff09;&#xff0c;它是 Google 开发的一种数据序列化协议&#xff08;与 XML、JSON 类似&#xff09;。 优点&#xff1a; 效率高&#xff1a;Protobuf 以二进制格式存储数据&#xff0c;比如 XML 和 JSON 等文本格式更紧凑…

【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式

本插件可以使用蓝图获取到项目的一些基本配置&#xff0c;如获取&#xff1a;公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许…

CommunityToolkit.Mvvm笔记---Ioc

使用MVVM模式提高应用程序代码库中的模块化程度的最常用模式是使用某种形式的反转控制&#xff08;Ioc&#xff09;。其中最常见的解决方案是使用依赖关系注入&#xff0c;该解决方案存在于创建多个注入后端类的服务&#xff08;即以参数的形式传递给 viewmodel 构造函数&#…

携程景点详情API:电商发展新引擎,推动旅游智能化升级

随着信息技术的快速发展&#xff0c;旅游行业正迎来一场深刻的智能化升级。作为电商发展的新引擎&#xff0c;携程景点详情API以其丰富的数据资源和高效的服务能力&#xff0c;正逐渐成为推动旅游智能化升级的重要力量。本文将深入探讨携程景点详情API在电商发展中的作用&#…

xhci 数据结构

xhci 数据结构 xhci 数据结构主要在手册上有详细的定义&#xff0c;本文根据手册进行归纳总结&#xff1a; 重点关注的包括&#xff1a; device contexttrb ringtrb device context设备上下文 设备上下文数据结构由xHC管理&#xff0c;用于向系统软件报告设备配置和状态信息。…

【个人博客搭建】(2)项目分层结构

1、在解决方案这右击&#xff0c; 2、填写项目名称。&#xff08;位置使用默认即可&#xff09; 3、选择框架版本。&#xff08;最好同创建webapi一个版本吧&#xff09; 4、创建后进入该界面。会生成默认的一个Class类。&#xff08;后修改名称或删除都可&#xff09; 5、然后…

【C/C++】什么是内存泄漏?如何检测内存泄漏?

一、内存泄漏概述 1.1 什么是内存泄漏 内存泄漏是在没有自动 gc 的编程语言里面&#xff0c;经常发生的一个问题。 自动垃圾回收&#xff08;Automatic Garbage Collection&#xff0c;简称 GC&#xff09;是一种内存管理技术&#xff0c;在程序运行时自动检测和回收不再使用…

MySQL进阶-----limit、count、update优化

目录 前言 一、limit优化 1. 未优化案例 2.优化后案例 二、count优化 count用法 三、update优化 1.锁行情况&#xff08;有索引&#xff09; 2.锁表情况&#xff08;无索引&#xff09; 前言 上一期我们学习了order by优化和group by优化&#xff0c;本期我们就继续学习…

不需要GPU就可以玩转模型,同时支持本地化部署

简单一款不需要GPU就可以在Win 机器跑的模型&#xff1a;Ollama&#xff1b;用于本地运行和部署大型语言模型&#xff08;LLMs&#xff09;的开源工具 关于Ollama的简要介绍 平台兼容性&#xff1a;Ollama支持多种操作系统&#xff0c;包括macOS、Linux和Windows&#xff0c;…

Spectre漏洞 v2 版本再现,影响英特尔 CPU + Linux 组合设备

近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器“幽灵”&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

一维非线性扩展卡尔曼滤波|matlab的EKF程序|一维例程源代码

为了满足不同条件下的用途,编了一个简单的一维状态量下的EKF,后面准备出UKF和CKF的版本。 使用的系统是非线性的,以体现算法对于非线性系统的性能。(状态方程和观测方程均设计成非线性的) 程序运行截图 程序都在一个m文件里面,粘贴到matlab的编辑器就能运行,如果中文注…

vivado 写入 ILA 探针信息、读取 ILA 探针信息

写入 ILA 探针信息 “调试探针 (Debug Probes) ”窗口中的“ ILA 核 (ILA Cores) ”选项卡视图包含有关您在自己的设计中使用 ILA 核探测的 信号线的信息。此 ILA 探针信息提取自您的设计 &#xff0c; 并存储在数据文件内 &#xff0c; 此数据文件通常带有 .ltx 文件扩…

React 集成三方登录按钮样式的插件库

按钮不提供任何社交逻辑。 效果如下&#xff1a; 原地址&#xff1a;https://www.npmjs.com/package/react-social-login-buttons 时小记&#xff0c;终有成。

基于注解以及配置类使用SpringIoc

四 基于注解方式使用SpringIoc 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测到注解标记的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作。 本质上&#xff1a;所有一切的…

UML简单小结

文章目录 一、UML概述二、UML建模工具三、类图1、概念2、组成 四、类与类之间的关系1、继承2、实现3、依赖4、关联5、聚合6、组合 五、常见UML图1、用例图1&#xff09; 概念2&#xff09;组成3&#xff09;用例图所包含的的关系关联(Association)泛化(Inheritance)包含(Includ…

web笔记再整理

前四天笔记在此连接: web前端笔记表单练习题五彩导航栏练习题-CSDN博客https://blog.csdn.net/simply_happy/article/details/136917265?spm1001.2014.3001.5502 # 1.边框弧度​ div {​ width: 300px;​ height: 50px;​ background-color: aqua;​ …

sql注入之时间注入

一、时间注入 时间注入又名延时注入&#xff0c;属于盲注入的一种&#xff0c;通常是某个注入点无法通过布尔型注入获取数据&#xff0c;而采用一种突破注入的技巧。 在 mysql 里 函数 sleep() 是延时的意思&#xff0c;sleep(10)就是数据库延时 10 秒返回内容。判断注入可以使…

G2D图像处理硬件调用和测试-基于米尔-全志T113-i开发板

本篇测评由电子工程世界的优秀测评者“jf_99374259”提供。 本文将介绍基于米尔电子MYD-YT113i开发板的G2D图像处理硬件调用和测试。 MYC-YT113i核心板及开发板 真正的国产核心板&#xff0c;100%国产物料认证 国产T113-i处理器配备2*Cortex-A71.2GHz &#xff0c;RISC-V 外置…

Selenium自动化测试网页加载太慢如何解决?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 遇到网页加载慢&#xff0c;selenium运行效率降低&#xff0c;可以通过修改页面加载策略提升自动…

docker-compose yaml指定具体容器网桥ip网段subnet;docker创建即指定subnet;docker取消自启动

1、docker-compose yaml指定具体容器网桥ip网段subnet docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网&#xff0c;这时候可以更改yaml指定subnet 宿主机内网一般是192**&#xff0c;这时候容器可以指定172* version: 3.9 services:coredns:…