第一个ARM程序裸板点灯

硬件知识LED原理图

如何点亮一个LED灯?

  1. 看原理图,确定控制LED的引脚。
  2. 看主芯片的芯片手册,确定如何设置控制这个引脚。
  3. 写程序。

LED有插脚封装的、贴片封装的。
在这里插入图片描述
它们长得完全不一样,因此我们在原理图中把它们抽象出来。

点亮LED需要通电源,同时为了保护LED,需要加个电阻减小电流。
控制LED灯的亮灭,可以手动开关LED,但在电子系统中,不可能让人来控制开关,通过编程,利用芯片的引脚去控制开关。

在这里插入图片描述
LED的驱动方式,常见的有4种。

  1. 使用引脚输出3.3V点亮LED,输出0V熄灭LED。
  2. 使用引脚拉低到0V点亮LED,输出3.3V熄灭LED。

有的芯片为了省电等原因,其引脚驱动能力不足,这时可以使用三极管驱动。

  1. 使用引脚输出1.2V点亮LED,输出0V熄灭LED。
  2. 使用引脚输出0V点亮LED,输出1.2V熄灭LED。

在这里插入图片描述
由此,主芯片引脚输出高电平/低电平,即可改变LED状态,而无需关注GPIO引脚输出的是3.3V还是1.2V。
所以简称输出1或0:
逻辑1–>高电平
逻辑0–>低电平

GPIO引脚操作方法

GPIO:General-purpose input/output,通用输入/输出口。

GPIO模块一般结构:

  1. 有多组GPIO,每组有多个GPIO
  2. 使能:电源/时钟
  3. 模式(Mode):引脚可用于GPIO或其它功能
  4. 方向:引脚Mode设置为GPIO时,要继续设置它是输出引脚,还是输入引脚
  5. 数值:对于输出引脚,可以设置寄存器让它输出高、低电平。
    对于输入引脚,可以读取寄存器得到引脚的当前电平。

GPIO寄存器操作:

  1. 芯片手册一般有相关章节,用来介绍power/clock。可以设置对应寄存器使能某个GPIO模块。有些芯片的GPIO是没有使能开头的,即它总是使能的。
  2. 一个引脚可以用于GPIO、串口或其它功能,有对应的寄存器来选择引脚的功能。
  3. 对于已经设置为GPIO功能的引脚,有方向寄存器用来设置它的方向:输入、输出。
  4. 对于已经设置为GPIO功能的引脚,有数据寄存器用来写、读引脚电平状态。

操作寄存器,不能影响到其它位

GPIO寄存器的2种操作方法:

  1. 直接读写:读出、修改对应位、写入。
//将bit n置为1
val = data_reg;
val = val | (1 << n);
data_reg = val;

//清除bit n
val = data_reg;
val &= ~(1<<n);
data_reg = val;
  1. set-and-clear protocol,set_reg、clr_reg、data_reg三个寄存器对应的是同一个物理寄存器。
set_reg = (1 << n);
clr_reg = (1 << n);

STM32F103的LED操作方法

打开原理图,搜索LED。
在这里插入图片描述
在这里插入图片描述
以PB0为例,它属于GPIOB里的第0个引脚。
怎么使能GPIOB?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将Bit 3设置为1。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
频率越高,传输数据越快,波形也越陡峭,同时对外界设备的影响也越大。

在这里插入图片描述
在这里插入图片描述

编程

访问寄存器用指针:

int a;
unsigned int*p = &a; //p等于a的地址

*p = val; //写这个地址,就是写a
val = *p; //读这个地址,就是读a
unsigned int *p = 0x40010800; //p等于某个寄存器的地址
*p = val; //写这个地址,就是写这个寄存器
val = *p; //读寄存器

void delay(int d)
{
    while(d--);
}
int main()
{
    unsigned int *pReg;
    
    /* 使能GPIOB */
    pReg = (unsigned int *)(0x40021000 + 0x18);
    *pReg |= (1<<3);
    
    /* 设置GPIOB0为输出引脚 */
    pReg = (unsigned int *)(0x40010C00 + 0x00);
    *pReg |= (1<<0);
    
    
    pReg = (unsigned int *)(0x40010C00 + 0x0C);
    while(1)
    {
        /* 设置GPIOB0输出高电平 */
        *pReg |= (1<<0);
        delay(100000);
        
        /* 设置GPIOB0输出低电平 */
        *pReg &= ~(1<<0);
        delay(100000);
    }
    return 0;
}

再由启动文件:start.S调用main函数,参考keil自带的tartup_stm32f10x_hd.s

设置栈,调用main函数:

                PRESERVE8
                THUMB
              
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors    
                
                
__Vectors       DCD     0               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                    
                    
                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  main
                
                
                LDR SP, =(0X20000000+0XC000)
                BL      main
                
                ENDP
                END

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[SSD综述 1.5] SSD 主控和固件核心功能详解(万字)

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 1. 主控概述1.1 主控作用 2. 主控的硬件功能和实现2.1 主控处理器2.2 闪存、主机接口2.3 主控纠错2.4 断电保护 3 固件功能3.1 FTL3.2 预留空间(Over-provisioning)3.3 Trim3.4 写入放大(Write amplification)3.5 …

Django初窥门径-自定义附件存储模型

前言 Django自带了一个名为FileField的字段&#xff0c;用于处理文件上传。然而&#xff0c;有时我们需要更多的控制权&#xff0c;例如定义文件的存储路径、文件名以及文件类型。在本篇文章中&#xff0c;我们将探讨如何自定义Django附件存储模型。 创建attachment应用 pyt…

【计算机网络】物理层知识

目录 1、物理层的基本概念 2、数据通信的基础知识 2.1、数据通信系统模型 2.2、信道的几个基本概念 3、物理层下面的传输媒体 4、信道复用技术 1、物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的 传输媒…

数据结构:Map和Set(2):相关OJ题目

目录 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 771. 宝石与石头 - 力扣&#xff08;LeetCode&#xff09; 旧键盘 (20)__牛客网 (nowcoder.com) 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 692. 前K个高频单词 - 力扣&#xff08…

CDN加速技术:降低企业云服务成本的有效利用

在当今数字化时代&#xff0c;云服务已经成为企业运营的不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;云服务的需求也在不断增长&#xff0c;使企业不得不应对更大的数据传输和负载。这就引出了一个关键问题&#xff1a;如何有效降低企业云服务成本&#xff0c;同时…

【管理工具】CMAK安装和使用(kafka-manager)

文章目录 前言一、安装和启动1.1 安装CMAK1.2 启动cmak 二、使用CMAK2.1 添加kafka集群2.2 topic 概述2.3 broker概述2.4 其他操作 前言 一、安装和启动 1.1 安装CMAK Java环境&#xff1a;需要jdk11 $ java -version java version "11.0.5" 2019-10-15 LTS Java…

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性&#xff0c;点击高级系统设置&#xff0c;点…

Python之字符串、正则表达式练习

目录 1、输出随机字符串2、货币的转换&#xff08;字符串 crr107&#xff09;3、凯撒加密&#xff08;book 实验 19&#xff09;4、字符替换5、检测字母或数字6、纠正字母7、输出英文中所有长度为3个字母的单词 1、输出随机字符串 编写程序&#xff0c;输出由英文字母大小写或…

现一个智能的SQL编辑器

补给资料 管注公众号&#xff1a;码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验&#xff0c;在使用 MonacoEditor 为编辑器的基础上&#xff0c;我们还支持了如下几个重要功能&#xff1a; 多种 SQL 的语法高亮多种 S…

订水商城实战教程08-轮播图

首页我们已经开发了店铺信息展示以及搜索功能&#xff0c;接着需要展示轮播图的功能。轮播图需要存放在数据源中&#xff0c;点击图片的时候要访问公众号的文章。 1 创建数据源 先创建数据源用来存放轮播图&#xff0c;打开控制台&#xff0c;点击数据模型&#xff0c;点击号…

sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher

问题描述 sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or higher 解决方法 A kind of solution is changing the database from sqlite3 to pysqlite3. After acticate the virtualenv, install pysqlite. pip3 install pysqlite3 pip3 install …

网工内推 | 上市公司,云平台运维,IP认证优先,13薪

01 上海新炬网络信息技术股份有限公司 招聘岗位&#xff1a;云平台运维工程师 职责描述&#xff1a; 1、负责云平台运维&#xff0c;包括例行巡检、版本发布、问题及故障处理、平台重保等&#xff0c;保障平台全年稳定运行&#xff1b; 2、参与制定运维标准规范与流程&#x…

Ansible 自动化运维工具 --- playbook 剧本

文章目录 1. Host inventory ---- 主机清单1.1 简介1.2 inventory文件1.3 Inventory 文件的构成1.3.1 主机与组1.3.2 变量 1.4 inventory 中的常用变量 2. Ansible-playbook剧本2.1 简介2.2 Playbook的结构组成2.3 编写playbook的基本格式与写法2.3.1 基本格式2.3.2 语句的横向…

【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式

备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;然后需要构建基于GMSSL的文件系统&#xff0c;此文才对您有意义&#xff1b; 2&#xff0c;若您对方寸微电子的T690芯片不了解&#xff0c;但想进一步了解它&#xff…

[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)

(static成员 explicit 友元函数 内部类 编译器优化&#xff09; 一.static 成员&#xff1a;1.概念引入&#xff1a;1-1&#xff1a;定义全局变量记录个数&#xff1f; 2.如果有多个类需要分开去记录类对象的个数&#xff1f;2-1&#xff1a;可不可以声明成员变量解决&#…

LangChain之关于RetrievalQA input_variables 的定义与使用

最近在使用LangChain来做一个LLMs和KBs结合的小Demo玩玩&#xff0c;也就是RAG&#xff08;Retrieval Augmented Generation&#xff09;。 这部分的内容其实在LangChain的官网已经给出了流程图。 我这里就直接偷懒了&#xff0c;准备对Webui的项目进行复刻练习&#xff0c;那么…

HTML的初步学习

HTML HTML 描述网页的骨架, 标签化的语言. HTML 的执行是浏览器的工作,浏览器会解析 html 的内容,根据里面的代码,往页面上放东西,浏览器的工作归根结底,还是以汇编的形式在CPU上执行. 浏览器对于html语法格式的检查没有很严格,即使你写的代码有一些不合规范之处,浏览器也会尽可…

GIS开发入门,TopoJSON格式是什么?TopoJSON格式与GeoJSON格式有什么不同?

TopoJSON介绍 TopoJSON是一种几何拓扑结构的地理数据格式,它使用拓扑结构来表示地理对象,可以更有效地压缩和转移数据,从而加快数据加载速度。 TopoJSON格式构成 TopoJSON文件由三部分组成,transform、objects和arcs组成。transform描述了变换参数; objects描述地理实体…

NCV7721D2R2G一款完全保护的双半桥驱动器 专为汽车工业运动控制解决方案

NCV7721D2R2G是一款完全保护的双半桥驱动器&#xff0c;专为汽车和工业运动控制应用而设计。两个半桥驱动器具有独立控制。这允许高侧、低侧和H桥控制。H桥控制提供正向、反向、制动和高阻抗状态。驱动器通过逻辑电平输入进行控制。 特性&#xff1a; 1.睡眠模式下的超低静态电…

生成无损压缩png和有损压缩png的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> png是一种常用的图像格式。png一般为无损压缩,但是可以是有损压缩的。 下图都是100x100的png图像,一个是无损压缩,一个是有损压缩。 看着效果基本一样,但是它们的大小相差很大,无损…