当前位置: 首页 > news >正文

10.3 串口实验(A7核和M4核)

文章目录

  • 串口实验
    • 分析
      • 原理图
      • 芯片手册
        • RCC章节
        • GPIO章节
        • UART章节
    • 实现代码
      • A7核
        • uart4.h
        • uart4.c
        • main.c
      • M4核
    • 运行结果

串口实验

分析

原理图

通过分析电路图可知:
UART4_RX------>PB2
UART4_TX------>PG11

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

芯片手册

RCC章节

通过RCC_MP_AHB4ENSETR设置GPIOB和GPIOG控制器使能

在这里插入图片描述

通过RCC_MP_APB1ENSETR寄存器设置UART4控制器使能

在这里插入图片描述

GPIO章节

通过GPIOx_MODER寄存器,设置PB2和PG11引脚为复用功能

在这里插入图片描述

通过GPIOB_AFRL寄存器,设置PB2引脚为复用功能UART4_Rx

在这里插入图片描述

在这里插入图片描述

UART章节

通过以上分析可知,设置寄存器:
1.USART_CR1:设置数据位宽度,以及将相应位进行使能
2.USART_CR2:设置停止位
3.USART_BRR:设置波特率---->设置的采样率有关
4.USART_RDR :设置接收数据寄存器
5.USART_TDR :设置发送数据寄存器
6.USART_ISR:设置状态寄存器
7.USART_PRESC :设置时钟分频器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

A7核

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"

void uart4_init();

void put_string(const char* str);

char* get_string();

#endif

uart4.c

#include "uart4.h"

void uart4_init()
{
	RCC->MP_APB1ENSETR |=(0x1<<16);
	RCC->MP_AHB4ENSETR |=(0x1<<1);
	RCC->MP_AHB4ENSETR |=(0x1<<6);

	GPIOB->MODER |=(0x1<<5);
	GPIOB->MODER &=(~(0x1)<<4);
	GPIOG->MODER |=(0x1<<23);
	GPIOG->MODER &=(~(0x1)<<22);
	
	GPIOB->AFRL &=(~(0x7<<8));
	GPIOB->AFRL |=(0x1<<11);
	GPIOG->AFRH &=(~(0x9<<12));
	GPIOG->AFRH |=(0x3<<13);

	if(USART4->CR1&(0x1<<0))
	{
		USART4->CR1&=(~(0x1));
	}

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

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

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

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

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

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

	USART4->BRR=0x22B;

	USART4->CR1 |=0x1;
}

void put_string(const char* str)
{
	const char *p=str;
	while(*p!='\0')
	{
		while(!(USART4->ISR&(0x1<<7)));
		USART4->TDR=*p;
		while(!(USART4->ISR&(0x1<<6)));
		p++;
	}
}

char buf[32]={0};
char* get_string()
{
	buf[0]='\n';
	char ch='\0';
	int n=1;
	while(ch!='\r')
	{
		while(!(USART4->ISR&(0x1<<5)));
		ch = USART4->RDR;
		while(!(USART4->ISR&(0x1<<7)));
		USART4->TDR=ch;
		while(!(USART4->ISR&(0x1<<6)));
		buf[n]=ch;
		n++;
	}
	buf[n]='\n';
	buf[n+1]='\0';
	return buf;

}

main.c

#include "uart4.h"

int main()
{
	uart4_init();
	while(1)
	{
		put_string(get_string());
	}
	return 0;
}

M4核

使用CubMX创建工程
并完成上述分析过程中的寄存器相应位的修改
生成代码,并加入fputc函数

/* USER CODE BEGIN 0 */
int fputc(int ch,FILE* stream)
{
	//判断发送寄存器是否为空
	while(!(huart4.Instance->ISR & (0x1 << 7)));
	//将要发送的数据放入到发送寄存器中
	huart4.Instance->TDR = ch;
	
	//判断是否为'\n'
	if(ch == '\n')
	{
		//判断发送寄存器是否为空
		while(!(huart4.Instance->ISR & (0x1 << 7)));
		huart4.Instance->TDR = '\r';
	}
	return ch;
}
/* USER CODE END 0 */

运行结果

在这里插入图片描述

相关文章:

  • 使用Java实现一个定时器
  • 【CSS3】精灵图 背景图 阴影 过渡
  • 微服务笔记:第一章_微服务简介 | Eureka注册中心 | Nacos注册中心 | Nacos配置管理 | Feign
  • 信息检索经典文章-1
  • tensorflow 2.10.0安装所需依赖库版本确定方法
  • Hadoop平台搭建与数据分析实验报告
  • # 透过事物看本质的能力怎么培养?
  • 数据库-存储过程
  • 【0基础学习mysql】之DML-表中数据的操作
  • HybirdCLR 探索—— .NET相关概念(基础)
  • Linux篇【1】:入门与基本指令详解(中)
  • 基于强化学习PPO(Proximal Policy Optimization)算法的无人机姿态控制系统
  • HDFS源码分析——NameNode启动流程
  • 【Day20】LeetCode算法题【1784. 检查二进制字符串字段】【14. 最长公共前缀】
  • 状态反馈镇定之非线性系统反馈线性化
  • echarts花样作死的坑
  • HashMap剖析之内部结构
  • Java反射-动态类加载和重新加载
  • Leetcode 27 Remove Element
  • Octave 入门
  • QQ浏览器x5内核的兼容性问题
  • Shell编程
  • Spring Boot MyBatis配置多种数据库
  • tab.js分享及浏览器兼容性问题汇总
  • 对象管理器(defineProperty)学习笔记
  • 二维平面内的碰撞检测【一】
  • 缓存与缓冲
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端面试题总结
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 算法---两个栈实现一个队列
  • 小程序测试方案初探
  • HanLP分词命名实体提取详解
  • linux 淘宝开源监控工具tsar
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (4.10~4.16)
  • (c语言)strcpy函数用法
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八十八)VFL语言初步 - 实现布局
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)人的集合论——移山之道
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .equals()到底是什么意思?
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .sys文件乱码_python vscode输出乱码
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)