ARM-day6

news/2024/9/23 1:42:03/

 

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化串口
void uart4_config();
void putchar(char dat);     //发送单个字符串
char getchar();                    //接收单个字符串
void puts(char *s);           //发送字符串
void gets(char *s);           //接收字符串 

#endif

,main.c 

#include "uart4.h"//手动封装延时函数void delay_ms(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++){}}}int main(){//uart4初始化uart4_config();char str[128];while(1){puts(str); //接收一个字符串gets(str);}return 0;}

 src/usr4.c

#include "uart4.h"void uart4_config()
{//使能GPIOB\GPIOG\UART4的外设时钟RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0x1<<6);RCC->MP_APB1ENSETR |= (0x1<<16);//设置PG11和PB2为管脚复用功能//PB2GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0x2<<4);//PG11GPIOG->MODER &= (~(0x3<<22));GPIOG->MODER |= (0x2<<22);//设置PG11为UART4_TX功能GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0X6<<12);//设置PB2为UART4_RX功能GPIOB->AFRL &= (~(0xf<<8));GPIOB->AFRL |= (0X8<<8);//设置串口不使能USART4->CR1 &= (~0x1);//设置8位数据位USART4->CR1 &= (~(0x1<<12));USART4->CR1 &= (~(0x1<<28));//设置没有校验位USART4->CR1 &= (~(0x1<<10));//设置时钟频率不分频USART4->PRESC &= (~0xf);//设置16倍过采样USART4->CR1 &= (~(0x1<<15));//设置1位停止位USART4->CR2 &= (~(0x3<<12));//设置波特率为115200USART4->BRR=0X22B;//使能发送器USART4->CR1 |= (0X1<<3);//使能接收器USART4->CR1 |= (0X1<<2);//使能串口USART4->CR1 |= (0X1<<0);
}//发送单个字符
void putchar(char dat)
{//当发送数据寄存器中没有数据时可以发送while (!(USART4->ISR & (0x1<<7)));//当TDR中有数据时阻塞等待没有数据USART4->TDR = dat;//向发送数据寄存器中写入数据//等大传输完成函数结束while (!(USART4->ISR & (0x1<<6)));
}//接收单个字符
char getchar()
{//当接收数据寄存器中有有效数据时读取while (!(USART4->ISR & (0x1<<5)));//将读取到的数据返回return USART4->RDR;}//发送字符串
void puts(char *s)
{while(1){if(*s=='\0')break;putchar(*s);s++;}//发送一个回车putchar('\r');putchar('\n');
}//接收字符串
void gets(char *s)
{while(1){//循环接收单个字符,当检测到回车键‘\r’被按下,结束*s=getchar();putchar(*s);if(*s=='\r')break;s++;}//在接收的字符串最后补上一个'\0'*s = '\0';//发送一个'\n'表示在串口工具下一行进行显示putchar('\n');
}


http://www.ppmy.cn/news/1425668.html

相关文章

Bert基础(十三)--Bert变体之知识蒸馏训练

B站视频 1、 训练学生BERT模型&#xff08;TinyBERT模型&#xff09; 在TinyBERT模型中&#xff0c;我们使用两阶段学习框架。 通用蒸馏特定任务蒸馏 这种两阶段学习框架能够蒸馏预训练阶段和微调阶段的知识。下面&#xff0c;让我们看看每个阶段的详细情况。 1.1 通用蒸馏…

C#Task<T>应用详解

C# 中的 Task< T> 是一个非常强大的并发编程工具&#xff0c;它允许我们异步执行操作并返回一个结果。在这篇博客中&#xff0c;我们将详细介绍 Task< T> 的应用&#xff0c;包括它的基本概念、创建方式、等待和取消等操作&#xff0c;以及一些常见的使用场景。 基…

OpenHarmony 视图缩放组件—subsampling-scale-image-view

简介 深度缩放视图&#xff0c;图像显示&#xff0c;手势平移缩放双击等 效果图&#xff08;旋转、缩放、平移&#xff09; 下载安装 ohpm install ohos/subsampling-scale-image-view OpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 使…

Scala 第一篇 基础篇

Scala 第一篇 基础篇 一、变量与常量 1、变量2、常量 二、数据类型 1、数据基本类型概览2、元组的声明与使用3、Range介绍和使用4、Option 类型的使用和设计5、类型别名 三、运算符四、程序逻辑 1、一切都是表达式2、分支语句3、循环语句 五、集合 1、List2、Set3、Map4、Arra…

解读UUID:结构、原理以及生成机制

在计算机科学领域&#xff0c;UUID&#xff08;Universally Unique Identifier&#xff09;是一种用于唯一标识信息的标准。UUID的生成机制和结构设计使其在分布式系统和数据库中广泛应用。本文将深度解读UUID的结构、原理以及生成机制&#xff0c;帮助读者更好地理解这一重要概…

Devc++ debug

带有scanf循环的debug 注意&#xff1a;到scanf这一行之后&#xff0c;点一下next step后再进行输入&#xff1b;且输入后一定要回车来确定输入完毕&#xff0c;跳到下一行 带有函数的debug 注意&#xff1a;step into进入函数内部debug

工程上有哪些实用且简单的滤波方法?

一、工程滤波 在工程实践过程中&#xff0c;以下是一些常用的滤波方法及其优缺点&#xff1a; 限幅滤波 优点&#xff1a;简单易行&#xff0c;能够有效去除突变的大噪声&#xff0c;保护后续电路和传感器不受损伤。 缺点&#xff1a;可能会丢失信号的真实峰值&#xff0c;对真…

链表带环问题——leetcode环形链表1 2

证明链表带环 链表的带环问题指的是本该指向NULL的最后一个节点指向了之前的节点&#xff0c;导致链表成环&#xff0c;找不到尾结点的情况&#xff0c;那么我们该如何证明链表带环呢&#xff1f; 我们可以类比物理中的追及问题&#xff0c;让快慢指针同时走&#xff0c;两者相…