嵌入式:ARM Day6

这篇具有很好参考价值的文章主要介绍了嵌入式:ARM Day6。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作业:完成cortex-A7核UART总线实验

目的:1.输入'a',显示'b',将输入的字符的ASCII码下一位字符输出
           2.原样输出输入的字符串

源码:

uart4.h 

#ifndef __UART4_H__
#define __UART4_H__

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

//RCC/GPIO/UART4章节初始化
void hal_uart4_init();

//发送一个字符函数
void hal_put_char(const char str);

//发送一个字符串函数
void hal_put_string(const char* string);

//接收一个字符函数
char hal_get_char();

//接收一个字符串函数
char *hal_get_string();



#endif

uart4.c

#include "uart4.h"

//RCC/GPIO/UART4章节初始化
void hal_uart4_init(){
	//RCC章节初始化
	//1.使能GPIOB组控制器
	RCC->MP_AHB4ENSETR |= (0X1 << 1);
	//2.使能GPIOG组控制器
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//3.使能UART4组控制器
	RCC->MP_APB1ENSETR |= (0x1 << 16);

	//GPIO章节初始化
	//1.设置PB2引脚为复用功能
	GPIOB->MODER &= (~(0X3 << 4));
	GPIOB->MODER |= (0x1 << 5);
	//2.设置PB2引脚复用功能为UART4_RX AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);

	//1.设置PG11引脚为复用功能 MODER[23:22] = 10
	GPIOG->MODER &= (~(0X3 << 22));
	GPIOG->MODER |= (0x1 << 23);
	//2.设置PG11引脚复用功能为UART4_TX AFRH[15:12] = 0110
	GPIOG->AFRH &= (~(0xf <<12));
	GPIOG->AFRH |= (0X3 << 13);

	//UART4章节初始化
	//8N1 115200 使能
	//0.设置UE=0
	USART4->CR1 &= (~0X1);
	//1.设置UART4串口1位起始位,8位数据位 CR1[28][12] = 00
	USART4->CR1 &= (~(0X1 << 12));
	USART4->CR1 &= (~(0X1 << 28));
	//2.设置UART4串口没有校验位 CR1[10] = 0
	USART4->CR1 &= (~(0X1 << 10));
	//3.设置UART4串口1位停止位 CR2[13:12] = 00
	USART4->CR2 &= (~(0X3 << 12));
	//4.设置UART4串口16倍采样率 CR1[15] = 0
	USART4->CR1 &= (~(0x1 << 15));
	//5.设置UART4串口不分频 PRESC[3:0] = 0000
	USART4->PRESC &= (~0xf);
	//6.设置UART4串口波特率为 115200 BRR = 0x22B
	//BRR = 64000000 / 115200
	USART4->BRR = 0x22B;
	//7.设置UART4串口发送器使能 CR1[3] = 1
	USART4->CR1 |= (0x1 << 3);
	//8.设置UART4串口接收器使能 CR1[2] = 1
	USART4->CR1 |= (0X1 << 2);
	//9.设置UART4串口使能 CR1[0] = 1 UE=1
	USART4->CR1 |= 0X1;
}

//接收一个字符函数
char hal_get_char(){
	//判断接收数据寄存器中,是否接收到数据
	while(!(USART4->ISR & (0X1 << 5)));
	//将接收数据寄存器中的内容读出来
	char ch = USART4->RDR;
	return ch;
}


char buf[128] = "";
//接收一个字符串函数
char *hal_get_string(){
	//循环
	//enter = 'r'
	int i = 0;
	for(i = 0; i < 128; i++){
		buf[i] = hal_get_char();
		hal_put_char(buf[i]);
		if(buf[i] == '\r'){
			break;
		}
	}
	buf[i] = '\0';
	hal_put_char('\n');
	return buf;
}


//发送一个字符函数
void hal_put_char(const char str){
	//1.判断发送数据寄存器是否为空 ISR[7]
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器为空,可以发送数据
	while(!(USART4->ISR & (0x1 << 7)));
	//2.将要发送的数据,赋值给发送数据寄存器中
	USART4->TDR = str;
	//判断一帧数据是否发送完成
	while(!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串函数
void hal_put_string(const char *string){
	//判断是否为'\0'
	//一个一个字符进行发送就可以
	while(*string){
		hal_put_char(*string++);
	}
}

main.c

#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()
{
	while(1)
	{
		//hal_put_char(hal_get_char() + 1);  //输出字符的ASCII码后一个字符
		hal_put_string(hal_get_string());     //输出原样字符串
	}
	return 0;
}

结果1:

嵌入式:ARM Day6,arm开发,c语言,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-661683.html

结果2: 

嵌入式:ARM Day6,arm开发,c语言,嵌入式硬件

到了这里,关于嵌入式:ARM Day6的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式:ARM汇编语言程序设计基础教程

    ① 合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。 ② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。 用计算机语言,对数据结

    2023年04月23日
    浏览(89)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.2 嵌入式开发环境搭建

    搭建一个嵌入式开发环境主要包括以下几个部分: 安装交叉编译器 配置集成开发环境(IDE) 安装调试工具 下载和烧录程序 接下来,我们将详细介绍每个部分,并提供相应的实例。 安装交叉编译器 交叉编译器是用于将您编写的ARM汇编代码编译成可执行文件的工具。在本教程

    2024年02月11日
    浏览(55)
  • 单片机、ARM、嵌入式开发、Android 底层开发有什么关系?

    从我目前的见识来看: 单片机是个系统(比如:51、AVR、PLC...),其中包含了去除了输入输出之外的运算器、控制器、存储器,我们用程序可以非常直观的控制引脚电平的高低。最近很多小伙伴找我,说想要一些ARM的资料,然后我根据自己从业十年经验,熬夜搞了几个通宵,

    2024年02月02日
    浏览(71)
  • 嵌入式C语言自我修养笔记1-ARM体系结构与编译运行

    ARM 体系结构 ARM 体系结构 ARM 相对精简指令集 RISC 还有如下区别 ● ARM 有桶型移位寄存器,单周期内可以完成数据的各种移位操作。 ● 并不是所有的 ARM 指令都是单周期的。 ● ARM 有 16 位的 Thumb 指令集,是 32 位 ARM 指令集的压缩形式,提高了代码密度 ● 条件执行:通过指令

    2024年02月07日
    浏览(66)
  • ARM day5、day6 硬件编程

    fs4412  sd卡  串口线  电源           点灯(亮 or 灭)         2.1 外设原理图 devboard                  查找LED2-CHG_COK(核心板)         2.2 核心板原理图 coreboard                 查找CHG_COK- XEINT23/KP_ROW7/ALV_DBG19/GPX2_7         2.3 看芯片手册                 GPIO控制(第六

    2024年01月19日
    浏览(38)
  • 嵌入式LINUX开发系列之ARM板子如何替换debian镜像源

    当你做嵌入式开发过程中拿到一个开发板,遇到 apt update ,发现无法成功,镜像源无法使用,这样的话大大增加了开发难度。最近一个项目遇到这个问题,搜寻网络却无法得到有效答案,本人作为一名嵌入式开发工程师,在这里总结了一下,希望对大家做开发有所帮助,共同

    2024年03月24日
    浏览(64)
  • 探索嵌入式开发领域:单片机、ARM、Android底层的紧密联系

    作为一个曾编写ARM教程和参与Android产品开发的专家,我发现单片机、ARM、嵌入式开发和Android底层开发之间存在紧密的联系。对于那些希望在嵌入式开发领域发展的人来说,了解这些领域的知识至关重要。为了帮助你更好地学习这些内容,我总结了一些嵌入式资料,你可以在

    2024年02月11日
    浏览(50)
  • MCU嵌入式开发-硬件和开发语言选择

    主要考虑以下方面来决定是否需要RTOS支持: 需要实现高响应时的多任务处理能力 需要实现实时性能要求高的任务 需要完成多个复杂的并发任务 具备满足工控系统实时性要求的各项功能特性。通过它提供的硬件库、线程支持、中断支持等,可以完全控制微控制器的各个外设,实

    2024年02月12日
    浏览(62)
  • 【嵌入式资讯】Arm 通过引入 Keil MDK 版本 6 将嵌入式软件开发提升到一个新的水平

            随着物联网设备变得越来越智能,开发人员面临着日益增加的软件复杂性,这需要新的开发流程来创建优化的 ML 模型和高效的设备驱动程序。因此,我们为生态系统提供的软件开发平台和工具必须与我们的处理器路线图一起发展。Keil 微控制器开发套件 (Keil M

    2024年02月15日
    浏览(98)
  • 1802_在Linux系统上开发ARM单机片机嵌入式软件

             全部学习汇总: GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 1. 在Linux上也有嵌入式的开发环境,或许还有很多。不过,我现在接触到的大部分还是Windows居多。这一份文件介绍的是一个mbed platform这样一个开源的ARM嵌入式开发环境。可以支持C以

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包