第一个ARM程序裸板点灯

news2024/12/26 0:35:28

硬件知识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

在这里插入图片描述

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

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

相关文章

ESXi配置两个不同网段虚拟机互通

ESXi配置两个不同网段虚拟机互通 拓扑图&#xff1a; 步骤 在ESXi上新建一个虚拟交换机新建两个端口组&#xff0c;VLAN ID分别为30和31&#xff0c;添加到新建的虚拟交换机上创建两个虚拟机&#xff0c;网络适配器分别使用新建的端口组30和31对新建的虚拟机配置IP在物理交换…

论文阅读:LOGO-Former: Local-Global Spatio-Temporal Transformer for DFER(ICASSP2023)

文章目录 摘要动机与贡献具体方法整体架构输入嵌入生成LOGO-Former多头局部注意力多头全局注意力 紧凑损失正则化 实验思考总结 本篇论文 LOGO-Former: Local-Global Spatio-Temporal Transformer for Dynamic Facial Expression Recognition发表在ICASSP&#xff08;声学顶会…

369B1860G0028 44A730240-G01 IC697ACC722B

369B1860G0028 44A730240-G01 IC697ACC722B 在NOA&#xff0c;一个名为MO(监控和优化)的独立领域与现有系统分开准备&#xff0c;数据直接从机器人、无人机和新传感器收集&#xff0c;例如腐蚀、声音和振动传感器。此外&#xff0c;现有系统中的数据通过OPC UA导入&#xff0c…

实现前后端分离开发:构建现代化Web应用

文章目录 什么是前后端分离开发&#xff1f;为什么要采用前后端分离开发&#xff1f;前后端分离的最佳实践1. 定义API2. 使用RESTful风格3. 选择适当的前端框架4. 选择合适的后端技术5. 数据交互格式6. 前端路由7. 自动化构建和部署8. 跨域问题 示例&#xff1a;前后端分离开发…

使用JavaScript编写的爬虫程序

这是一个使用JavaScript编写的爬虫程序&#xff0c;它使用了Elasticsearch和Nginx来收集和存储数据。在这个程序中&#xff0c;我们首先设置了代理信息&#xff0c;然后使用JavaScript编写了一个爬虫程序来收集数据。以下是每行代码和步骤的详细解释&#xff1a; // 定义代理信…

Tkinter创建菜单窗口

一、说明 本文专门记录如何添加Tkinter的菜单&#xff0c;包括&#xff0c;菜单如何生成&#xff0c;菜单如何布局&#xff0c;菜单如何绑定回调函数&#xff0c;并安排代码示例&#xff0c;凡期望做菜单界面的读者&#xff0c;可以全面参考。 二、创建菜单实现步骤 2.1 总体…

2023-11笔记

1.switch空指针异常 Exception in thread "main" java.lang.NullPointerException:Cannot invoke "String.hashCode()" because "<local2>" is nullat Study5.Test03.main(Test03.java:6)我们由此可以知道&#xff0c;switch语句部分情况下…

正点原子嵌入式linux驱动开发——Linux Regmap驱动

在前面学习I2C和SPI驱动的时候&#xff0c;针对I2C和SPI设备寄存器的操作都是通过相关的API函数进行操作的。这样Linux内核中就会充斥着大量的重复、冗余代码&#xff0c;但是这些本质上都是对寄存器的操作&#xff0c;所以为了方便内核开发人员统一访问I2C/SPI设备的时候&…

每日一题 2586. 统计范围内的元音字符串数(简单)

简单题&#xff0c;走流程 class Solution:def vowelStrings(self, words: List[str], left: int, right: int) -> int:ans 0for i in range(left, right 1):if words[i][0] in aeiou and words[i][-1] in aeiou:ans 1return ans

1300*B. Big Vova(最大公约数贪心)

Problem - 1407B - Codeforces 解析&#xff1a; 显然最大的数肯定放到第一个&#xff0c;然后对于之后每一个数&#xff0c;贪心考虑让其最大公约数最大即可。 时间复杂度log(n^2logn) #include<bits/stdc.h> using namespace std; #define int long long const int N…

qt多线程例子,不断输出数字

dialog.h #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) {ui->setupUi(this); }Dialog::~Dialog() {delete ui; }// 启动线程按钮 void Dialog::on_startButton_clicked() {//conn…

springboot本地启动多个模块报错:Address already in use: JVM_Bind

目录 背景解决方法 背景 环境&#xff1a; jdk1.8 idea 2019.2.4idea本地启动多个模块联调时&#xff0c;提示报错&#xff1a; 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9090; nested exception is: java.net.BindException: Addre…

vue实现商品列表,组件抽离

1.需求说明 my-tag 标签组件封装 ​ (1) 双击显示输入框&#xff0c;输入框获取焦点 ​ (2) 失去焦点&#xff0c;隐藏输入框 ​ (3) 回显标签信息 ​ (4) 内容修改&#xff0c;回车 → 修改标签信息 my-table 表格组件封装 ​ (1) 动态传递表格数据渲染 ​ (2) 表头支…

电表采集器有抗干扰的能力吗?

电表采集器作为一种数据采集和远程通讯设备&#xff0c;广泛应用于电力、能源、工业等领域。在这些环境中&#xff0c;电表采集器面临着各种各样的电磁干扰&#xff0c;如高频干扰、脉冲干扰、电磁辐射等。为了确保电表采集器的稳定运行和数据准确性&#xff0c;抗干扰能力成为…

极智AI | GPT-4 Turbo登场

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 GPT-4 Turbo登场。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 今天,OpenAI 的首届开发者大会揭幕 (真的像科…

python-28-日志模块Loguru的应用

参考为什么不推荐使用Python原生日志库&#xff1f; 参考loguru&#xff0c;一个神奇的 python 库 Loguru 是一个旨在为 Python 带来愉快的日志记录的库&#xff0c;它可以完全增强你的日志记录体验&#xff0c;并且非常易于使用。 对logging及Loguru进行使用对比。 1 Loguru的…

L4级自动驾驶前装量产车型来了,小马智行与丰田联合打造

11月5日&#xff0c;小马智行与丰田汽车联合发布的首款纯电自动驾驶出租车&#xff08;Robotaxi&#xff09;概念车在第六届进博会亮相&#xff0c;该车型基于广汽丰田生产的bZ4X纯电车辆平台打造&#xff0c;将搭载小马智行研发的第七代L4级自动驾驶乘用车软硬件系统。 今年8月…

实测Java批量导入百万级数据

JAVA通过ThreadPoolTaskExecutor批量插入百万级数据 文章目录 JAVA通过ThreadPoolTaskExecutor批量插入百万级数据一、前言二、实现步骤1、application.yml添加线程池配置信息2、业务类&#xff0c;创建多线程批量插入具体业务方法3、spring容器注入线程池bean对象4、测试 三、…

leetcode:13. 罗马数字转整数(python3解法)

难度&#xff1a;简单 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

C/S架构的医学影像PACS系统源码,应用于放射、超声、内窥镜、病理等影像科室

C/S架构的PACS系统&#xff0c;采用DICOM3.0国际标准设计&#xff0c;以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;是集医学影像的采集、传输、存储、查询、诊断、报告、综合信息管理等于一体的综合应用系统。 系统主要进行病人信息和影像的获取、处理、存储、…