1.13UART串口实验

news2024/12/28 20:47:07

UART总线:

异步全双工串行总线。用于芯片与外设之间的通信

UART通信协议:

空闲状态处于高电平

起始位:串口通信的起始标志

数据位:传输数据时先从低位开始传输,再传输高位

奇偶校验位:  奇校验:数据位和校验位1的个数为奇数

偶校验:数据位和校验位1的个数为偶数

停止位:(1)发送完数据的标志(2)校验时钟

因为串口采用异步通信方式,两个设备之间有自己独立的时钟源,虽然设置两个时钟源保持一致,但还是会有误差,并且随着时间的拉长,误差会越来越大。

串口配置:115200波特率   8位数据为   1位奇偶校验位  1位停止位

框图:

RCC:使能GPIOB,GPIOG,UART4

GPIO:设置I\O引脚为复用模式,并设置复用功能

UART:初始化串口

实验流程:

RCC:使能GPIO

GPIO:设置GPIO_MODER为复用模式

设置引脚复用功能为UART4_RX和UART4_TX

UART:

设置8位数据宽度

设置无奇偶校验

设置1位停止位

设置16倍采样率

设置发送寄存器使能

设置接收寄存器使能

设置波特率为115200

设置分屏器不分频

设置UART使能

利用发送寄存器发送数据

利用接收寄存器接收数据

状态位寄存器查看发送接收寄存器状态

代码:

uart4.c

#include "../include/uart4.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_uart.h"
#include "../common/include/stm32mp1xx_rcc.h"
void hal_uart4_init(){
	
    RCC->MP_AHB4ENSETR |= (0x1 << 1);
    RCC->MP_AHB4ENSETR |= (0x1 << 6);
 
    // 使能UART控制器的时钟
    RCC->MP_APB1ENSETR |= (0x1 << 16);
 
    /*******GPIO章节初始化*******/
    // 设置PG11为复用模式
    GPIOG->MODER &= (~(0x3 << 22));
    GPIOG->MODER |= (0x2 << 22);
 
    //设置PB2为复用模式
    GPIOB->MODER &= (~(0x3 << 4));
    GPIOB->MODER |= (0x2 << 4);
 
    //设置PG11为UART4_TX复用功能
    GPIOG->AFRH &= (~(0xf << 12));
    GPIOG->AFRH |= (0x6 << 12);
 
    //设置PB2为UART4_RX复用功能
    GPIOB->AFRL &= (~(0xf << 8));
    GPIOB->AFRL |= (0x8 << 8);
 
    /*******UART章节初始化*******/
    //设置UART4传输数据宽度为8位
    USART4->CR1 &= (~(0x1 << 28));
    USART4->CR1 &= (~(0x1 << 12));
 
    //设置UART4串口16倍采样率
    USART4->CR1 &= (~(0x1 << 15));
 
    //设置UART4串口无奇偶校验位
    USART4->CR1 &= (~(0x1 << 10));
 
    //设置UART4串口发送寄存器和接收寄存器使能
    USART4->CR1 |= (0x3 << 2);
 
    //设置UART4串口1位停止位
    USART4->CR2 &= (~(0x3 << 12));
 
    //设置UART4串口不分频
    USART4->PRESC &= ~0xf;
 
    //设置UART4串口波特率为115200
    USART4->BRR &= ~0xffff;
    USART4->BRR |= 0x22b;
 
    //设置UART4串口使能
    USART4->CR1 |= 0x1;
}
 
void put_char(const char c){
	
	while(!(USART4->ISR&(0x1<<7))); //7(0),寄存器满
		//7(1)  寄存器为空,可发送
		USART4->TDR&=~(0xff);
		USART4->TDR=c;
		if(c=='\n')
        put_char('\r');
	while(!(USART4->ISR&(0x1<<6)));  //数据发送完成
	
	
 
}
 
char get_char(){
	char c;	
	while(!(USART4->ISR&(0x1<<5)));
	
  for (int i=0;i<9;i++){
        if(USART4->RDR & (0x1<<i)){
            c|=(0x1 <<i);
        }else{
            c&=(~(0x1<<i));
        }
    }
	return c;
}
 
void put_string(char* string){
	char* p=string;
	while(*p!='\0'){
		while(!(USART4->ISR&(0x1<<7))); //7(0),寄存器满	
		put_char(*p);
		p++;
	}
}
 
char buf[64]="";
char* get_string(){
	char* p=buf;
	char c;
	while(c!='\r'){
		c=get_char();
		printf("%c",c);
		*p=c;
		p++;
	}
	*p='\0';
	put_char('\n');
	return buf;
}

 main.c

#include "./include/uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
 
void init()
{
	hal_uart4_init();
}
 
int main()
{
	init();
	while(1)
	{
	//	put_char(get_char()+1);
	put_string(get_string());
	}
	return 0;
}

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

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

相关文章

MacOS 系统中如何使用EF Core进行数据迁移?

原有 笔者最近在使用MacOS系统做asp.net core mvc项目开发。可是一直习惯了使用宇宙最强大的vs2019工具。突然换到苹果系统就感觉什么都是问题了。现在我将遇到该问题的解决方案做下记录&#xff0c;方便自己也是方便别的同学快速的解决问题。 发现有坑 其实最开始我也是翻阅…

RocketMQ 存储优化技术 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年1月13日 &#x…

Django 后端没有接收到前端anxios的 post 内容

前端使用 vue 无论怎样 post 后端都说没有接收到值&#xff0c;&#xff08;后端接口正确&#xff09; 寻找原因&#xff1a; 1、前端查看自己的请求类型 Content-Type:application/json 我们的请求是这样的&#xff1a; axios({method:post,url:/video/upload,data:{"…

RedHat6配置本地yum源(最新超详细过程)

一、环境准备 挂载iso的镜像文件在CD/DVD驱动器上&#xff0c;需要确保&#xff0c;已连接已打开&#xff0c;且CD/DVD上的介质符合当前操作系统的版本。 挂载本地光盘到系统 在“编辑设置”——>“硬件”——>“CD/DVD驱动器”里指定操作系统的ISO镜像文件 光驱挂载…

web性能测试:Lighthouse测试实践

一工具简介 Lighthouse是Google开源的一个自动化工具&#xff0c;它可以搜集多个Web网页性能指标&#xff0c;分析Web应用的性能并生成报告&#xff0c;为开发人员进行性能优化提供了参考方向。1工作原理•Driver&#xff08;驱动&#xff09;—— 通过 Chrome Debugging Proto…

力扣sql基础篇(六)

力扣sql基础篇(六) 1 学生参加各科测试的次数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 输入示例 b 输出示例 1.2 示例sql语句 # 无论考没考试都要该科目这栏且无连接字段,就可以考虑笛卡尔积了 SELECT s.student_id,s.student_name,s.subject_name,IFNULL…

【软件STM32cubeIDE下STM32F4xx使用DMA+定时器推PWM+灯带WS2812-进阶-综合汇总(讲解移植相关)】

2TOC &#xff08;1&#xff09;前言 做灯带ws2812其实有一段时间了&#xff0c;中间遇到很多问题&#xff0c;从开始的学习&#xff0c;到后来慢慢熟悉&#xff0c;再到后来尝试点很多灯带&#xff0c;做过非常多的实验了&#xff0c;自己新建工程&#xff0c;几乎尝试过很多…

【Git】GitHub 操作

6、GitHub 操作 GitHub 网址&#xff1a;https://github.com/ Ps:全球最大同性交友网站&#xff0c;技术宅男的天堂&#xff0c;新世界的大门&#xff0c;你还在等什么? 账号姓名验证邮箱atguiguyueyue岳不群atguiguyueyuealiyun.comatguigulinghuchong令狐冲atguigulinghu…

72、PaletteNeRF: Palette-based Appearance Editing of Neural Radiance Fields

简介 官网:https://palettenerf.github.io/ 以(a)多视图照片为训练输入&#xff0c;重建NeRF并将其外观分解为一组(b)基于3D调色板的色基&#xff0c;实现了©直观和逼真的场景重新着色&#xff0c;在任意视图之间具有3D一致性&#xff0c;如(d)所示&#xff0c;该方法支…

人工智能与Python的渊源

人工智能起源与发展 文章目录人工智能起源与发展前言一、达特茅斯会议与人工智能起源二、人工智能发展的高峰与低谷Python与人工智能构建Python人工智能编程环境1.Python版本2.Anaconda编程环境数据处理常用算法2.1傅里叶变换2.1.1傅里叶分析的由来2.1.2傅里叶变换原理及应用傅…

MODBUS协议下,组态王与S7-1200能否建立无线通讯?

MODBUS协议下&#xff0c;想要组态王与S7-1200之间的无线通讯其实很容易。可采用了西门子PLC专用无线通讯终端DTD434MC&#xff0c;作为实现无线通讯的硬件设备&#xff0c;使用简单方便&#xff0c;不必深入理解 MODBUS 协议细节&#xff0c;无需更改网络参数直接替换有线连接…

波士顿房价预测—随机梯度下降法优化

根据我上一篇关于波士顿房价预测一文可以知道&#xff0c;如果使用梯度下降法&#xff0c;需要将所有的样本对梯度的贡献取平均&#xff0c;根据梯度更新参数。 但是面对海量样本的数据集&#xff0c;如果每次计算都使用全部的样本来计算损失函数和梯度&#xff0c;性能会很差&…

如何创建商用照明 App SDK 应用?

商用照明 App SDK 是专为照明行业的物联网应用提供的移动端开发工具。通过商用照明 SDK&#xff0c;大家可以形成完整的商用照明物联网控制系统&#xff0c;多协议兼容&#xff0c;完美满足绿色建筑的设备管理及能源管理要求。 什么是涂鸦商用照明&#xff1f; 涂鸦商用照明解…

python基础语法(1)

专栏&#xff1a;python 每日一句&#xff1a;人生&#xff0c;无非只有三天&#xff0c;昨天&#xff0c;今天&#xff0c;明天。昨天很长&#xff0c;说不清有多少天&#xff0c;但不管有多少天&#xff0c;不管是受到挫折&#xff0c;还是取得辉煌&#xff0c;都只能代表过去…

Feign

文章目录Http客户端Feign1、Feign替代RestTemplate1.1、RestTemplate方式调用存在的问题1.2、Feign介绍1.3、定义和使用Feign客户端2、Feign的自定义配置2.1、修改日志级别3、Feign的性能优化3.1、Feign的性能优化-连接池配置4、Feign的最佳实践4.1、方式一&#xff08;继承&am…

TypeScript类型 : any,unknown

1.any类 在某些情况下&#xff0c;我们确实无法确定一个变量的类型&#xff0c;并且可能它会发生一些变化&#xff0c;这个时候我们可以使用any类型&#xff08;类似 于Dart语言中的dynamic类型&#xff09;。 any类型有点像一种讨巧的TypeScript手段&#xff1a; 1.我们可以…

【23届秋招总结】本科小学弟成功签约滴滴后端开发offer

大家好&#xff01;我是路飞&#xff0c;最近工作太忙啦&#xff0c;断更很久&#xff0c;今天给大家分享一位本科23届小学弟的秋招历程&#xff5e; 在今年整体上就业困难&#xff0c;各大公司校招HC收缩的情况下&#xff0c;这位小学弟也历经坎坷成功拿到了滴滴后端开发岗位…

【安卓学习笔记】安卓的事件处理

安卓提供了两种方式的事件处理&#xff1a;基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理 基于监听的事件处理一般包含三个要素&#xff0c;分别是&#xff1a; Event Source&#xff08;事件源&#xff09;&#xff1a;事件发生的场所&#xff0c;通常是各个…

c++11 标准模板(STL)(std::forward_list)(六)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

动态内存管理详解(malloc、calloc、realloc)

文章目录 一、什么是动态内存 二、为什么要存在动态内存分配 三、动态内存函数的介绍 3、1 malloc和free的介绍 3、2 calloc的介绍 3、3 reallco的介绍 四、常见的动态内存错误 4、1 对NULL指针的解引用操作 4、2 对动态开辟空间的越界访问 4、3 对非动态开辟内存使用free释放 …