ARM开发,stm32mp157a-A7核(UART总线实验)

这篇具有很好参考价值的文章主要介绍了ARM开发,stm32mp157a-A7核(UART总线实验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

2.框图分析: 

ARM开发,stm32mp157a-A7核(UART总线实验),ARM,arm开发,c语言,stm32

 3.代码:

---.h头文件---
#ifndef __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.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
---.c功能实现文件---
#include "uart4.h"
extern void delay_ms(int ms);

//RCC/GPIO/UART4章节初始化
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章节初始化
	//1设置PB2引脚为复用功能
	GPIOB->MODER &= (~(0x3 << 4));
	GPIOB->MODER |= (0x1 << 5);

	//2设置PB2引脚为复用功能为UART4_RX;
	GPIOB->AFRL &= (~(0x15 << 8));
	GPIOB->AFRL |= (0x1 << 11);
	
	//1设置PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3 << 4));
	GPIOG->MODER |= (0x1 << 5);
	
	//2设置PG11引脚为复用功能为UART4_TX
	GPIOG->AFRH &= (~(0x15 << 12));
	GPIOG->AFRH |= (0x3 << 13);
	
	//UART4章节初始化
	//8N1 115200 使能
	//0 设置UE位为0x1
	if(USART4->CR1 & (0x1 << 0))
	{
		delay_ms(500);
		USART4->CR1 &= ~0x1;	
	}
	
	//1设置串口1位起始位 8位数据位
	USART4->CR1 &= ~(0x1 << 12);
	USART4->CR1 &= ~(0x1 << 28);

	//2设置串口16倍采样率
	USART4->CR1 &= ~(0x1 << 15);
	
	//3PRESC 串口分频初始化 
	//不分配,放在波特率前
	USART4->PRESC &= ~0x15;

	//4BRR 设置串口波特率
	USART4->BRR = 0x22B;

	//5设置串口无校验位
	USART4->CR1 &= ~(0x1 << 10);
	
	//6CR2 设置串口停止位
	USART4->CR2 &= ~(0x3 << 12);

	//7设置串口发送位使能
	USART4->CR1 |= (0x1 << 3);
	
	//8设置串口接收位使能
	USART4->CR1 |= (0x1 << 2);
	
	//9设置串口使能  放到最后!!!
	USART4->CR1 |= 0x1;

}

//发送一个字符函数
void hal_put_char(const char str)
{
	//1判断发送数据是否为空 ISR[7]
	//读0:满 等待
	//读1:为空 发送
	while(!(USART4->ISR & (0x1 << 7)));
	
	//2 发送数据赋值给发送数据寄存器中
	USART4->TDR = str;
	
	//3 判断一帧数据是否发送完成
	//读0:没完成,等待
	//读1:完成
	while(!(USART4->ISR & (0x1 << 6)));
}

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

//接收一个字符函数
char hal_get_char()
{
	//1判断接收数据寄存器 是否收到数据
	//读0:没有接收到数据
	//读1:接收到数据
	while(!(USART4->ISR & (0x1 << 5)));

	//将接收数据寄存器中的内容读出来
	char ch = USART4->RDR;
	return ch;
}

char buf[128] = "";
//接收一个字符串函数
char* hal_get_string()
{
	int i = 0;
	char ch;
	//循环接收
	//enter = '\r' 
	while((ch=hal_get_char()) != '\r')
	{
		buf[i] = ch;
		hal_put_char(buf[i]);
		i++;
	}
	buf[i] = '\0';
	hal_put_char('\n');
	hal_put_char('\r');

	return buf;
}
---.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()
{
	hal_uart4_init();

	while(1)
    {
        //单字符测试
		//hal_put_char(hal_get_char() + 1);
        //字符串测试
		hal_put_string(hal_get_string());
	}

	return 0;
}
结果:
字符: ARM开发,stm32mp157a-A7核(UART总线实验),ARM,arm开发,c语言,stm32
字符串: 

ARM开发,stm32mp157a-A7核(UART总线实验),ARM,arm开发,c语言,stm32文章来源地址https://www.toymoban.com/news/detail-675477.html

到了这里,关于ARM开发,stm32mp157a-A7核(UART总线实验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ARM开发(cortex-A7核,UART总线实验)

    ---.h头文件--- ---.c功能实现文件--- ---.c主函数测试文件--- 结果: 字符:  字符串: 

    2024年02月12日
    浏览(41)
  • 驱动开发,stm32mp157a开发板的led灯控制实验

            编写LED灯的驱动,在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制; LED1-PE10 LED1亮灭: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (输出) 0X50006000 GPIOE_ODR[10]-1(输出高电平) 0(输出低电平)0X50006014 LED2-PF10 LED2亮灭: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    浏览(39)
  • arm学习stm32之spi总线数码管倒计时,裸机开发,soc

    由于时间没有用时间计时器操作,有些误差,后续有空会翻新计时器版本 main.c spi.c spi.h

    2024年02月16日
    浏览(45)
  • cortex-A7核PWM实验--STM32MP157

    实验目的:驱动风扇,蜂鸣器,马达进行工作 目录 一,PWM相关概念 有源蜂鸣器和无源蜂鸣器 二,分析电路图,框图 三,分析RCC章节 1,确定总线连接 2,根据总线内容确定基地址 3.分析RCC章节所需寄存器 1,RCC_MP_AHB4ENSETR寄存器 2,RCC_MP_APB1ENSETR寄存器 四,分析GPIO章节寄存器

    2024年02月11日
    浏览(29)
  • cortex-A7核IIC实验--STM32MP157AAA

    实验目的:采集温湿度传感器值 1.同步串行半双工总线,主要用于链接整体电路,硬件结构简单,接口连接方便,成本较低 2.两线制,只有两根双向信号线,数据线SDA,时钟线SCL 3.IIC传输速率:1)低速:100k ,2)400k,全速:3.4M 4.总线外接两个上拉电阻:在总线处于空闲状态时

    2024年02月11日
    浏览(41)
  • STM32MP157驱动开发——按键驱动(中断)

    对于使用中断的按键驱动,内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以,需要做的只是修改设备树指定引脚及键值 中断是引入其他基础知识的前提:休眠-唤醒、POLL 机制、异步通知、定时器、中断的线程化处理都离不开中断 设备树相关 查看原理图确定按键使用的

    2024年02月15日
    浏览(44)
  • STM32MP157驱动开发——按键驱动(tasklet)

    阅读Linux 系统中异常与中断可知,Linux 系统对中断处理的演进过程中,实现了中断的扩展:硬件中断、软件中断 硬件中断有:GPIO,网络中断(net),系统滴答中断(tick)等 软件中断有:定时器,tasklet等 内核中的软中断: 该数组里面有个action成员,该成员是个函数,函数会调

    2024年02月14日
    浏览(41)
  • STM32MP157驱动开发——按键驱动(工作队列)

    定时器、下半部 tasklet,它们都是在中断上下文中执行,它们无法休眠。当要处理更复杂的事情时,往往更耗时。这些更耗时的工作放在定时器或是下半部中,会使得系统很卡;并且循环等待某件事情完成也太浪费CPU 资源了。如果使用线程来处理这些耗时的工作,那就可以解

    2024年02月15日
    浏览(36)
  • STM32MP157驱动开发——按键驱动(异步通知)

    Linux 系统中也有很多信号,在 Linux 内核源文件 includeuapiasm-genericsignal.h 中,有很多信号的宏定义: 就 APP 而言,你想处理 SIGIO 信息,那么需要提供信号处理函数,并且要跟 SIGIO 挂钩。这可以通过一个 signal 函数 来“给某个信号注册处理函数”,用法如下: 重点从②开始:

    2024年02月15日
    浏览(50)
  • STM32MP157驱动开发——按键驱动(线程化处理)

    工作队列是在内核的线程的上下文中执行的 工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有如下2种: 比如自己创建一个内核线程,不跟别的 work 在一块。例如存储设备比如 SD/TF采用的就是单独一个线程。 使用线程化的中断处理。中断的处理仍然

    2024年02月16日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包