stm32mp157aaa裸机开发学习之led灯亮灭

news2024/9/23 21:32:46

asm-led.S

.text 
.global _start
_start: 
	/**********LED1点灯**********/
	/**********RCC章节初始化**********/
RCC_INIT:
	@通过RCC_MP_AHB4ENSETR寄存器使能GPIOE组控制器 0x50000A28[4] = 1
	ldr r0,=0x50000A28 @LED1 GPIOE10 LED3 GPIOE8
	ldr r1,[r0]
	orr r1,r1,#(0x1 << 4)
	str r1,[r0]
	@通过RCC_MP_AHB4ENSETR寄存器使能GPIOF组控制器 0x50000A28[5] = 1
	ldr r0,=0x50000A28
	ldr r1,[r0]
	orr r1,r1,#(0x1 << 5)
	str r1,[r0]
	/**********GPIO节初始化**********/
LED1_INIT:
	@1.通过GPIOE_MODER寄存器设置PE10引脚为输出模式 0x50006000[21:20] = 01
	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	orr r1,r1,#(0x1 << 20)
	str r1,[r0]
	@2.通过GPIOE_OTYPER寄存器设置PE10引脚为推挽输出类型 0x50006004[10] = 0
	ldr r0,=0x50006004
	ldr r1,[r0]
	and r1,r1,#(~(0x1 << 10))
	str r1,[r0]
	@3.通过GPIOE_OSPEEDR寄存器设置PE10引脚为低速输出模式 0x50006008[21:20] = 00
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PE10引脚禁止上下拉电阻 0x5000600c[21:20] = 00
	ldr r0,=0x5000600c
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	str r1,[r0]

LED2_INIT:
	@1.通过GPIOE_MODER寄存器设置PF10引脚为输出模式 0x50007000[21:20] = 01
	ldr r0,=0x50007000
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	orr r1,r1,#(0x1 << 20)
	str r1,[r0]
	@2.通过GPIOE_OTYPER寄存器设置PF10引脚为推挽输出类型 0x50007004[10] = 0
	ldr r0,=0x50007004
	ldr r1,[r0]
	and r1,r1,#(~(0x1 << 10))
	str r1,[r0]
	@3.通过GPIOE_OSPEEDR寄存器设置PF10引脚为低速输出模式 0x50007008[21:20] = 00
	ldr r0,=0x50007008
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PF10引脚禁止上下拉电阻 0x5000700c[21:20] = 00
	ldr r0,=0x5000700c
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 20))
	str r1,[r0]

LED3_INIT:
	@1.通过GPIOE_MODER寄存器设置PE8引脚为输出模式 0x50006000[17:16] = 01
	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 16))
	orr r1,r1,#(0x1 << 16)
	str r1,[r0]
	@2.通过GPIOE_OTYPER寄存器设置PE8引脚为推挽输出类型 0x50006004[8] = 0
	ldr r0,=0x50006004
	ldr r1,[r0]
	and r1,r1,#(~(0x1 << 8))
	str r1,[r0]
	@3.通过GPIOE_OSPEEDR寄存器设置PE8引脚为低速输出模式 0x50006008[17:16] = 00
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 16))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PE8引脚禁止上下拉电阻 0x5000600c[17:16] = 00
	ldr r0,=0x5000600c
	ldr r1,[r0]
	and r1,r1,#(~(0x3 << 16))
	str r1,[r0]



loop:
	bl LED1_ON
	bl delay_1s
	bl LED1_OFF
	bl delay_1s
	bl LED2_ON
	bl delay_1s
	bl LED2_OFF
	bl delay_1s
	bl LED3_ON
	bl delay_1s
	bl LED3_OFF
	bl delay_1s
	b loop

LED1_ON:
	@通过GPIOE_ODR寄存器设置PE10引脚输出高电平 0x50006014[10] = 1
	ldr r0,=0x50006014
	ldr r1,[r0]
	orr r1,r1,#((0x1 << 10))
	str r1,[r0]
	mov pc,lr


LED1_OFF:
	@通过GPIOE_ODR寄存器设置PE10引脚为低电平 0x50006014[10] = 0
	ldr r0,=0x50006014
	ldr r1,[r0]
	bic r1,r1,#(0x1 << 10)
	str r1,[r0]
	mov pc,lr

LED2_ON:
	@通过GPIOE_ODR寄存器设置PF10引脚输出高电平 0x50007014[10] = 1
	ldr r0,=0x50007014
	ldr r1,[r0]
	orr r1,r1,#((0x1 << 10))
	str r1,[r0]
	mov pc,lr


LED2_OFF:
	@通过GPIOE_ODR寄存器设置PF10引脚为低电平 0x50007014[10] = 0
	ldr r0,=0x50007014
	ldr r1,[r0]
	bic r1,r1,#(0x1 << 10)
	str r1,[r0]
	mov pc,lr

LED3_ON:
	@通过GPIOE_ODR寄存器设置PE8引脚输出高电平 0x50006014[8] = 1
	ldr r0,=0x50006014
	ldr r1,[r0]
	orr r1,r1,#((0x1 << 8))
	str r1,[r0]
	mov pc,lr


LED3_OFF:
	@通过GPIOE_ODR寄存器设置PE8引脚为低电平 0x50006014[8] = 0
	ldr r0,=0x50006014
	ldr r1,[r0]
	bic r1,r1,#(0x1 << 8)
	str r1,[r0]
	mov pc,lr


@ 大概1s的延时函数
delay_1s:
	mov r3, #0x10000000
	mm:
	cmp r3, #0
	subne r3, r3, #1
	bne mm
	mov pc, lr

.end

C语言工程项目代码
led.h

#ifndef __LED_H__
#define __LED_H__
//声明一个结构体
typedef struct{
	unsigned int MODER;//00
	unsigned int OTYPER;//04
	unsigned int OSPEEDR;//08
	unsigned int PUPDR;//0c
	unsigned int IDR;//10
	unsigned int ODR;//14
}gpio_t; 
#define GPIOE ((volatile gpio_t*)0x50006000)
#define GPIOF ((volatile gpio_t*)0x50007000)
//rcc 初始化
void rcc_init();
//led1 初始化
void led1_init();
//led2 初始化
void led2_init();
//led3 初始化
void led3_init();
//led1 灯打开
void led1_on();
//led1灯关闭
void led1_off();
//led2 灯打开
void led2_on();
//led2灯关闭
void led2_off();
//led3 灯打开
void led3_on();
//led3灯关闭
void led3_off();



#endif

main.c

#include"include/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()
{
	rcc_init();
	led1_init(); // LED1灯初始化
	led2_init(); // LED2灯初始化
	led3_init(); // LED3灯初始化
	while(1)
	{
		led1_on();
		delay_ms(500);
		led1_off();
		delay_ms(500);
		led2_on();
		delay_ms(500);
		led2_off();
		delay_ms(500);
		led3_on();
		delay_ms(500);
		led3_off();
		delay_ms(500);
		led1_on();
		led2_on();
		led3_on();
		delay_ms(500);
		led1_off();
		led2_off();
		led3_off();
		delay_ms(500);
		led1_on();
		led3_on();
		delay_ms(500);
		led1_off();
		led3_off();
		delay_ms(500);
		led3_on();
		delay_ms(500);
		led3_off();
		delay_ms(500);
		led2_on();
		delay_ms(500);
		led2_off();
		delay_ms(500);
		led1_on();
		delay_ms(500);
		led1_off();
		delay_ms(500);
	}
	return 0;
}

led.c

#include"../include/led.h"

/*
 *led1 引脚pe10
 *led2 引脚pf10
 *led3 引脚pe8
 */
/*rcc初始化
 * function:    rcc_init pe10,pf10,pe8
 * @param [ in]  
 * @param [out] 
 * @return      
 */
void rcc_init(){
		*(volatile int *)0x50000A28 |=(0x3 << 4);
}

/*led1灯初始化
 * function:    led1_init pe10
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led1_init(){
	GPIOE->MODER  &= (~(0x3 << 20));
	GPIOE->MODER |= (0x1 << 20);
	GPIOE->OTYPER &= (~(0x1 << 10));
	GPIOE->OSPEEDR &= (~(0x3 << 20));
	GPIOE->PUPDR &= (~(0x3 << 20));
}
/*led2灯初始化
 * function:    led2_init pf10
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led2_init(){
	GPIOF->MODER &= (~(0x3 << 20));
	GPIOF->MODER |= (0x1 << 20);
	GPIOF->OTYPER &= (~(0x1 << 10));
	GPIOF->OSPEEDR &= (~(0x3 << 20));
	GPIOF->PUPDR &= (~(0x3 << 20));
}
/*led3灯初始化
 * function:    led3_init pe8
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led3_init(){
	GPIOE->MODER &= (~(0x3 << 16));
	GPIOE->MODER |= (0x1 << 16);
	GPIOE->OTYPER &= (~(0x1 << 8));
	GPIOE->OSPEEDR &= (~(0x3 << 16));
	GPIOE->PUPDR &= (~(0x3 << 16));
}
/*led1 灯打开
 * function:  led1_on
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led1_on(){
	GPIOE->ODR |= (0x1 << 10);	
}
/*led1 灯关闭
 * function:  led1_off
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led1_off(){
	GPIOE->ODR &= (~(0x1 << 10));
}
/*led2 灯打开
 * function:  led2_on
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led2_on(){
	GPIOF->ODR |= (0x1 << 10);	
}
/*led2 灯关闭
 * function:  led2_off
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led2_off(){
	GPIOF->ODR &= (~(0x1 << 10));
}
/*led3 灯打开
 * function:  led3_on
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led3_on(){
	GPIOE->ODR |= (0x1 << 8);	
}
/* led3 灯关闭
 * function:  led3_off
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void led3_off(){
	GPIOE->ODR &= (~(0x1 << 8));
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vite4+vue3:从0到1搭建vben后台管理系统(四)-封装dayjs的日历组件

前言 在后台管理系统中,封装vue的日历组件是很常见的一个功能,有时候antdvue里面的组件跟我们业务需求差异比较大时,去改antdui的官方组件比较麻烦,这个时候,我们就得自己去封装这样一个日历组件,效果如下图所示: 两种实现方式之vue2.x的实现 <template><div&…

用简单易懂的方式手写一个单例模式,看了不会来打我

文章目录 一、如何手写一个单例模式1.1 什么是单例模式1.2 单例模式的适用场景1.3 单例模式的设计原理1.4 单例模式的实现方案1.5 代码测试 一、如何手写一个单例模式 1.1 什么是单例模式 单例模式是一种常用的软件设计模式&#xff0c;它的核心是只包含一个实例的特殊类。单…

每日一道算法题--进制转换

进制转换 题目来源解题思路代码 题目来源 题目链接: 进制转换 解题思路 首先&#xff0c;从标准输入读取两个整数 M 和 N&#xff0c;分别表示待转换的十进制数和目标进制。如果输入的十进制数 M 等于 0&#xff0c;直接输出 0 并返回。判断输入的十进制数是否为负数&#xf…

网络商城源码如何选择?

电商行业的不断发展&#xff0c;越来越多的企业和商家希望建设自己的网络商城系统&#xff0c;为消费者提供更加便捷的购物体验。 但是&#xff0c;想要实现这一目标&#xff0c;选择一款优秀的网络商城系统源码至关重要。那么&#xff0c;在如此众多的商城系统源码中&#xff…

局域网内,将笔记本作为台式机的扩展屏

目录 1、驱动端下载&#xff1a; 2、笔记本下载 显示端&#xff1a; 3、连接状态&#xff1a; 4、笔记本扩展屏&#xff1a; 如果&#xff0c;都支持无线显示器的话&#xff0c;可以用window内置的winp实现&#xff0c;可惜我的台式机不支持&#xff0c;所以采用了软件的方…

结构体和数据结构--向函数传递结构体

将结构体传给函数的方式有以下三种&#xff1a; 目录 一、用结构体的单个成员作为函数参数&#xff0c;向函数传递结构体的单个成员 二、用结构体变量作函数实参&#xff0c;向函数传递结构体得完整结构 三、用结构体指针或结构体数组作函数参数&#xff0c;向函数传递结构体…

亿发软件:智能制造时代,企业为什么选择量身定制信息化软件系统

在快节奏的市场环境中&#xff0c;每个企业都寻求建立自己的管理模式&#xff0c;这往往成为竞争优势。然而&#xff0c;标准化软件产品的使用有时会扼杀企业管理的个性化&#xff0c;而僵化的制度则阻碍管理升级。此外&#xff0c;单个的部门级软件会造成信息孤岛&#xff0c;…

【电子量产工具】2.输入系统

文章目录 前言一、输入系统分析二、封装输入结构体三、底层 touchscreen四、底层 netinput五、显示管理层六、测试程序测试效果 总结 前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 对于输入系统&#xff0c;这里只介绍 触摸屏线程 和 网络线…

7-WebApis-6

Web APIs - 6 目标&#xff1a;能够利用正则表达式完成小兔鲜注册页面的表单验证&#xff0c;具备常见的表单验证能力 正则表达式综合案例阶段案例 正则表达式 正则表达式&#xff08;Regular Expression是一种字符串匹配的模式&#xff08;规则&#xff09; 使用场景&#…

微信小程序申请

方案说明&#xff1a; 微信小程序申请步骤有两个过程&#xff0c;目前采用的是第二种方案 第一种方案&#xff1a;直接向微信申请微信小程序 第二种方案&#xff1a;先申请公众号后再通过公众号快速注册并申请小程序 无论申请公众号还是小程序都需要微信认证&#xff0c;微…

ubuntu18.04下安装PCL

整体步骤可参考&#xff1a;https://blog.csdn.net/qq_42257666/article/details/124574029 在本人安装过程中&#xff0c;遇到一些问题&#xff0c;做几点说明&#xff1a; 1.在配置VTK的过程中报错如下&#xff1a; 解决方法&#xff1a; sudo apt install libqt5x11extras…

Nginx【Nginx核心指令(rewrite指令、实战rewrite 、if指令、set和break指令】(六)-全面详解(学习总结---从入门到深化)

目录 Nginx核心指令_rewrite指令 Nginx核心指令_实战rewrite Nginx核心指令_if指令 Nginx核心指令_set和break指令 Nginx核心指令_rewrite指令 地址重写与地址转发 地址重写 地址重写是实际上是为了实现址标准化&#xff0c;就像访问www.baidu.cn可 以出现www.baidu.com的…

阿里云企业邮箱标准版用户数功能说明

阿里云企业邮箱标准版不同用户数费用表&#xff0c;标准版企业邮箱不限制账号容量、20GB共享网盘容量、5GB个人网盘容量&#xff0c;默认5个账号数540元一年&#xff0c;原价是600元一年&#xff0c;年付9折、多年付8折&#xff0c;阿里云百科分享企业邮箱标准版不同账号数收费…

软件测试技能,JMeter压力测试教程,请求body自动签名带上sign参数(二十一)

一、前言 接口请求body带有sign签名参数&#xff0c;sign签名是根据请求body除去sign本身参数后&#xff0c;拼接请求参数最后md5加密生成的 使用 jmeter 测试接口&#xff0c;我们希望在请求之前修改 post body 里面的 sign 参数的值为签名的值 二、sign签名 签名一篇的实…

Alibaba Sentinel | 熔断规则详解

文章目录 简介熔断策略-慢调用比例结论&#xff1a;流程图&#xff1a;熔断结果详细解释 熔断策略-异常比例结论&#xff1a;详细解释 熔断策略-异常数结论&#xff1a;详细解释 统计异常数、比例的方法编码加注解RuntimeException 总结 简介 熔断是一种保护机制&#xff0c;用…

Redis持久化(RDB、AOF)

Redis持久化&#xff08;RDB、AOF&#xff09; 一、Redis高可用二、Redis持久化三、Redis的RDB持久化1、触发条件1.1 手动触发1.2 自动触发1.3 其它自动触发机制 2、执行流程3、启动时加载RED文件(恢复) 四、Redis的AOF持久化1、开启AOF2、执行流程2.1 命令追加&#xff08;app…

杂记:逆向一块FPGA核心板

最近太热了&#xff0c;实在无心看书。阵列书丢一边看不进去&#xff0c;还买了几本统计信号的甚至都没开始看&#xff08;笑&#xff09;&#xff0c;躺在床上玩玩手机摆烂&#xff0c;看到某黄色APP上有老板卖拆机的板子&#xff0c;价格美丽&#xff0c;美中不足的是没有资料…

JavaFX布局详解与代码实例

JavaFX布局详解与代码实例 一、JavaFX布局的原理1.1 JavaFX布局容器1.2 布局约束 二、常用JavaFX布局2.1 VBox和HBox布局2.2 GridPane布局2.3 BorderPane布局 三、JavaFX布局代码实例四、总结与展望 正文&#xff1a; 引言&#xff1a; JavaFX是一种功能强大的用户界面&#xf…

SFP6012-ASEMI代理MHCHXM(海矽美)二极管SFP6012

编辑&#xff1a;ll SFP6012-ASEMI代理MHCHXM&#xff08;海矽美&#xff09;二极管SFP6012 型号&#xff1a;SFP6012 品牌&#xff1a;MHCHXM&#xff08;海矽美&#xff09; 封装&#xff1a;TO-247AB 恢复时间&#xff1a;≤75ns 正向电流&#xff1a;30A 反向耐压&a…

Excel表格转换

原始数据 1部 2部 3部 4部 5部 6部 7部 8部 9部 郈思 王瑾 郈思 许嘉 郈思 施眉 郈思 王瑾 郈思 许嘉 郈思 许嘉 吕倩倩 孙帮菊 夏侯瑾 孙帮菊 吕倩倩 孙痴梦 孙帮菊 姜佳 王瑾 孙痴梦 王瑾 许嘉 施眉 施眉 杨婕 施眉 施眉 孙帮菊 杨孝洁 施眉 吕倩倩 孙痴梦 郈思 夏侯瑾 李文…