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/串口软件实现字符串/字符的收发 的相关文章

  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段

随机推荐

  • 【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