ARM day7 (串口协议)

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

实验一

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

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化UART4
void hal_uart4_init();

//发送一个字符
void hal_put_char(const char str);

//发送一个字符串
void hal_put_string(const char * str);

//接收一个字符
char hal_get_char();

//接收一个字符串
char* hal_get_string();



#endif

uart4.c

#include "uart4.h"


//初始化UART4
void hal_uart4_init()
{
	/*************RCC*************/
	//1.GPIOB使能 MP_AHB4ENSETR[1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//2.GPIOG使能 MP_AHB4ENSETR[6] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//3.UART4使能 MP_APB1ENSETR[16] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 16);

	/************GPIO*************/
	//1.设置 FB2 引脚为复用模式 MODER[5:4] = 10
	GPIOB->MODER &= (~(0X3 << 4));
	GPIOB->MODER |= (0x2 << 4);

	//2.设置 FB2 引脚复用为 UART4_RX AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x8 << 8);
	
	//1.设置 FG11 引脚为复用模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0X3 << 22));
	GPIOG->MODER |= (0X2 << 22);
		
	//2.设置 FG11 引脚复用为 UART4_TX AFRL[15:12] = 1000
	GPIOG->AFRL &= (~(0XF << 12));
	GPIOG->AFRL |= (0X6 << 12);


	/***********UART4*************/
	//0.设置串口UE = 0
	USART4->CR1 &= (~0x1); 
	
	//1.设置1位起始位,8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));
		
	//2.没有奇偶校验
	USART4->CR1 &= (~(0x1 << 10));
	
	//3.设置1位停止位
	USART4->CR2 &= (~(0x3 << 12)); 
	
	//4.设置16倍采样位
	USART4->CR1 &= (~(0x1 << 15));

	//5.设置串口不分频
	USART4->PRESC &= (~0xF);
	
	//6.设置串口波特率为115200
	USART4->BRR &= (~0xFFFF);
	USART4->BRR |= (0x22B);

	//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.判断一帧数据是否发送完成ISR[6]
	//0未完成,1已完成
	while(!(USART4->ISR & (0x1 << 6)));

}


//接收一个字符
char hal_get_char()
{
	//1.判断接收是否有数据ISR[5]
	
	while(!(USART4->ISR & (0x1 << 5)));

	//2.将数据读取
	return USART4->RDR;


}


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()
{

	//使能初始化
	hal_uart4_init();

	while(1)
	{
		char arr = hal_get_char();	
		hal_put_char(arr+1);
	}
	return 0;
}

ARM day7 (串口协议),ARM,arm开发,单片机,嵌入式硬件

实现二

键盘输入一个字符串,串口工具回显输入的字符串

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

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

//初始化UART4
void hal_uart4_init();



//发送一个字符
void hal_put_char(const char str);

//发送一个字符串
void hal_put_string(const char * str);

//接收一个字符
char hal_get_char();

//接收一个字符串
char* hal_get_string();



#endif

uart4.c

#include "uart4.h"

extern void delay_ms(int ms);

//初始化UART4
void hal_uart4_init()
{
	/*************RCC*************/
	//1.GPIOB使能 MP_AHB4ENSETR[1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//2.GPIOG使能 MP_AHB4ENSETR[6] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//3.UART4使能 MP_APB1ENSETR[16] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 16);

	/************GPIO*************/
	//1.设置 FB2 引脚为复用模式 MODER[5:4] = 10
	GPIOB->MODER &= (~(0X3 << 4));
	GPIOB->MODER |= (0x2 << 4);

	//2.设置 FB2 引脚复用为 UART4_RX AFRL[11:8] = 1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x8 << 8);

	//1.设置 FG11 引脚为复用模式 MODER[23:22] = 10
	GPIOG->MODER &= (~(0X3 << 22));
	GPIOG->MODER |= (0X2 << 22);

	//2.设置 FG11 引脚复用为 UART4_TX AFRL[15:12] = 1000
	GPIOG->AFRL &= (~(0XF << 12));
	GPIOG->AFRL |= (0X6 << 12);

	/***********UART4*************/
	//0.设置串口UE = 0
	if(USART4->CR1 & 0x1)
	{
		delay_ms(500);
		USART4->CR1 &= (~0x1); 
	}
	//1.设置1位起始位,8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));

	//2.没有奇偶校验
	USART4->CR1 &= (~(0x1 << 10));

	//3.设置1位停止位
	USART4->CR2 &= (~(0x3 << 12)); 

	//4.设置16倍采样位
	USART4->CR1 &= (~(0x1 << 15));

	//5.设置串口不分频
	USART4->PRESC &= (~0xF);

	//6.设置串口波特率为115200
	USART4->BRR &= (~0xFFFF);
	USART4->BRR |= (0x22B);

	//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.判断一帧数据是否发送完成ISR[6]
	//0未完成,1已完成
	while(!(USART4->ISR & (0x1 << 6)));

}

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


}

//接收一个字符
char hal_get_char()
{
	//1.判断接收是否有数据ISR[5]
	while(!(USART4->ISR & (0x1 << 5)));
	//2.将数据读取
	return USART4->RDR;
}


char arr[100] = {0};
//接收一个字符串
char* hal_get_string()
{
	//循环接收

	int i = 0;

	while(1)
	{
		//'\n'回车表示接收完成
		arr[i] = hal_get_char();
		hal_put_char(arr[i]);
		if(arr[i] == '\r') 
		{
			break;
		}
		i++;
	}
	arr[i] = '\0';
	hal_put_char('\n');
	return arr;
}


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()
{

	//使能初始化
	hal_uart4_init();
	hal_put_string("UART4 TEXT\n");
	hal_put_char(hal_get_char());
	while(1)
	{
		hal_put_string(hal_get_string());
	}
	return 0;
}

ARM day7 (串口协议),ARM,arm开发,单片机,嵌入式硬件

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

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

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

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

相关文章

  • 单片机IO模拟串口协议

            嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题,但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况,这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果,但是要用逻辑分析仪抓线逐个看波形比较费劲。既然都IO抖线

    2024年02月10日
    浏览(45)
  • 【理解ARM架构】单片机中的C语言

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! 本喵默认各位小伙伴都会C语言,我们平时学习C语言都是在Windows环境下学习的,对于程序执行的底层逻辑了解的不是非常清楚,本喵在这里给大家介绍一下,C语言在单片机中是如何

    2024年01月16日
    浏览(49)
  • ARM、树莓派、Arduino、单片机四者有什么不同

    一张图展示它们之间的关系,如下所示: 什么是arm? 其实ARM是一种微处理器架构,但它和“手臂”(Arm)毫无关系,哪怕在拼写上一样。虽然两者都十分强壮,但ARM更像一个小而精干的智能脑袋,可以帮助各种设备实现高效、可靠的计算和控制。 ARM,全称为Advanced RISC Mach

    2024年04月16日
    浏览(43)
  • ARM--day5(C语言点灯实验、总线、串口通信信息、串口通讯协议)

      gpio.c: gpio.h: main.c:

    2024年02月12日
    浏览(40)
  • STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(73)
  • arm:day7

    1.软中断处理    

    2024年02月12日
    浏览(40)
  • 001_区分单片机、arm、DSP、FPGA(零基础也能区分)

    单片机是指一个集成在一个芯片上的完整计算机系统,最早的单片机由微处理器核心、存储器、输入输出端口和计时电路等基本部分组成。例如,Intel公司推出的第一款单片机是Intel 8048,它于1976年发布,包括一个8位的中央处理器、ROM、RAM、输入输出端口和计时电路等基本模

    2024年02月08日
    浏览(43)
  • 如果STM32/GD32一类的ARM单片机解除读写保护的方法

    有时候啊,使用ST-Link给STM32一类的ARM单片机下载程序的时候,发现怎么也下载不了,可能是由于芯片被写保护了。那怎么办呢?可以使用STM32 ST-LINK Utility工具解除芯片的写保护,本篇博文介绍操作步骤,文章最后有工具下载链接。 双击“STM32 ST-LINK Utility.exe”,打开软件。 软

    2024年02月09日
    浏览(53)
  • 4.16 day7 ARM

    mykey.h mykey.c do_irq.c main.c

    2024年04月28日
    浏览(32)
  • proteus结合keil-arm编译器构建STM32单片机项目进行仿真

        proteus是可以直接创建设计图和源码的,但是源码编译它需要借助keil-arm编译器,也就是我们安装keil-mdk之后自带的编译器。     下面给出一个完整的示例,主要是做一个LED灯闪烁的效果。     新建工程指定路径,Schematic,PCB layout都选择默认,在最后创建项目工程向导的时

    2024年02月13日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包