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

news2024/12/23 16:39:12

一、串口通信:实现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

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

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

相关文章

供应链投毒预警 | 开源供应链投毒202403月报发布啦!(含投毒案例分析)

悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;能够第一时间捕获开源组件仓库中的恶意投毒攻击。在2024年3月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff0…

golang 迷宫回溯算法(递归)

// Author sunwenbo // 2024/4/14 20:13 package mainimport "fmt"// 编程一个函数&#xff0c;完成老鼠找出路 // myMap *[8][7]int 地图&#xff0c;保证是同一个地图&#xff0c;因此是引用类型 // i,j表示对地图的哪个点进行测试 func SetWay(myMap *[8][7]int, …

学习一门语言的方法和套路(B站转述)

视频链接 up虽然长相英(ping)俊(ping)&#xff0c;但是讲的干活&#xff0c;没恰饭。 学习流程&#xff1a; 1.快速阅读&#xff0c;掌握概况 2.深入细节内容 例如&#xff1a;java (JDBC)、html 、netty 不管三七二十一&#xff0c;先了解套路&#xff0c;再深入研究。 高…

【华为】Telnet实验配置

【华为】Telnet 实验配置 应用场景三种认证方式配置注意事项拓扑无认证&#xff08;None&#xff09;交换机配置顺序Telnet ServerTelnet Client测试 密码认证&#xff08;Password&#xff09;配置顺序Telnet ServerTelnet Client测试 AAA认证&#xff08;scheme&#xff09;配…

密码学 | 椭圆曲线 ECC 密码学入门(四)

目录 正文 1 曲线方程 2 点的运算 3 求解过程 4 补充&#xff1a;有限域 ⚠️ 知乎&#xff1a;【密码专栏】动手计算双线性对&#xff08;中&#xff09; - 知乎 ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。注意&#xff0c;这篇博客与前三…

验证ElasticSearch 分词的BUG

验证ElasticSearch 分词的BUG 环境介绍 ElasticSearch 版本号: 6.7.0 BUG 重现 创建测试案例索引 PUT test_2022 {"settings": {"analysis": {"filter": {"pinyin_filter": {"type": "pinyin"}},"analy…

万界星空科技商业开源MES+项目合作+低代码平台

今天我想和大家分享的是一套商业开源的 MES制造执行管理系统。对于制造业而言&#xff0c;MES 是一个至关重要的系统&#xff0c;它可以帮助企业提高生产效率、优化资源利用、提高产品质量&#xff0c;从而增强市场竞争力。什么是 MES&#xff1f; MES 是指通过计算机技术、自动…

uniapp开发 如何获取IP地址?

一、需求 使用uniapp开发小程序时&#xff0c;需要调取【记录日活动统计】的接口&#xff0c;而这个接口需要传递一个ip给后台&#xff0c; 那么前端如何获取ip呢&#xff1f;下面代码里可以实现 二、代码实现 1.在项目的manifest.json中配置一下网络权限&#xff1a; &quo…

企业网络日益突出的难题与SD-WAN解决方案

随着企业规模的迅速扩张和数字化转型的深入推进&#xff0c;企业在全球范围内需要实现总部、分支机构、门店、数据中心、云等地点的网络互联、数据传输和应用加速。SD-WAN作为当今主流解决方案&#xff0c;在网络效率、传输质量、灵活性和成本等方面远远超越传统的互联网、专线…

C语言之探秘:访问结构体空指针与结构体空指针的地址的区别(九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

前端标记语言HTML

HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它是构建和设计网页及应用的基础&#xff0c;通过定义各种元素和属性&#xff0c;HTML使得开发者能够组织和格式化文本、图像、链接等内容。 HTML的基本结构 文档类型声明&#xff0…

Adobe Premiere 2020 下载地址及安装教程

Premiere是一款专业的视频编辑软件&#xff0c;由Adobe Systems开发。它为用户提供了丰富的视频编辑工具和创意效果&#xff0c;可用于电影、电视节目、广告和其他多媒体项目的制作。 Premiere具有直观的用户界面和强大的功能&#xff0c;使得编辑和处理视频变得简单而高效。它…

【AngularJs】前端使用iframe预览pdf文件报错

<iframe style"width: 100%; height: 100%;" src"{{vm.previewUrl}}"></iframe> 出现报错信息&#xff1a;Cant interpolate: {{vm.previewUrl}} 在ctrl文件中信任该文件就可以了 vm.trustUrl $sce.trustAsResourceUrl(vm.previewUrl);//信任…

Python基于卷积神经网络的车牌识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

qt5-按字节读取并解析含属性的xml文件

参考&#xff1a; 对XML文件读取和编辑2-QXmlStreamReader读取 - 知乎 https://zhuanlan.zhihu.com/p/358862429 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已测试通过。 问题描述 需要按字节读取一个文档&#xff0c;解析其中具有xml格式的…

【C语言回顾】数组

前言1. 数组2. 一维数组2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用2.3.1 一维数组的下标2.3.2 一维数组的输入和输出 2.4 一维数组在内存中的存储 3. 二维数组3.1 二维数组的创建3.2 二维数组的初始化3.3 二维数组的使用3.3.1 二维数组的下标3.3.2 二维数组的输…

ELK日志收集和备份填坑实战 (滞后8个小时等时区问题)

ES的备份&#xff1a;ES快照备份 根据时间&#xff0c;每天零点在Linux机器crontab来调用api接口实现快照备份&#xff0c;通过快照备份&#xff0c;可以定准恢复到某一天的日志。 现象&#xff1a;&#xff08;坑&#xff1a;但是恢复某一天日志&#xff0c;发现会少8小时的日…

暴力破解密码自动阻断

1 re模块 re 模块是 Python 中用于正则表达式操作的模块。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来表示字符串中的模式&#xff0c;并可以通过模式匹配、查找、替换等操作对文本进行高效处理。 …

【Qt】:对话框(二)

对话框 一.消息对话框&#xff08;QMessageBox&#xff09;1.自己构建2.使用静态函数构建 二.颜色对话框&#xff08;QDialog&#xff09;三.文件对话框&#xff08;QFileDialog&#xff09;四.字体对话框&#xff08;QFontDialog&#xff09;五.输入对话框&#xff08;QInputD…

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…