ARM - UART4/串口软件实现字符串/字符的收发

2023-11-18

实验任务:

        1.在键盘输入一个字符,字符+1,并且打印在串口工具上 键盘输入'a'----->串口工具打印'b'。

        2.串口工具输入一个字符串,按下回车键,会显示输入的字符串。

头文件:

#ifndef __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_gpio.h"                           
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"

#define SIZE 50

//初始化函数
void uart4_init(void);

//发送一个字符
void put_char(const char str);

//发送字符串
void put_string(const char *str);

//接收一个字符
char get_char(void);

//接收字符串
char * get_string(void);


#endif

主函数:

#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++);
}

int main()
{
	//初始化串口
	uart4_init();

	while (1)
	{
		//put_char(get_char()+1);   //字符首发
		put_string(get_string());   //字符串收发
	}
	return 0;
}

被调函数:

#include "uart4.h"

extern void delay_ms(int ms);

//初始化函数
void uart4_init()
{
	//------------------RCC章节初始化——————————————————————————
	//使能GPIOB和GPIOG控制器  
    //RCC_MP_AHB4ENSETR[1] = 1------->使能GPIOB这一组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
    
	//RCC_MP_AHB4ENSETR[6] = 1------->使能GPIOG这一组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
    
	//RCC_MP_APB1ENSETR[16] = 1------->使能UART4控制器 
	RCC->MP_AHB4ENSETR |= (0x1 << 16);
	
	//——————————————————GPIO章节初始化————————————————————————————————
	//设置PB2和PG11引脚为复用功能
    //GPIOB_MODER[5:4] = 10 ------->设置PB2引脚为复用功能 RX
	GPIOB->MODER |= (0x1 << 5);
	GPIOB->MODER &= (~(0x1 << 4));
    
	//GPIOG_MODER[23:22] = 10 ------->设置PG11引脚为复用功能 TX
	GPIOG->MODER |= (0x1 << 23);
	GPIOG->MODER &= (~(0x1 << 22));
	
	//设置PB2引脚为复用功能UART4_Rx
    //GPIOB_AFRL[11:8] = 1000 ------->设置PB2引脚为复用功能UART4_Rx
	GPIOB->AFRL |= (0x1 << 11);
	GPIOB->AFRL &= (~(0x7 << 8));
	
	//设置PG11引脚为复用功能UART4_Tx
  	//GPIOG_AFRH[15:12] = 0110  ------->设置PG11引脚为复用功能UART4_Tx
	GPIOG->AFRH &= (~(0x1 << 15));
	GPIOG->AFRH |= (0x3 << 14);
	GPIOG->AFRH &= (~(0x1 << 12));

	//--------------------------UART章节初始化----------------------
	if ((USART4->CR1) & (0x1 << 0))
	{
        delay_ms(int ms);
		USART4->CR1 &= (~(0x1 << 0));
	}
	//通过USART4_CR1寄存器分析可知,需要设置如下位:
	//USART_CR1[28][12] = 00 ------->设置串口8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));

	//USART_CR2[13:12] = 00 ------->设置串口1位停止位
	USART4->CR2 &= (~(0x1 << 13));
	USART4->CR2 &= (~(0x1 << 12));
	
	//USART_CR1[10] = 0------->设置串口无奇偶校验位
	USART4->CR1 &= (~(0x1 << 10));
	
	//USART_CR1[15] = 0 ------->设置串口16倍采样率,会影响波特率的计算
	USART4->CR1 &= (~(0x1 << 15));

	//无分频 0000 必须UE=0
	USART4->PRESC &= (~(0xF << 0));

	//USART4_BRR = 0x22b ------->设置串口波特率为115200
	USART4->BRR |= 0x22b;
	
	//USART_CR1[3] = 1------->设置串口发送寄存器使能
	USART4->CR1 |= (0x1 << 3);
	
	//USART_CR1[2] = 1------->设置串口接收寄存器使能
	USART4->CR1 |= (0x1 << 2);
	
	//USART_CR1[0] = 1------->设置串口使能
	USART4->CR1 |= (0x1 << 0);
	
}

//发送一个字符
void put_char(const char str)
{
	//---------------------ISR------------------
	//USART_ISR[7]:判断发送数据寄存器是否为空,这位只可以读
	//读0:发送数据寄存器满,需要等待
    //读1:发送数据寄存器为空,发送下一个字节的数据
	while (!(USART4->ISR & (0x1 << 7)));

	//将要发送的字符,写入到发送数据寄存器中
	USART4->TDR &= (~(0Xff << 0));
	USART4->TDR = str;
	if (str == '\n')
	{
		put_char('\r');
	}

	
	//USART_ISR[6]:判断一帧数据是否发送完成,这位只可以读
	//读0:发送数据没有完成,需要等待
    //读1:发送数据完成,可以发送下一帧数据

	while (!(USART4->ISR & (0x1 << 6)));

	
}

//发送字符串
void put_string(const char *str)
{
	//判断是否为'\0'
	while (*str)
	{
		//一个一个字符进行发送
		put_char(*str);
		str++;
	}
}


//接收一个字符
char get_char()
{
	char ch;
	//USART_ISR[5]:判断接收数据寄存器是否有数据可读,这位只可以读
	//读0:没有接收到数据,需要等待
    //读1:接收到数据,可以读这个数据
	while (!(USART4->ISR & (0x1 << 5)));

	//将接收到的数据赋值到ch
	ch = (char)USART4->RDR;
	
	return ch;
}

char buffer[SIZE] = "";
//接收字符串
char * get_string()
{
	for (int j=0;j<SIZE;j++)
	{
		buffer[j] = '\0';
	}

	buffer[0] = '\n';
	char ch;
	unsigned int i = 1;
	//循环接收
	//循环接收一个 发送一个
	
	//当键盘摁下 结束  '\r'
	
	while(1)
	{
		ch = get_char();
		if (ch == '\r')
		{
			break;
		}
		buffer[i] = ch;
		put_char(ch);
		i++;
	}
	buffer[i] = '\n';
	buffer[i+1] = '\0';
	//字符串补0
	return buffer;
}

 字符串实验结果:


11
11
22
22
33333
33333
4
4
qwerty
qwerty

字符实验结果:

键盘输入:0123456789


123456789:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM - UART4/串口软件实现字符串/字符的收发 的相关文章

  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb

随机推荐

  • 【Spark NLP】第 7 章:分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 2.VHDL的基本结构和语法(一)

    目录 1 VHDL基本结构 1 1 实体 Entity 类属说明 端口方向 IN OUT INOUT BUFFER 1 2 结构体 Architecture 1 3 库 程序包的调用 1 4 VHDL语句 1 4 1 并行语句 并行信号赋值
  • web项目读取resource目录下的资源

    本地读取资源文件 1 方式 File file new File src main resources properties basecom properties InputStream in new FileInputStream fil
  • 关于ScrollView嵌套多个RecyclerView滑动冲突,可以很流畅的滑动

    首先不建议过多的嵌套 可以采取其他方式替换 当ScrollIView内部只有一个RecyclerView的时候
  • 【HTML】基础常用标签汇总

    目录 前言 最基础的标签 常用标签 文本相关 文本格式化标签 图像标签 超链接 表格 列表 无序列表 有序列表 自定义列表 表单 基本结构 表单域 表单元素控件 前言 总所周知 一个网站 web 分为三部分 1 HTML 结构 2 CSS
  • 2022年最新Vue+electron项目创建

    一 前言 大多数文章都停留在electron vue中 但是这个库不怎么更新了 最近的更新是九月前 看了很多文章都换其他的工具来构建了 这里推荐GITHUB一个大佬写的基于vue cli的插件 构建项目非常简单 插件的GITHUB源代码 话
  • 力扣刷题26. 删除有序数组中的重复项

    采用双指针法 思路如下 class Solution public int removeDuplicates int nums if nums length 0 return 0 int p 0 int q 1 while q
  • 【华为OD机试真题2023B卷 JAVA&JS】选修课

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 选修课 知识点字符串哈希表排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选
  • OCaml学习笔记(二)——Introduction to Objective Camel

    Chapter2 Simple Expressions 2 1 注释语句 OCaml语言中注释部分写在 和 之间 可以相互嵌套 注释部分当作空格处理 2 2 基本表达式 OCaml中每个有效的表达式都有一个类型 某个类型的表达式不能用作其他
  • 使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

    1 介绍 SAM9X60 处理器有部分OTP One Time Programming Aera 可用于存储user data 这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中 为什么要
  • Python--根据计算公式:BMI = 体重(kg) / 身高(m)^2判断身体状况

    Python 根据计算公式 BMI 体重 kg 身高 m 2判断身体状况 身体质量指数 BMI Body Mass Index 是国际上常用的衡量人体肥胖程度和是否健康的重要标准 主要用于统计分析 肥胖程度的判断不能采用体重的绝对值 它天然
  • ajax将响应结果显示到iframe,JavaScript:iframe / Ajax / JSON

    iframe 在Ajax流行之前大量使用 iframe中的src属性指定的就是一个独立的页面url地址 iframe中呈现的就是这个页面的内容 通过改变src的值 我们就可以轻松的改变iframe中的内容 类似的 刷新验证码也是同样的手段
  • 嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行

    第一次尝试开发移植Linux上的驱动 还是和当年单片机一样 从最简单的LED小灯开始 走走流程 试验结果 LED驱动已经编译进系统 产生 o文件 LED测试程序已经编译成功 产生可执行文件 但是由于疫情手头没板子 没法上板测试 开学之后测试
  • 电脑安装 MIUI+

    windows电脑 打开命令框 输入下面命令 winget install Xiaomi MIUI 如果是小米笔记本 还可以通过 小米帮助中心 小米商城 mi com 进行下载安装
  • hive与hbase之间数据的同步

    一 前言 数据同步是很多公司在做数据迁移时的一个痛点 当然互联网公司有自己的同步机制或者工具 但是困惑了我这几天的需求 还是没有得到解决 事已至此 来写这篇博客记录一下自己最近的研究成果 二 如何同步 hive如何与Hbase直接实现数据同
  • ABAP & DOI NACE OUTPUT

    ABAP上传文件的TCODE SMW0 OAOR 现在遇到的业务需求是在VA03的订单通过SAP标准的OUTPUT配置打印出order confirmation以后 再打印公司的文字条款内容 WORD格式的两页纸 最开始想到的实现方式是在N
  • feign和ribbon有什么区别

    ribbon和feign都是用于调用其他服务的 不过方式不同 1 启动类使用的注解不同 ribbon用的是 RibbonClient feign用的是 EnableFeignClients 2 服务的指定位置不同 ribbon是在 Ribb
  • 【ssh】xshell的替代--WindTerm

    目录 WindTerm WindTerm 简介 如何关闭锁屏密码 3 功能 3 1 选中自动复制 右键粘贴复制的内容 3 2 打开软件自动连接 3 4 设置文件下载初始目录 4 可直接编辑bash命令行 5 界面管理 资源管理器 文件管理器
  • C++中struct的用法

    废话 struct是个很有用的东西呢 进入正题 struct的用处是定义一个新的类型 而这个类型里面可以是各种各样的东西 比如 struct node 定义一个新的类型叫node int a int b 110 char c double
  • ARM - UART4/串口软件实现字符串/字符的收发

    实验任务 1 在键盘输入一个字符 字符 1 并且打印在串口工具上 键盘输入 a gt 串口工具打印 b 2 串口工具输入一个字符串 按下回车键 会显示输入的字符串 头文件 ifndef UART4 H define UART4 H incl