day6:STM32MP157——串口通信实验

news2024/11/16 0:00:04

使用的是cortex A7内核

【串口通信的工作原理】

本次实验使用的是uart4的串口,分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道,他们分别对应着芯片的PG11和PB2

从引脚名字也可以知道使用了GPIO口,所以本次实验同样需要使用到GPIO模块。再加上uart模块和RCC使能模块。所以本次实验一共需要使用到三个模块。基本工作框图如下:

【RCC使能】

通过芯片手册可以知道RCC对GPIO使能使用的是AHB总线,对UART使能是通过APB1总线

再在芯片手册中直接查询这两个总线的寄存器即可知道需要对哪一位数据进行修改进行使能

具体使能操作情况如下

    //使能GPIOB,GPIOG,UART4
    RCC->MP_AHB4ENSETR |= (0x1 << 1);
    RCC->MP_AHB4ENSETR |= (0x1 << 6);
    RCC->MP_APB1ENSETR |= (0x1 << 16);

【GPIO功能复用】

通过查询芯片手册可知,只需要对GPIO的AFRL或者AFRH寄存器进行修改即可。

端口复用寄存器存在两个的原因:

对端口的复用需要4位,而每个寄存器只有32位,所以每个端口复用寄存器只能操作8个GPIO口。但是每个口都有16个,所以需要两个端口复用寄存器来分别控制低8位口和高8位口,AFRL就操作0-7这8个,AFRH就操作8-15这8个口

所以本次使用的两个口PB2和PG11分别要修改的寄存器为GPIOB_AFRL和AFRHG_AFRH寄存器,再根据寄存器的结构便可以知道要修改的是哪几位。

现在我们知道了需要设置哪几位,但是设置成什么数字并不知道,继续查询芯片手册,我们需要把它复用成uart4的模式。

从上面这两张表就可以知道,只需要把PG11对应的几位设置成AF6,把PB2对应的几位设置成AF8即可,至此GPIO口的uart4复用功能就实现了。

【UART模块设置】

对uart模块的设置相对繁琐,具体分为以下几步:

1、设置数据长度为8

2、设置16位过采样

3、设置不需要校验位

4、设置1位停止位

5、设置不分频

6、设置波特率

7、对发送器、接收器、串口分别进行使能

对上面三张图的寄存器的对应位进行修改即可实现上述七个步骤。

值得一提的是在对BRR进行波特率设置的时候可以通过直接赋值的方式直接设置波特率,但是这个需要设置的值收到过采样频率的影响,由于8倍的过采样频率过于复杂,本次实验采用16倍采样频率,具体公式如下:

设置值 = 模块工作频率(HZ)/ 要设置的波特率(bit/s)

对uart模块进行读写操作的步骤

1、判断是否有数据需要读取或写入(对USART_ISR寄存器相应的位进行判断)

2、将需要读取的数据放入读取寄存器中(数据会存储在USART_RDR寄存器等待用户读取)

3、将需要发送的数据放入写寄存器中(将数据直接写入USART_TDR寄存器即可发送数据)

【代码】

在了解了以上串口工作原理之后就可以开始编写代码了。本次代码结合了昨天的led模块,实现了串口对灯的控制。具体功能见视频:

https://blink.csdn.net/details/1666295?spm=1001.2014.3001.5501

具体代码如下:

main.c

#include "uart4.h"

#include "led.h"



void delay(int ms)

{

	int i,j;

	for(i=ms;i>0;i--)

	{

		for(j=2000;j>0;j--)

		{}

	}

}



int main()

{

	uart4_init();

	led_init();

	// char i;

	char buf[30];

	while(1)

	{

		// i = getchar();

		// putchar(i + 1);

		gets(buf);

		if(strcmp(buf,"led1 on")==0)

		{

			led1_on();

			puts("exec success\r\n");

		}

		else if(strcmp(buf,"led1 off")==0)

		{

			led1_off();

			puts("exec success\r\n");

		}

		else if (strcmp(buf, "led2 on") == 0)

		{

			led2_on();

			puts("exec success\r\n");

		}

		else if (strcmp(buf, "led2 off") == 0)

		{

			led2_off();

			puts("exec success\r\n");

		}

		else if (strcmp(buf, "led3 on") == 0)

		{

			led3_on();

			puts("exec success\r\n");

		}

		else if (strcmp(buf, "led3 off") == 0)

		{

			led3_off();

			puts("exec success\r\n");

		}

		else

		{

			puts("error cmd\r\n");

		}

		

	}

	return 0;

}

uart4.c

#include "uart4.h"


void uart4_init()
{
    //使能GPIOB,GPIOG,UART4
    RCC->MP_AHB4ENSETR |= (0x1 << 1);
    RCC->MP_AHB4ENSETR |= (0x1 << 6);
    RCC->MP_APB1ENSETR |= (0x1 << 16);
    //设置pb2和pg11的管脚复用pb2/pg11
    GPIOB->MODER &= ~(0x3 << 4);
    GPIOG->MODER &= ~(0x3 << 22);
    GPIOB->MODER |= (0x1 << 5);
    GPIOG->MODER |= (0x3 << 23);

    GPIOB->AFRL &= ~(0xf << 8);
    GPIOB->AFRL |= (0x1 << 11);
    GPIOG->AFRH &= ~(0xf << 12);
    GPIOG->AFRH |= (0x3 << 13);

    //设置串口不使能,ue=0
    USART4->CR1 &= (~(0x1));
    //设置8位数据位
    USART4->CR1 &= (~(0x1 << 12));
    USART4->CR1 &= (~(0x1 << 28));
    //设置没有奇偶校验位
    USART4->CR1 &= (~(0x1 << 10));
    //设置1位停止位
    USART4->CR2 &= (~(0x3 << 12));
    //设置16倍过采样
    USART4->CR1 &= (~(0x1 << 15));
    //设置时钟不分频
    USART4->PRESC &= (~(0xf));
    //设置波特率为115200
    USART4->BRR = 0x22b;
    //使能发送器
    USART4->CR1 |= (0x1 << 3);
    //使能接收器
    USART4->CR1 |= (0x1 << 2);
    //使能uart4
    USART4->CR1 |= (0x1);
}

void putchar(char a)
{
    //先判断发送寄存器是否为空
    while(!(USART4->ISR & 0x1<<7)); //取出第七位的数据,如果是1表示 当前寄存器为空
    USART4->TDR = a;
    //不为空阻塞等待
    //为空向寄存器中写入数据
    //写入完成判断发送是否完成,未完成阻塞,完成函数结束
    while (!(USART4->ISR & 0x1 << 6));
}

char getchar()
{
    //判断接收寄存器中是否有数据有数据读取,没数据阻塞
    //读取成功返回该字符
    char a;
    while (!(USART4->ISR & 0x1 << 5));
    a = USART4->RDR;
    return a;
}

void puts(char *s)
{
    while(*s)
    {
        putchar(*s);
        s++;
    }
    putchar('\r');
    putchar('\n');
}

void gets(char *s)
{
    while(1)
    {
        *s = getchar();
        putchar(*s);
        if (*s == '\r')
        {
            break;
        }
        s++;
    }
    *s = '\0';
}


int strcmp(char *src,char *dest)
{
    char *p = src, *q = dest;
    while(*p==*q&&*p!='\0'&&*q!='\0')
    {
        p++;
        q++;
    }
    if(*p>*q)
    {
        return 1;
    }
    else if(*p<*q)
    {
        return -1;
    }
    else 
    {
        return 0;
    }
}

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

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

相关文章

neo4j所有关系只显示RELATION,而不显示具体的关系

当看r时&#xff0c;真正的关系在properties中的type里&#xff0c;而type为“RELATION” 造成这个的原因是&#xff1a; 在创建关系时&#xff0c;需要指定关系的类型&#xff0c;这是固定的&#xff0c;不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…

【MyBatis】初始化过程

MyBatis 初始化过程 可以分为以下几个步骤&#xff1a; 添加依赖&#xff1a;首先&#xff0c;需要在项目的 pom.xml&#xff08;如果是 Maven 项目&#xff09;或 build.gradle&#xff08;如果是 Gradle 项目&#xff09;文件中添加 MyBatis 以及数据库驱动的依赖。 配置文…

Java集合框架初学者指南:List、Set与Map的实战训练

Java集合框架是Java语言的核心部分&#xff0c;它提供了丰富的类和接口&#xff0c;用来高效地管理和操作大量数据。这个强大的工具箱包括多种集合类型&#xff0c;其中最为常用的是List、Set和Map。 1.List - 有序且可重复的数据清单 概念&#xff1a; List就像一个购物清单&…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…

Spring Boot整合Spring Security

Spring Boot 专栏&#xff1a;Spring Boot 从零单排 Spring Cloud 专栏&#xff1a;Spring Cloud 从零单排 GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo Spring Security是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块的默认技术…

基于springboot+vue+Mysql的留守儿童爱心网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读&#xff1a; 文献摘要 现有问题 研究目的及方法 PINN的设置 NS方程介绍 损失函数 训练方法 实验设置 对照组设置 实验结果展示 点云数、隐藏层数和每个隐藏层的节点数对PINN精度的影响 点云数对PINN的影响&#xff1a; 隐藏层数的影…

Kruskal最小生成树【详细解释+动图图解】【sort中的cmp函数】 【例题:洛谷P3366 【模板】最小生成树】

文章目录 Kruskal算法简介Kruskal算法前置知识sort 中的cmp函数 算法思考样例详细示范与解释kruskal模版code↓ 例题&#xff1a;洛谷P3366 【模板】最小生成树code↓完结撒花QWQ Kruskal算法简介 K r u s k a l Kruskal Kruskal 是基于贪心算法的 M S T MST MST 算法&#xff…

探索国内ip切换App:打破网络限制

在国内网络环境中&#xff0c;有时我们会遇到一些限制或者屏蔽&#xff0c;使得我们无法自由访问一些网站或服务。而国内IP切换App的出现&#xff0c;为解决这些问题提供了非常便捷的方式。这些App可以帮助用户切换IP地址&#xff0c;让用户可以轻松地访问被限制或屏蔽的网站&a…

【计算机考研】 跨考408全年复习规划+资料分享

跨专业备考计算机考研408&#xff0c;确实是一项挑战。在有限的时间内&#xff0c;我们需要合理安排时间&#xff0c;制定有效的学习计划&#xff0c;做到有效地备考。回顾我之前对408的经验&#xff0c;我想分享一些备考计划和方法。 要认清自己的起点。作为跨专业考生&#…

AI Infra论文阅读之《在LLM训练中减少激活值内存》

写了一个Megatron-LM的3D Parallel进程组可视化的Playground&#xff0c;界面长下面这样&#xff1a; 可以直接访问&#xff1a;https://huggingface.co/spaces/BBuf/megatron-lm-parallel-group-playground 脚本也开源在&#xff1a;https://github.com/BBuf/megatron-lm-par…

Linux部署seata-2.x整合SpringCloud使用(Nacos实现配置与注册中心)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Linux部署seata-2.x整合SpringCloud使用(Nacos实现配置与注册中心) ⏱️…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

Elasticsearch:虚拟形象辅助和对话驱动的语音到 RAG 搜索

作者&#xff1a;来自 Elastic Sunile Manjee 搜索的演变 搜索已经从产生简单结果的简单文本查询发展成为容纳文本、图像、视频和问题等各种格式的复杂系统。 如今的搜索结果通过生成式人工智能、机器学习和交互式聊天功能得到增强&#xff0c;提供更丰富、更动态且与上下文相…

一张表看懂阿里云服务器优惠价格表(CPU内存价格+带宽费用+磁盘价格)

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

【Redis】Redis特性

Redis 认识redisRedis特性在内存中存储数据可编程可扩展性持久化Clustering高可用性 认识redis Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志…

Window全网解析网站下载视频

全网解析网站下载视频 介绍m3u8格式cbox格式 解析视频下载的方法方法一解析视频下载视频 方法二老王浏览器下载使用浏览器解析下载视频 总结 介绍 今天分享一下如何解析网页中的视频进行下载。通常情况下我们打开的某某网站的视频是不提供下载接口的&#xff0c;甚至说你下载了…

Verilog刷题笔记45

题目&#xff1a;Given the finite state machine circuit as shown, assume that the D flip-flops are initially reset to zero before the machine begins. Build this circuit. 解题&#xff1a; module top_module (input clk,input x,output z ); wire [2:0]size;dtou…

性能测试丨GreatSQL TPC-H 性能测试报告正式发布!

1、测试背景概述 本次测试针对GreatSQL开源数据库基于标准 TPC-H 场景的测试。 TPC-H&#xff08;商业智能计算测试&#xff09;是美国交易处理效能委员会&#xff08;TPC&#xff0c;TransactionProcessing Performance Council&#xff09;组织制定的用来模拟决策支持类应用…

StarRocks 助力金融营销数字化进化之路

作者&#xff1a;平安银行 数据资产中心数据及 AI 平台团队负责人 廖晓格 平安银行五位一体&#xff0c;做零售金融的领先银行&#xff0c;五位一体是由开放银行、AI 银行、远程银行、线下银行、综合化银行协同构建的数据化、智能化的零售客户经营模式&#xff0c;这套模式以数…