arm学习stm32串口指令点亮led灯

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

main.c

#include"uart-led.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_led_init();
	 	 cmd_t * res;
	gotwo();
	while(1)
	{	
		char* str = hal_get_string();
		cmd_t* res; 
		res = find_command(str);
		if(res == 0){
			hal_put_string("没有找到该命令\n");
		}else{
			res->gpio_write_p(res->gpio,res->pin,res->status);
		}
	}
	return 0;
}

uart-led.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h" 
#include "stm32mp1xx_gpio.h"
//初始化相关操作
void hal_uart4_led_init();
//发送一个字符
void hal_put_char(const char str);
//发送一个字符串
void hal_put_string(const char* string);
//接收一个字符
char hal_get_char();
//接受一个字符串
char* hal_get_string();
typedef enum{
	GPIO_RESET,
	GPIO_SET,
}status_t;
//操作灯亮灭
void hal_gpio_write(gpio_t* gpios,unsigned int pin,status_t gpio_status);
//换行
void gotwo();

//定义结构体
typedef struct{
	char* cmd_char;
	gpio_t* gpio;
	unsigned int pin;
	status_t status;
	void (*gpio_write_p)(gpio_t* gpio,unsigned int pin,status_t status);
}cmd_t;
//命令对比函数
cmd_t* find_command(char* str);

#define GPIO_PIN_10 10
#define GPIO_PIN_8 8



#endif

uart-led.c

#include"uart-led.h"
static char p[128]={};
//初始化相关操作
void hal_uart4_led_init(){
	/*******RCC初始化***********/
	//pb2使能 
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//pg11使能
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	//uart4使能
	RCC->MP_APB1ENSETR |= (0x1 << 16);
	//pe10 pe8使能
	RCC->MP_AHB4ENSETR |= (0x1 << 4);
	//pf10使能
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	/*******GPIO初始化***********/
	//pg11引脚初始化 模式设置为复用模式
	GPIOG->MODER &= (~(0x3 << 22));
	GPIOG->MODER  |= (0x1 << 23);
	//pg11引脚复用功能为TX_AFRH
	GPIOG->AFRH &=(~(0xf << 12));
	GPIOG->AFRH |=(0x6 << 12);
	//pb2引脚模式设置为复用模式
	GPIOB->MODER  &= (~(0x3 << 4));
	GPIOB->MODER |= (0x1 << 5);
	//pb2引脚复用功能为TX_AFRH
	GPIOB->AFRL &=(~(0xf << 8));
	GPIOB->AFRL |=(0x8 << 8);
	//PE10引脚初始化	
	GPIOE->MODER  &= (~(0x3 << 20));
	GPIOE->MODER |= (0x1 << 20);
	GPIOE->OTYPER &= (~(0x1 << 10));
	GPIOE->OSPEEDR &= (~(0x3 << 20));
	GPIOE->PUPDR &= (~(0x3 << 20));
	//pf10引脚初始化
	GPIOF->MODER &= (~(0x3 << 20));
	GPIOF->MODER |= (0x1 << 20);
	GPIOF->OTYPER &= (~(0x1 << 10));
	GPIOF->OSPEEDR &= (~(0x3 << 20));
	GPIOF->PUPDR &= (~(0xd8 << 20));
	//pe8引脚初始化
	GPIOE->MODER &= (~(0x3 << 16));
	GPIOE->MODER |= (0x1 << 16);
	GPIOE->OTYPER &= (~(0x1 << 8));
	GPIOE->OSPEEDR &= (~(0x3 << 16));
	GPIOE->PUPDR &= (~(0x3 << 16));

	//	GPIOE->ODR |= (0x1 << 8);	
	//GPIOE->ODR &= (~(0x1 << 8));
	/*******UART4初始化***********/
	//设置串口UE=0
	USART4->CR1 &= (~(0x1));
	//设置1位起始位8位数据位
	USART4->CR1 &= (~(0x1 << 28));
	USART4->CR1 &= (~(0x1 << 12));
	//没有奇偶校验位
	USART4->CR1 &= (~(0x1 << 10));
	//设置1位停止位
	USART4->CR2 &= (~(0x3 << 12));
	//设置16倍采样率
	USART4->CR1 &= (~(0x1 << 15));
	//设置串口不分频
	USART4->PRESC &= (~(0xf));
	//设置串口波特率位115200
	USART4->BRR = 0x22b;
	//设置串口发送器使能
	USART4->CR1 &= (~(0x1 << 2));
	USART4->CR1 |= (0x1 << 2);
	//设置接口接收器使能
	USART4->CR1 &= (~(0x1 << 3));	
	USART4->CR1 |= (0x1 << 3);
	//设置串口使能
	USART4->CR1 |= (0x1);

}

/*
 * function:    hal_gpio_write 开关灯
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void hal_gpio_write(gpio_t* gpios,unsigned int pin,status_t gpio_status){
	if(gpio_status == GPIO_RESET){
		gpios->ODR &= (~(0x1 << pin));
	}else{
		gpios->ODR |=(gpio_status << pin);
	}
}

//发送一个字符
void hal_put_char(const char str){
	//判断发送数据寄存器是否为空ISR[7]
	//特点:为空才可以满足下一位的数据,为满则需要等待
	//读0:满需要等待 读1:发送数据
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = str;
	//判断一帧数据是否发送完成
	//读0:没有发送完成,需要等待 读1:发送完成
	while(!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串
void hal_put_string(const char* string){
	//判断是否为'\0'
	//一个字符一个字符进行发送
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\r';
	while(!(USART4->ISR & (0x1 << 6)));
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\n';
	while(!(USART4->ISR & (0x1 << 6)));

	while(*string){
		while(!(USART4->ISR & (0x1 << 7)));
		//将发送的内容,赋值给发送数据寄存器
		USART4->TDR = *string;
		//判断一帧数据是否发送完成
		//读0:没有发送完成,需要等待 读1:发送完成
		while(!(USART4->ISR & (0x1 << 6)));
		string++;
	}
}
//接收一个字符
char hal_get_char(){
	//判断接收数据寄存器中是否接收到数据 ISR[5]
	while(!(USART4->ISR & (0x1 << 5)));
	//将接收数据寄存器中的内容读出来
	char ch;
	ch = USART4->RDR;
//	while(!(USART4->ISR & (0x1 << 6)));
	return ch;
}
//接受一个字符串
char* hal_get_string(){
	//循环进行接收
	//当键盘的回车键按键之后,代表字符串输出完成'\r'
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\r';
	while(!(USART4->ISR & (0x1 << 6)));
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\n';
	while(!(USART4->ISR & (0x1 << 6)));

	int i=0;
	while(1){
		while(!(USART4->ISR & (0x1 << 5)));
		p[i]= USART4->RDR;
		while(!(USART4->ISR & (0x1 << 6)));
		if(p[i] == '\r'){
			p[i]='\0';
			break;
		}
		hal_put_char(p[i]);
		i++;
		}
	return p;
}



//换行
void gotwo(){
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\r';
	while(!(USART4->ISR & (0x1 << 6)));
	while(!(USART4->ISR & (0x1 << 7)));
	//将发送的内容,赋值给发送数据寄存器
	USART4->TDR = '\n';
	while(!(USART4->ISR & (0x1 << 6)));

}
	cmd_t cmd_arr[6]={
	{"led1on",GPIOE,GPIO_PIN_10,GPIO_SET,hal_gpio_write},\
	{"led1off",GPIOE,GPIO_PIN_10,GPIO_RESET,hal_gpio_write},\
	{"led2on",GPIOF,GPIO_PIN_10,GPIO_SET,hal_gpio_write},\	
	{"led2off",GPIOF,GPIO_PIN_10,GPIO_RESET,hal_gpio_write},\	
	{"led3on",GPIOE,GPIO_PIN_8,GPIO_SET,hal_gpio_write},\	
	{"led3off",GPIOE,GPIO_PIN_8,GPIO_RESET,hal_gpio_write},\	
	};	

cmd_t* find_command(char* str){
	int i,flag=0;
		char *p;char*q;
	for(i=0;i<6;i++){
		p=str;
		q=(cmd_arr+i)->cmd_char;
		flag=1;
		while(*p){
			if(*p!=*q){
				flag=0;
				break;
			}
			p++;
			q++;
		}
		if(!(*q) && flag==1){
			break;
		}
	}
	hal_put_char(i);
	if(flag==1){
	return (cmd_arr+i);
	}else{
		return 0;
	}
}


arm学习stm32串口指令点亮led灯,arm开发,学习,stm32,串口,寄存器文章来源地址https://www.toymoban.com/news/detail-531786.html

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

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

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

相关文章

  • 江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

            使用USART串口通信,通过上位机串口助手发送符串给STM32执行LED灯点亮熄灭操作的流程。         基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。         接下来要进行发送字

    2024年03月21日
    浏览(61)
  • 【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

    这篇文章主要介绍在 海思SS528 开发板,去操作某个 GPIO 寄存器输出高、低电平,来熄灭或点亮 LED 灯。 首先,了解一下 ARM裸机编程 ,也就是在一块没有移植操作系统的ARM开发板去编程,相当于把它当成单片机去使用,很多与硬件相关的操作都需要直接读写该硬件的寄存器。

    2024年02月10日
    浏览(43)
  • 野火stm32指南者开发板点亮LED

    目录 1.芯片手册中的LED电路图 2.官网手册 3.代码演示 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切换闪烁 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切

    2024年02月13日
    浏览(43)
  • STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)

    寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和 控制寄存器 。寄存

    2024年03月08日
    浏览(52)
  • STM32通过串口发送指令控制LED灯亮灭OLED并显示命令

    先来看看程序运行的结果吧: 接下来就不说废话了,自己看源代码吧!每一行我都做了注释: 首先是主函数main.c文件: 接下来是LED.h文件: 接下来是LED.c文件: 记下来是串口相关的Serial.h文件: 接下来就是最后一个serial.c文件了: 所有文件在工程中的目录为: 工程编译后下

    2024年04月16日
    浏览(51)
  • STM32WB55_NUCLEO开发(9)----接收手机数据点亮LED

    本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过与STM32WB配对,向该特征写入一个任意字节,绿色LED会切换。 最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。 首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板: 听不到声音的请点击

    2024年02月01日
    浏览(45)
  • 手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

    最近在学STM32,基本的学完了,想学几个模块来巩固一下知识,就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的,但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了,这里我主要 手把手 记录一下我是如何对蓝牙模块进行学习和使用的。 所使用的资料和工

    2024年02月02日
    浏览(86)
  • 学习笔记|LED点亮原理|STC32G单片机视频开发教程(冲哥)|第四集-下:点亮LED

    新建工程时待选择的Device:如 STC32G12K128 Seies,需要先在下拉菜单中选择“STC MCU Database”,然后可以选择STC32G12K128 Seies了。 当前以上节课的代码为基础,经过精简后的代码(裸板未添加任何头文件): 需手工下载至开发板(屠龙刀三.1版)。 当前已实现功能:点亮P2^1端口的板

    2024年02月13日
    浏览(55)
  • STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯

     K210模块的串口发送代码 识别色块 +数字处理 这里zz是4个数字的数,则需要分成千百位和低二位传输 zz是距离。也映射了距离的算法 整体K210代码 STM32串口接受端函数 判断帧头帧尾 如果数据正常 判断 数据是否合格 若合格则点灯 否则灭灯 不要忘记加入

    2024年02月14日
    浏览(53)
  • Stm32f103c8t6(proteus仿真)学习——1.点亮LED流水灯

    软件准备:keil uVsion 5 和 proteus 8.15 打开proteus8.15 - 新建项目 - 改名 - 一直next 鼠标右键 - 放置 - 元件 - From Libraries 搜索Stm32 - 选择stm32f103c8 画出点亮一个LED灯的原理图 提示,各元器件搜索: 主控芯片:stm32 电阻:res LED灯:led 鼠标右键 - 放置 - 元件 - From Libraries 地和VCC 在左侧

    2024年02月08日
    浏览(61)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包