arm:day6

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

实现UART通信:

1.键盘输入一个字符'a',串口工具显示'b'

arm:day6,arm开发

 2.键盘输入一个字符串"nihao",串口工具显示"nihao"

arm:day6,arm开发

uart.h

#ifndef __UART4_H__
#define __UART4_H__

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


//串口初始化函数
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"

extern void delay_ms(int ms);

//PB2 --> UART4_RX
//PG11 --> UART4_TX
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章节
	//复用功能模式 复用功能为串口接收/发送
    GPIOB->MODER &= (~(0x3 << 4));
    GPIOB->MODER |= (0x2 << 4);
    GPIOB->AFRL &= (~(0xf << 8));
    GPIOB->AFRL |= (0x1 << 11);

    GPIOG->MODER &= (~(0x3 << 22));
    GPIOG->MODER |= (0x2 << 22);
    GPIOG->AFRH &= (~(0xf << 12));
    GPIOG->AFRH |= (0x3 << 13);


	//UART4章节 8N1 115200对应位使能
	//1.判断UE是否使能,如果等于1,禁止
	if (USART4->CR1 & 0x1)	//设置UE位不使能,否则其他位无法设置
	{
		delay_ms(500);
		USART4->CR1 &= (~(0x1 << 0));
	}
	//2.设置8N1 无校验位
	USART4->CR1 &= (~(0x1 << 28));	//CR1[28][12]=00 8位数据位
	USART4->CR1 &= (~(0x1 << 12));
	USART4->CR2 &= (~(0x3 << 12));	//设置一位停止位
	USART4->CR1 &= (~(0x1 << 10));	//设置无校验位
	//3.设置16倍采样率
	USART4->CR1 &= (~(0x1 << 15));
	//4.设置串口不分频
	USART4->PRESC &= (~(0xf << 0));
	//5.设置串口波特率115200
	USART4->BRR |= 0x22b;
	//6.设置串口发送位使能
	USART4->CR1 |= (0x1 << 3);
	//7.设置串口接收位使能
	USART4->CR1 |= (0x1 << 2);
	//8.设置串口使能
	USART4->CR1 |= (0x1 << 0);	//最后设置UE使能	
}

//发送一个字符
void hal_put_char(const char str)
{
	//判断发送数据寄存器是否为空 ISR[7]
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器空,发送下一字节
	while (!(USART4->ISR & (0x1 << 7)));

	//发送数据寄存器 = str 
	USART4->TDR = str;
	
	//判断发送数据寄存器是否完成
	while (!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串
void hal_put_string(const char *string)
{
	//判断是否为\0
	//一个一个字符发送
	while (*string)
	{
		hal_put_char(*string++);
	}
	hal_put_char('\n');
	hal_put_char('\r');
}

//接收一个字符
char hal_get_char()
{
	//定一个变量,用来接收数据
	char ch;

	//判断接收数据寄存器是否有数据
	while (!(USART4->ISR & (0x1 << 5)));

	//ch = 接收数据寄存器
	ch = USART4->RDR;
	return ch;
}

char buffer[32]={};
//接收一个字符串
char *hal_get_string()
{
	//for循环
	//判断键盘回车键是否按下 \r
	unsigned int i = 0;
	for (i=0; i<31; i++)
	{
		//接收一个字符,放入buffer
		buffer[i] = hal_get_char();

		//回显到串口工具,发送一个字符
		hal_put_char(buffer[i]);
		if (buffer[i] == '\r')
			break;
	}
	buffer[i] = '\0';
	hal_put_char('\n');

	return buffer;
}

main.c文章来源地址https://www.toymoban.com/news/detail-656724.html

#include "uart4.h"

extern void printf(const char* fmt, ...);
void delay_ms(int ms)
{
	int i;
	for (i=0; i<ms; i++)
		for (int j=0; j<1800; j++);
}


int main(int argc, char *argv[])
{
	hal_uart4_init();

	while (1)
	{
		//hal_put_char(hal_get_char() + 1);
		hal_put_string(hal_get_string());
	}

	return 0;

}

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

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

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

相关文章

  • 2023.07.29 驱动开发DAY6

    通过epoll实现一个并发服务器 服务器 客户端 运行结果  

    2024年02月15日
    浏览(44)
  • 作业day6

    数据库 sqlite3 sq.db 如果sq.db存在则直接打开sq.db数据库,如果不存在则先创建再打开; ​ 系统命令 需要以 . 开头,不需要以 ; 结尾 .quit 退出数据库 .exit 退出数据库 .help 显示帮助信息,获取所有系统命令; ​ .table 查看当前数据库下的所有表格; .schema 查看表的结构 创建表格c

    2024年02月20日
    浏览(42)
  • QT day6

    目录 思维导图 学生管理系统 ui界面 头文件 源文件

    2024年01月15日
    浏览(37)
  • Day6 Qt

    思维导图 1.数据库增删改查 头文件widget.h 2.widget.cpp 视频处理 头文件

    2024年01月16日
    浏览(42)
  • C++ DAY6

    又叫钻石继承,由公共子类派生出多个中间子类,又由多个中间子类派生出汇聚子类, 汇聚子类 会 从 中间子类 得到从 公共基类 继承下来的多个成员。 由于汇聚子类会得到中间子类从公共基类继承下来的多份基类成员,故引出了虚继承的概念 为了使汇聚子类只保存一份中

    2024年02月11日
    浏览(34)
  • 数据结构 day6

    1-xmind 2-递归实现程序:输入一个数,输出该数的每一位

    2024年02月10日
    浏览(39)
  • 刷题笔记 day6

     对于一个递增排序的数组,我们可以使用双指针; 定义指针 left 指向数组最左端元素 , 定义指针 right 指向数组最右端元素; 当 nums[left] + nums[right]    target 时,右移指针right; 当 nums[left] + nums[right]   target 时,左移指针left; 当 nums[left] + nums[right]  ==  target 时,输出结果。

    2024年02月13日
    浏览(29)
  • 【C刷题】day6

    1、以下叙述中正确的是( ) A: 只能在循环体内和switch语句体内使用break语句 B: 当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体的执行 C: continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环 D: 在while语句和do-while语句中无法

    2024年02月08日
    浏览(37)
  • 蓝桥杯打卡Day6

    文章目录 N的阶乘 基本算术 整数查询 本题思路: 本题是关于高精度的模板题。  本题思路: 本题是高精度的模板题。 本题思路: 本题是高精度的模板题。

    2024年02月09日
    浏览(43)
  • C++学习 Day6

    目录 1. 类对象模型 1.1 如何计算类对象的大小 1.2 类对象的存储方式 1.3 结构体内存对齐规则  2. this指针 2.1 this指针的引出 2.2 this指针的特性 3. 类的6个默认成员函数   4.构造函数 4.1 概念 4.2 特性 class A { public : void PrintA () {   cout _a endl ; } private : char _a ; }; 问题:类中既可

    2024年02月01日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包