ARM——操作示例

news2024/11/13 9:07:51

操作流程:
     

 

 

c60a0a5b5cc346928b2920b1a7b90efa.png

38a07679d8844d8b86ce8f156a78f3fa.png

 

d604ecca8f6d4e05a683d431ca84254b.png

233538bc677a414ebc5d52c8af358692.png

一、实现一个led亮灯

(1)GPIO:可编程的输入输出引脚
每一组io都有一个寄存GP*CON控制引脚作用,每个io都有2个位,控制引脚作用
每一组io都有一个寄存GP*DAT控制引脚数据,每个io都有1个位,控制引脚数据

(2)如图:
在原理图中找到控制led的引脚端口,进而对引脚进行相应的输出配置。
从下图可以看出当引脚为低电平时,LED会被点亮,所以需要寻找对应的nLED_1(对应的GPIO口)
1a021338f7b94841a0ec3ebf036a3175.png

如下图,led对应的寄存器时GPB寄存器,
因此使能GPBCON,使GPBDA的第五位输出低电平/

fe1d188c90be4e25a357eedaac28f25c.png

再从下图中,将GPB的第十位和第十一位设置为01(输出模式)

8b32c9347c514516a6b52b38fc8ad69d.png

代码如下:

7317d7c2c9ed44abafa8494691b6c2f9.png

06e81a0b59f24f578d3179c71f64844d.png

volatile的用法

在C语言中,volatile是一个类型限定符,它的主要作用是告诉编译器,它所修饰的变量的值可能会在程序执行期间被意外地改变(通常是由程序外部的因素导致的),因此编译器不应该对这些变量进行优化,包括不应该将这些变量的值缓存到寄存器中,而应该每次访问时都从内存中重新读取其值。volatile的用法主要包括以下几个方面:

1. 防止编译器优化

编译器在编译代码时,为了提高程序的执行效率,会对代码进行优化,包括将一些常量或变量的值缓存到寄存器中以便快速访问。但在多线程编程、硬件交互等场景中,变量的值可能会被外部因素(如其他线程、硬件设备等)意外地改变。如果编译器对这些变量进行了优化,就可能导致程序无法正确地反映这些外部变化,进而产生错误。通过使用volatile关键字,可以阻止编译器对这些变量进行优化,确保每次访问时都能从内存中读取到最新的值。

2. 保证内存可见性

在多线程编程中,一个线程对共享变量的修改需要能够被其他线程所感知,这就是所谓的内存可见性。如果编译器对共享变量进行了优化(如缓存到寄存器中),就可能导致其他线程无法及时感知到该变量的最新值。通过使用volatile关键字,可以确保每个线程在访问共享变量时都能从内存中读取到最新的值,从而保证内存的可见性。

3. 嵌入式系统编程

在嵌入式系统编程中,经常需要直接与硬件进行交互,包括读取硬件寄存器的值、向硬件寄存器写入数据等。由于硬件寄存器的值可能会被外部设备或中断服务例程等意外地改变,因此需要使用volatile关键字来修饰这些寄存器变量,以确保每次访问时都能从硬件寄存器中读取到最新的值。

4. 调试和性能分析

在某些情况下,为了关闭编译器的某些优化以便更好地进行调试或性能分析,也可以使用volatile关键字。通过将某个变量声明为volatile,可以确保编译器在编译时不会对该变量进行优化,从而保留更多的程序原始信息供调试或性能分析使用。

二、实现流水灯

类似的添加延时函数即可实现蜂鸣器的效果。

extern int asm_add(int x, int y);
#define WTCON   *(volatile unsigned long *)0x53000000UL
#define GPBCON  *(volatile unsigned long *)0x56000010UL	 //11:10  0b 01
#define GPBDAT  *(volatile unsigned long *)0x56000014UL

void c_deal_swi(unsigned int num)
{
	switch (num)
	{
		case 1:break;
		case 2:break;
		case 3:break;
		default:
		break;
	}
}
//延时函数
void delay(int i)
{
	while(i--);
}

void led_init(void)
{
	//配置GDB5引脚功能为输出

	GPBCON &= ~(0xff << 10);
	GPBCON |= (0x55 << 10);

	//将GDB5引脚电平置高
	 GPBDAT |= (0x55 << 5);
	 }
   
void led_on(unsigned int i)
{
	//将GDB5引脚设置为低电平
	  GPBDAT &= ~(1 << 5<<(i-1));
}
void led_off(unsigned int i)
{
	//将GDB5引脚设置为高电平
	 GPBDAT |= (1 << 5<<(i-1));
}

int main(void)
{

//	led_init();
    int i =0;
	WTCON = 0x0;  //看门狗置0
	while(1)
	{
	led_init();
    	for(i=1;i<5;i++)
    	{
		led_on(i);
		delay(30000);	
		led_off(i);
    	}
	}
	return 0;
}

三、实现按健控制等

(1)设置GPIO为输入模式

从下图 可以看出当K1被按下,EINT8被设置为输入模式,通过该引脚可以判断按键是否被按下;

ab82b92fb5d847138c3c967918bb0d98.png

1de85f3d1f8d4f74845fbf7c78aad3b7.png

extern int asm_add(int x, int y);

int myadd(int a, int b)
{
	int c = asm_add(a, b);
	return c;
}

void c_deal_swi(unsigned int num)
{
	switch(num)
	{
		case 1:break;
		case 2:break;
		case 3:break;
		default:break;
	}
}

#define GPBCON *(volatile unsigned long *)0x56000010UL
#define GPBDAT *(volatile unsigned long *)0x56000014UL
#define GPFCON *(volatile unsigned long *)0x56000050UL
#define GPFDAT *(volatile unsigned long *)0x56000054UL
#define GPGCON *(volatile unsigned long *)0x56000060UL
#define GPGDAT *(volatile unsigned long *)0x56000064UL
#define WTCON *(volatile unsigned long *)0x53000000UL
#define WTCNT *(volatile unsigned long *)0x53000008UL

void watchdog_close(void)
{
	WTCON = 0x8021;
	WTCON &= ~0x1;
}

void watchdog_init(void)
{
	
	WTCON = 0x8021;
}

void watchdog_feed(void)
{
	WTCNT = 0x8000;
}

void button_init(void)
{
	GPGCON &= ~(0x3f << 8);
	GPFCON &= ~0x3;

}

void led_init(void)
{
	GPBCON &= (~(0xff << 10));
	GPBCON |= (0x55 << 10);
	
	
	GPBDAT |= 0xf << 5;
}
void delay(unsigned long us)
{
	while(us--)
		;
}
void led_on(unsigned int n)
{
	//GPB5Òý½ÅµçƽÖõÍ
	GPBDAT &= ~(1 << (n + 4));
	delay(30000);
}

void led_off(unsigned int n)
{
	GPBDAT |= (1 << (n + 4));
	delay(30000);
}
void led_off_all(void)
{
	GPBDAT |= (0xf << 5);
}
/*
void delay_ms(unsigned long ms)
{
    unsigned int i;

    while(ms--) 
		{
      for(i = 0; i < 1200; i++)
			{
				
			}
    }
}
*/

void button_led1(void)
{
	unsigned long tmp,tmp1,tmp2,tmp3;
	
	while(1)
	{
		tmp = GPGDAT & 0x1;
		tmp1 = GPFDAT & 0x1 <<4;
		tmp2 = GPFDAT & 0x1 <<5;
		tmp3 = GPFDAT & 0x1 <<6;
		
	if(tmp == 0)
	{
		GPBDAT &= ~(1 << 5);
		delay(500);
	}
	else if(tmp1 == 0)
	{
		GPBDAT &= ~(1 << 6);
		delay(500);
	}
	else if(tmp2 == 0)
	{
		GPBDAT &= ~(1 << 7);
		delay(500);
	}
	else if(tmp3 == 0)
	{
		GPBDAT &= ~(1 << 8);
		delay(500);
	}
	else
	{
		led_off_all();
	}
  }
}
int main(void)
{
	int i = 0;
	watchdog_close();
	led_init();
	button_init();
	/*while(1)
	{
		i = 4;
		while(i)
		{
			led_on(i);
		
		  led_off(i);

		  i--;
			
			watchdog_feed();
		}
  
  }*/
	button_led1();
}

三、时钟

46a1b1afb91d4863a2c99adfaa6519dd.png

 pwm定时器

4c4fe7af718f44a590562dba432333ce.png

 

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

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

相关文章

电脑硬盘坏了怎么恢复数据?

在数字化时代&#xff0c;电脑硬盘作为存储核心&#xff0c;承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而&#xff0c;硬盘作为机械设备&#xff0c;也有其寿命和脆弱性&#xff0c;一旦出现故障&#xff0c;数据恢复便成为了一个紧迫而棘手的问题。本文…

【小趴菜前端学习日记3】

学习项目 一、深度&#xff08;穿透&#xff09;选择器1. /deep/2.>>>3. ::v-deep 二、vue-particles1.安装2.全局引入3.使用 三、v-bind对于样式控制的增强之操作类名class四、CryptoJs加密五、自定义指令的封装和使用防抖 六、mixins七、复制字段vue-clipboard复制文…

复制与引用

复制 复制有复制的特点。 复制可以将不可思议的巧合转变成必然。 假设基于很大的运气成分&#xff0c;探索出了一个执行流程。如果没有任何记录&#xff0c;那么下次再复现出这个流程&#xff0c;会需要同样的运气&#xff0c;甚至可能更多。但运气并不会总是发生的&#xff0c…

微服务注册中心

目录 一、微服务的注册中心 1、注册中心的主要作用 &#xff08;1&#xff09;服务发现 &#xff08;2&#xff09;服务配置 &#xff08;3&#xff09;服务健康检测 2、 常见的注册中心 二、nacos简介 1、nacos实战入门 &#xff08;1&#xff09;搭建nacos环境 &am…

20240821 每日AI必读资讯

&#x1f3ae;《黑神话&#xff1a;悟空》震撼上线&#xff0c;英伟达AI技术立功&#xff01; - 中国游戏史上的奇迹&#xff1a;《黑神话&#xff1a;悟空》预售销售额达3.9亿元&#xff0c;刷新国产游戏预售纪录。 - 游戏美学效果惊人&#xff1a;孙悟空形象深入人心&#…

Bootstrap 插件概览

在前面 布局组件 章节中所讨论到的组件仅仅是个开始。Bootstrap 自带 12 种 jQuery 插件&#xff0c;扩展了功能&#xff0c;可以给站点添加更多的互动。即使您不是一名高级的 JavaScript 开发人员&#xff0c;您也可以着手学习 Bootstrap 的 JavaScript 插件。利用 Bootstrap …

【重磅】WHO推荐的2024-2025年流感疫苗株组分更新了,快来看看有哪些变化吧?

前 言&#xff1a; 流感病毒会引起季节性流感&#xff0c;甚至有可能引起大流行暴发。流感病毒是负链RNA病毒&#xff0c;其分类复杂&#xff0c;亚型众多&#xff0c;容易突变。目前公认的预防流感的最佳方法是接种疫苗。为了保证疫苗的有效性&#xff0c;世界卫生组织&#…

【SAP HANA 41】HANA中函数 COUNT(DISTINCT(xxx)) 的方式使用

目录 一、语法 二、COUNT(*) 三、COUNT( [ ALL ] ) 四、COUNT(DISTINCT ) 在SAP HANA数据库中,COUNT 函数用于计算表中行的数量或者特定列中非NULL值的数量。你提到的语法是COUNT函数的不同用法,它们允许你根据需要对数据进行计数。下面是对每种用法的解释以及示例。 一…

路由高阶用法 Vue2

1.几个注意点 Home.vue <template><div><h2>我是Home内容</h2><ul class"nav nav-tabs"><li class"nav-item"><router-link class"nav-link" active-class"active" to"/home/news"…

TilesetLaye存在时,使用mask遮罩层,会出现锯齿的解决方案

TilesetLaye存在时&#xff0c;使用mask遮罩层&#xff0c;会出现锯齿 function addDemoGeoJsonLayer1() {const tiles3dLayer new mars3d.layer.TilesetLayer({name: "合肥市建筑物",url: "//data.mars3d.cn/3dtiles/jzw-hefei/tileset.json",maximumSc…

SparkSQL数据类型

支持的数据类型 SparkSQL支持的数据类型如下&#xff1a; 数值类型 ByteType&#xff1a;表示1字节带符号整数&#xff08;“带符号”意味着它可以表示正数和负数。&#xff09;。数字的范围是-128到127。ShortType&#xff1a;表示2字节带符号整数。数字的范围是-32768到32…

打造更高效的项目:如何选择合适的管理工具

国内外主流的 10 款项目工程管理系统对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、泛微项目协同工具、广联达项目管理软件、泛普OA。 在选择项目工程管理系统时&#xff0c;你是否经常感到无从下手&#xff0c;担心投资不当或工具不适合自…

细数全球七大网络空间安全搜索引擎

随着网络攻击的频率和复杂性不断增加&#xff0c;安全专业人士需要利用各种工具来识别和应对潜在的威胁&#xff0c;网络安全搜索引擎就是其中之一&#xff0c;它们帮助安全专家查找漏洞、分析威胁情报以及监控互联网活动&#xff0c;本文将介绍全球七大网络安全搜索引擎。 1.…

误闯机器学习(第一关-概念和流程)

以下内容&#xff0c;皆为原创&#xff0c;实属不易&#xff0c;请各位帅锅&#xff0c;镁铝点点赞赞和关注吧&#xff01; 好戏开场了。 一.什么是机器学习 机器学习就是从数据中自动分析获取模型&#xff08;总结出的数据&#xff09;&#xff0c;并训练模型&#xff0c;去预…

Gadmin极速开发平台,几分钟给你整一个OA系统出来

Gadmin极速开发平台 在企业信息化的大潮中&#xff0c;Gadmin极速开发平台以其独特的低代码开发模式&#xff0c;为企业提供了一套高效、灵活的解决方案。本文将介绍Gadmin平台的基本信息、核心特点&#xff0c;以及它如何帮助企业快速实现信息化建设。 软件简介 Gadmin是一个…

华为:数据入湖,企业数据的逻辑汇聚(附数据湖建设方案下载)

往期回顾>> 华为内部“维度数据”解析 数据入湖是个什么鬼&#xff1f; 为什么数据治理工作越来越迷茫&#xff1f;(附数据治理方案PPT下载) 数字化的本质逻辑:连接、数据、智能 125页PPT&#xff1a;数据中台应用技术方案 数据中台解决方案&#xff0c;附55页PPT…

React 学习——forwardRef,暴漏子组件的dom元素

父组件拿到子组件的值&#xff1a;使用forwardRef import { forwardRef,useRef } from react;const Input forwardRef((props,ref)>{return <input type"text" ref{ref} /> })const App () > {const inputRef useRef(null);const showRef () > …

[答疑]心脏的功能是泵血,心脏是个模块,所以“功能模块”没毛病啊!

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 有同学在我的视频下留言&#xff1a; 其实认真看我的视频或书就明白&#xff0c;这和我说的不是一回事。 这个留言有点新意&#xff0c;和以往的留言如“人能说话&#xff0c;嘴就是…

Python | Leetcode Python题解之第352题将数据流变为多个不想交区间

题目&#xff1a; 题解&#xff1a; from sortedcontainers import SortedDictclass SummaryRanges:def __init__(self):self.intervals SortedDict()def addNum(self, val: int) -> None:intervals_ self.intervalskeys_ self.intervals.keys()values_ self.intervals…

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。 一、分布式ID的特性或要求: 唯一性:确保生成的ID是应用系统内唯一。高可用性:确保任何时候都能正确的生成ID。有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需…