8.18 作业

STM32MP1xxUART4驱动初始化及串口通信函数实现
文章详细描述了STM32MP1xx平台上的UART4串口通信初始化过程,包括GPIO配置、波特率设置以及put_string、put_char、get_string和charge_char等串口操作函数的实现。

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)
	{
		//put_char(get_char()+1);
		put_string(get_string());
	}
	return 0;
}

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

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

void uart4_init();
void put_string(const char *buf);
void put_char(const char buf);
char* get_string();
char get_char();

#endif

uart4.c

#include "uart4.h"

void 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);

	GPIOB->OTYPER &= (~(0X1<<2));

	GPIOB->OSPEEDR &= (~(0X3<<4));

	GPIOB->PUPDR &= (~(0X3<<4));

	GPIOB->AFRL &= (~(0XF<<8));
	GPIOB->AFRL |= (0X8<<8);
	//设置pg11
	GPIOG->MODER &= (~(0x3)<<22);
	GPIOG->MODER |= (0x2<<22);

	GPIOG->OTYPER &= (~(0X1<<11));

	GPIOG->OSPEEDR &= (~(0X3<<22));

	GPIOG->PUPDR &= (~(0X3<<22));

	GPIOG->AFRH &= (~(0XF<<12));
	GPIOG->AFRH |= (0X6<<12);
	//uart4初始化
	//设置cr1 ue位不使能
	USART4->CR1 |= ~0X1;
	//WORD LENGTH
	USART4->CR1 &= (~(0X1<<12));
	USART4->CR1 &= (~(0X1<<28));
	//设置16倍采样
	USART4->CR1 &= (~(0X1<<15));
	//不分频
	USART4->PRESC &= (~0XF); 
	//设置波特率
	USART4->BRR &= (~0XFFFF);
	USART4->BRR |= 0X22B;
	//设置cr2停止位
	USART4->CR2 &= (~(0X3<<12));
	//设置无校验
	USART4->CR1 &= (~(0X1<<10));
	//设置cr1 ue位使能
	USART4->CR1 |= 0X1;
	//设置cr1 te位使能
	USART4->CR1 |= ~(0X1<<3);
	//设置cr1 re位使能
	USART4->CR1 |= ~(0X1<<2);
}

void put_string(const char *buf)
{
	for(int i=0;buf[i]!=0;i++)
	{
		put_char(buf[i]);
	}
}
void put_char(const char buf)
{
	while((USART4->ISR & (0X1<<7)) != (0X1<<7));
	USART4->TDR = buf;	
	while((USART4->ISR & (0X1<<6)) != (0X1<<6));
}
char* get_string()
{
	static char str[32];
	for(int i=0;i<sizeof(str)-2;i++)
	{
		str[i] = get_char();
		put_char(str[i]);
		if(str[i] == '\r')
		{
			put_char('\n');
			str[i+1] = '\n';
			str[i+2] = '\0';
			break;
		}
	}
	return str;
}
char get_char()
{
	while((USART4->ISR & (0X1<<5)) != (0X1<<5));
	return (char)USART4->RDR;
}

1.输入a输出b

 

2.输入“nihao”,输出“nihao”

 

Elasticsearch 8.18 是一个重要的版本更新,带来了多项新功能、改进和优化,以增强其作为分布式搜索和分析引擎的能力。以下是一些关键的更新亮点: ### 新功能 - **原生连接 (Native Joins)** Elasticsearch 8.18 引入了 LOOKUP JOIN 这一新的 ES|QL 命令,用于执行左连接 (left joins),以增强数据的查询能力。该功能允许用户根据定义的匹配标准,将一个索引中的文档与另一个索引中的文档进行组合和查询。这种动态关联方式在查询时进行跨索引文档的关联,减少了数据冗余,提高了数据管理效率[^2]。 - **向量搜索增强** 8.18 版本进一步增强了向量数据库功能,支持更大规模的向量数据存储与检索,优化了向量相似性搜索的性能,使得在推荐系统、图像检索等场景中的应用更加高效。 - **增强的 REST API** 新版本对 REST API 进行了多项增强,包括更灵活的查询参数、更高效的响应格式以及更好的错误处理机制,提升了开发者的使用体验。 ### 性能改进 - **查询性能优化** 在 8.18 版本中,Elasticsearch 对查询执行路径进行了优化,减少了不必要的计算和内存分配,从而提升了复杂查询的响应速度。 - **分片管理改进** 引入了更智能的分片分配策略,提升了大规模集群中的分片均衡性和恢复效率,降低了因节点故障导致的集群不稳定风险。 - **内存使用优化** 对 JVM 内存的使用进行了优化,减少了堆内存的消耗,提高了系统的稳定性和可扩展性。 ### 安全与管理 - **增强的安全功能** 8.18 版本在安全方面进行了多项改进,包括更细粒度的角色权限控制、增强的审计日志功能以及对 TLS 1.3 的支持,提升了系统的整体安全性。 - **监控与诊断工具升级** 提供了更全面的监控指标和诊断工具,帮助管理员更好地理解集群状态,快速定位和解决问题。 ### 升级指南 - **兼容性注意事项** 在升级到 8.18 之前,建议检查当前使用的插件和索引格式是否与新版本兼容。某些旧版本的 API 可能已被弃用或移除,需进行相应的代码调整。 - **配置更新建议** 推荐根据新版本的特性调整集群配置,例如启用新的分片分配策略、优化线程池设置等,以充分发挥新版本的性能优势。 - **测试与回滚计划** 在生产环境中部署前,应在测试环境中充分验证新版本的功能和性能。同时,制定详细的回滚计划,以防升级过程中出现不可预见的问题。 ```bash # 示例:设置环境变量以运行 Elasticsearch 8.18 export ES_JAVA_HOME=/data/elasticsearch-8.18.2/jdk/ export ES_HOME=/data/elasticsearch-8.18.2 source .bash_profile ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值