文章目录

  • 作业内容
  • 思路分析
    • 1. 电路分析
    • RCC章节分析
    • GPIO章节分析
    • UART章节
  • 代码实现
    • uart4.h
    • uart4.c
    • main.c
  • 测试结果

作业内容

完成UART实验:实现串口工具输入一个字符串,按下回车键,会显示输入的字符串

思路分析

1. 电路分析




通过分析电路图可知:
UART4_RX对应的引脚为:PB2
UART4_TX对应的引脚为:PG11

RCC章节分析

  1. 设置GPIOB控制器使能:RCC_MP_AHB4ENSETR[1] = 1
    设置GPIOG控制器使能:RCC_MP_AHB4ENSETR[6] = 1
  2. 设置UART4控制器使能:RCC_MP_APB1ENSETR[16] = 1

GPIO章节分析

  1. 设置PB2引脚为复用功能:GPIOB_MODER[5:4] = 10
    设置PG11引脚为复用功能:GPIOG_MODER[23:22] = 10
  2. 设置PB2引脚复用功能为UART4_Rx:GPIOB_AFRL[11:8] = 1000
    设置PG11引脚复用功能为UART4_Tx:GPIOG_AFRH[15:12] = 0110

UART章节

  1. 设置串口8位数据位:USART_CR1[28][12] = 00
    设置串口16倍采样率,会影响波特率的计算:USART_CR1[15] = 0
    设置串口无奇偶校验位:USART_CR1[10] = 0
    设置串口发送寄存器使能:USART_CR1[3] = 1
    设置串口接收寄存器使能:USART_CR1[2] = 1
    设置串口接收使能:USART_CR1[0] = 1
  2. 设置串口1位停止位:USART_CR2[13:12] = 00
  3. 设置串口波特率为115200:USART4_BRR = 0x22b
  4. 设置串口不分频:USART_PRESC[3:0] = 0000

代码实现

uart4.h

#ifndef __UART4_H__
#define __UART4_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"//1.初始化函数
void uart4_init();
//2.发送一个字符
void put_char(const char str);
//3.发送一个字符串
void put_string(const char* str);
//4.接收一个字符
char get_char();
//5.接收一个字符串
char* get_string();#endif

uart4.c

#include "uart4.h"//1.初始化函数
void 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章节初始化**********///PB2---->UART4_Rx//PG11---->UART4_Tx//1.设置PB2引脚为复用功能//2.设置PB2引脚复用功能为UART_Rx//3.设置PG11引脚为复用功能//4.设置PG11引脚复用功能为UART_TxGPIOB->MODER |= (0x1 << 5);GPIOB->MODER &= (~(0x1 << 4));GPIOG->MODER |= (0x1 << 23);GPIOG->MODER &= (~(0x1 << 22));GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x1 << 11);GPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x3 << 13);/********UART章节初始化**********/if(USART4->CR1 & (0x1 << 0)){//将UE位禁止USART4->CR1 &= (~(0x1 << 0));}//1.串口初始化,8位数据位,无奇偶校验位USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));USART4->CR1 &= (~(0x1 << 10));//2.设置串口移位停止位USART4->CR2 &= (~(0x3 << 12));//3.设置串口的16倍采样率USART4->CR1 &= (~(0x1 << 15));//4.设置串口不分频USART4->PRESC &= (~(0xf << 0));//5.设置串口波特率为115200USART4->BRR = 0x22b;//6.设置串口发送器使能USART4->CR1 |= (0x1 << 3);//7.设置串口接收器使能USART4->CR1 |= (0x1 << 2);//8.设置串口使能USART4->CR1 |= (0x1 << 0);
}//2.发送一个字符
void put_char(const char str)
{//1.判断发送数据寄存器是否有数据//读0:发送数据寄存器满,需要等待//读1:发送数据寄存器为空,才可以发送下一个字节数据while(!(USART4->ISR & (0x1 << 7)));//2.将要发送的字符,写入到发送数据寄存器中USART4->TDR = str;//3.判断发送数据是否发送完成//读0:发送数据没有完成,需要等待//读1:发送数据完成,可以发送下一帧数据while(!(USART4->ISR & (0x1 << 6)));
}//3.发送一个字符串
void put_string(const char* str)
{//判断是否为'\0'while(0 != *str){//一个一个字符发送put_char(*str);str++;}put_char('\n');put_char('\r');
}//4.接收一个字符
char get_char()
{char ch;//1.判断接收寄存器是否有数据可读//读0:没有数据可读,需要等待//读1:有数据可读while(!(USART4->ISR & (0x1 << 5)));//2.将接收数据寄存器中的内容读出来ch = USART4->RDR;return ch;
}char buffer[50] = {0};
//5.接收一个字符串
char* get_string()
{//1.循环进行接收char *p = buffer;while((*p = get_char()) != '\r'){put_char(*p);p++;}//2.循环实现:接收一个字符之后,发送一个字符//当键盘回车键按下之后,代表字符串接收结束'\r'//3.字符串补'\0'*p = 0;return buffer;
}

main.c

#include "uart4.h"
extern void printf(const char *fmt, ...);int main()
{//1.调用初始化函数uart4_init();//2.发送字符(串)while(1){//put_char(get_char()+1);put_string(get_string());}return 0;
}

测试结果

10.3国庆作业(UART实验)相关推荐

  1. 10.2国庆作业(PWM实验)

    文章目录 作业内容 思路分析 1. 电路分析 2. RCC章节分析 3. GPIO章节分析 4. TIM4章节分析(以蜂鸣器为例) 代码实现 pwm.h pwm.c main.c 作业内容 完成PWM ...

  2. 10.6国庆作业(SPI实验)

    文章目录 作业内容 思路分析 电路图分析 通信协议 RCC章节分析 GPIO章节分析 代码实现 spi.h spi.c main.c 实验结果 作业内容 完成SPI实验:实现数码晶体管显示相应数字 思 ...

  3. 10.5国庆作业(IIC实验)

    文章目录 作业内容 思路分析 IIC硬件电路图 IIC时序 IIC协议 代码实现 iic.c main.c 测试结果 作业内容 完成IIC实验:实现扩展板上空气温湿度传感器对空气温度与湿度的测量 思路 ...

  4. c语言吴振国课后题答案,Exam10_C作业与实验10期中自测卷参考答案(最新整理)

    <Exam10_C作业与实验10&期中自测卷参考答案(最新整理)>由会员分享,可在线阅读,更多相关<Exam10_C作业与实验10&期中自测卷参考答案(最新整理)(4 ...

  5. 淮海工学院linux实验报告三,作业三 实验报告

    作业三 实验报告 网络通信 文件传输 实验一 1-1 实验题目 服务器端和客户端各传递1次字符串.考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度.连接时服务器端和客户端数据传 ...

  6. 数值分析matlab实验报告,数值分析第一次作业matlab实验报告.doc

    数值分析第一次作业matlab实验报告.doc 几种线性方程组迭代算法的MATLAB实现和性能比较用有限差分方法(五点差分格式)求解正方形域上的Poisson方程边值问题用MATLAB语言编写算法程序 ...

  7. JavaFx/Java 大作业 五子棋 实验报告

    Java大作业五子棋实验报告 实验目的 通过此次实验,对这一学期学习的内容尤其是界面开发部分做了一个很好的回顾,看似简单的五子棋程序,设计好也确实费了我一点功夫 功能模块简介和系统结构图 ChessG ...

  8. 国庆作业 刷题0929

    国庆作业 刷题0929 使进度在90-95%截图上传 详情 第二本书 第一本书

  9. 趣味物理中的计算机科学,【趣味物理】10个有趣的科学实验,揭示物理原理。...

    原标题:[趣味物理]10个有趣的科学实验,揭示物理原理. 1.穿透土豆的吸管. 这个实验借助了空气的力量,通过空气的作用力将土豆扎穿.我们将吸管的一端用手指堵住,吸管内空气的唯一出口就是扎入土豆的那一 ...

最新文章

  1. linux系统 长久记录所有用户所有操作记录
  2. EXPDP 时ORA-27054 问题处置
  3. poj1730Pollard分解
  4. matlab 摄像头操作
  5. php调用root权限,PHP执行root权限程序
  6. NUMA架构的CPU -- 你真的用好了么?
  7. ABAP SET UPDATE TASK LOCAL的测试
  8. 企业应用超级App来啦!
  9. C# ObjectCache、OutputCache缓存
  10. zgc,JDK8有类似的shenandoah,华为移植到JDK11
  11. Url 助手类(Url Helper)
  12. 机器人影视对接_机器学习对接会
  13. 2022年投影仪推荐 家用投影仪推荐一下哪款比较好2022
  14. spss中有关独立样本T检验的详细介绍(包含操作过程和结果分析)
  15. MySQL Error 1048 奇遇记
  16. C++编译与链接(2)-浅谈内部链接与外部链接
  17. MySQL函数 NOW()
  18. TEB算法1-teb原理详解
  19. import和export
  20. 企业邮箱和普通邮箱有什么区别

热门文章

  1. 【基于Leaflet和Canvas绘图的前端大量栅格数据渲染】
  2. mysql备份数据库某表格_MySQL备份:使用自动轮换表格备份,轻松恢复部分/完整数据库...
  3. chcp Command的妙用
  4. 南都娱乐周刊官网突然崩溃 疑遭黑客攻击
  5. 经济的1000+篇文章总结
  6. 安卓029老年人监护系统APP
  7. 计算机组成原理(4)IO
  8. Opensips搭建
  9. 一个为程序员定制的、WPF开发的小巧、美观桌面快捷工具
  10. python3中 os.path.realpath(__file__) 的使用