当前位置: 首页 > news >正文

7.1作业6

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.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

uarrt4.c

#include "uart4.h"
char buf[65]="";
//rcc/gpio/uart4初始化
void hal_uart4_init()
{/******RCC初始化*************///使能GPIOB控制器RCC->MP_AHB4ENSETR |=(0X1<<1);//使能GPIOG控制器RCC->MP_AHB4ENSETR |=(0X1<<6);//使能UART4控制器RCC->MP_APB1ENSETR |=(0X1<<16);/******GPIO初始化*************///PB2复用模式GPIOB->MODER &=(~(0X3<<4));GPIOB->MODER |=(0X2<<4);//PG11复用模式GPIOB->MODER &=(~(0X3<<22));GPIOB->MODER |=(0X2<<22);//PB2为UART_RX复用模式GPIOB->AFRL &=(~(0XF<<8));GPIOB->AFRL |=(0X8<<8);//PG11为UART_TX复用模式GPIOB->AFRL &=(~(0XF<<12));GPIOB->AFRL |=(0X6<<12);/******UART初始化*************///禁用串口 UE=0USART4->CR1 &=(~0X1);//设置8位数据位USART4->CR1 &=(~(0X1<<12));USART4->CR1 &=(~(0X1<<28)); //设置16倍采样率USART4->CR1 &=(~(0X1<<15));//设置无校验位USART4->CR1 &=(~(0X1<<10));//设置发送位使能USART4->CR1 |=(0X1<<3);//设置接收位使能USART4->CR1 |=(0X1<<2);//串口1位停止位USART4->CR2 &=(~(0X3<<12));//串口不分频USART4->PRESC &=(~0XF);//设置串口波特率115200USART4->BRR=0X22b;//串口使能 UE=1USART4->CR1 |=(0X1);
}//发送一个字符
void hal_put_char(const char str)
{//判断发送数据寄存器是否为空,不为空则阻塞等待while(!(USART4->ISR&(0X1<<7)));//当为空时将数据写入到数据发送寄存器USART4->TDR=str;//阻塞等待数据发送完毕,函数结束while(!(USART4->ISR&(0X1<<6)));
}//发送一个字符串
void hal_put_string(const char* string)
{while(*string){hal_put_char(*string);string++;}//发送完字符串让光标显示在下一行最开头hal_put_char('\n');hal_put_char('\r');
}//接收一个字符
char hal_get_char()
{//判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取while(!(USART4->ISR&(0X1<<5)));//将读取的数据返回return USART4->RDR;
}//接收一个字符串
char* hal_get_string()
{unsigned int a;for(a=0;a<64;a++){buf[a]=hal_get_char();hal_put_char(buf[a]);if(buf[a]=='\r'){break;}}buf[a]='\0';hal_put_char('\n');hal_put_char('\r');return buf;
}

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()
{void hal_uart4_init();//char a;// char buf[32];while(1){/*a=hal_get_char();//读取一个字符hal_put_char(a+1);//将读取到的字符+1返回   win下换行符是'\n',回车键对应的字符是'\r'hal_put_char('\n');hal_put_char('\r');*///读取字符串hal_put_string(hal_get_string());}return 0;
}

结果

相关文章:

  • vector与list的简单介绍
  • 收银系统源码-营销活动-幸运抽奖
  • SpringMVC(1)——入门程序+流程分析
  • MAX98357、MAX98357A、MAX98357B小巧、低成本、PCM D类IIS放大器,具有AB类性能中文说明规格书
  • 使用任意电脑通过内网穿透生成的公网地址远程SSH连接本地Windows电脑
  • docker-compose搭建minio对象存储服务器
  • c++ primer plus 第15章友,异常和其他:15.1.2 友元成员函数
  • HTML+CSS笔记
  • ECOLOGY9重置系统管理员密码
  • 【堆 优先队列】23. 合并 K 个升序链表
  • 有哪些在本地运行大模型的方法
  • 交换机需要多大 buffer(续:更一般的原理)
  • 百日筑基第十一天-看看SpringBoot
  • Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件
  • 深度学习基准模型Transformer
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • django开发-定时任务的使用
  • Hibernate最全面试题
  • javascript 哈希表
  • JavaScript 奇技淫巧
  • Linux gpio口使用方法
  • Logstash 参考指南(目录)
  • oschina
  • Rancher-k8s加速安装文档
  • React Native移动开发实战-3-实现页面间的数据传递
  • 大数据与云计算学习:数据分析(二)
  • 工作中总结前端开发流程--vue项目
  • 我从编程教室毕业
  • 我建了一个叫Hello World的项目
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #Java第九次作业--输入输出流和文件操作
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma once与条件编译
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (3)选择元素——(17)练习(Exercises)
  • (java)关于Thread的挂起和恢复
  • (搬运以学习)flask 上下文的实现
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)Docker基本介绍
  • (一)kafka实战——kafka源码编译启动
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (杂交版)植物大战僵尸
  • (转)http-server应用
  • (转)Sublime Text3配置Lua运行环境
  • **PHP分步表单提交思路(分页表单提交)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .cfg\.dat\.mak(持续补充)
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET学习全景图