STM32F103寄存器方式点亮LED流水灯

2023-05-16

STM32F103寄存器方式点亮LED流水灯

    • 一、程序设计思路
      • 1.GPIO 模式
      • 2.控制引脚输出电平
      • 3.开启外设时钟
    • 二、编程实现
      • 1.C语言
      • 2.汇编语言
      • 3.实现
    • 三、总结
    • 四、参考

以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。

一、程序设计思路

本实验使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯。GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片
的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。

1.GPIO 模式

首先我们把连接到 LED 灯的 GPIO 引脚 PB0 配置成输出模式,即配置 GPIO 的端口配置低寄存器 CRL,把 PB0 配置为通用推挽输出

GPIOB_CRL &= 0xFF0FFFFF;// 清空控制 PB0 的端口位
GPIOB_CRL |= (1<<4*0);// 配置 PB0 为通用推挽输出

在代码中,我们先把控制 PB0 的端口位清 0,然后再向它赋值“0001 b”,从而使GPIOB0 引脚设置成输出模式,速度为 10M。代码中使用了“&=~”、“|=”这种操作方法是为了避免影响到寄存器中的其它位,因为寄存器不能按位读写,假如我们直接给 CRL 寄存器赋值:1 GPIOB_CRL = 0x0000001;
这时 CRL 的的低 4 位被设置成“0001”输出模式,但其它 GPIO 引脚就有意见了,因为其它引脚的 MODER 位都已被设置成输入模式。
在这里插入图片描述

2.控制引脚输出电平

在输出模式时,对端口位设置/清除寄存器 BSRR 寄存器、端口位清除寄存器 BRR 和ODR 寄存器写入参数即可控制引脚的电平状态,其中操作 BSRR 和 BRR 最终影响的都是ODR 寄存器,然后再通过 ODR 寄存器的输出来控制 GPIO。

GPIOB_ODR &= ~(1<<0);// PB0 输出低电平

在这里插入图片描述

3.开启外设时钟

STM32的 外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。STM32 的所有外设的时钟由一个专门的外设来管理,叫 RCC。

RCC_APB2ENR |= (1<<3);// 开启 GPIOB 端口 时钟

在这里插入图片描述

二、编程实现

流水灯原理:
亮灯状态用1表示,灭灯状态用0表示
初始状态为0 0 0
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一
一直循环达到流水灯效果

1.C语言

#include "stm32f10x.h"
#define RCC_APB2ENR		*((unsigned volatile int*)0x40021018)
#define GPIOA_CRL		*((unsigned volatile int*)0x40010800)
#define	GPIOA_ODR		*((unsigned volatile int*)0x4001080C)
#define GPIOB_CRL		*((unsigned volatile int*)0x40010C00)
#define	GPIOB_ODR		*((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH		*((unsigned volatile int*)0x40011004)
#define	GPIOC_ODR		*((unsigned volatile int*)0x4001100C)
 void Delay()
 {
   u32 i=0;
   for(;i<5000000;i++);
 }
 int main(void)
 {	
	RCC_APB2ENR|=1<<2|1<<3|1<<4;			
	GPIOA_CRL&=0xFFF0FFFF;		
	GPIOA_CRL|=0x00020000;	
	GPIOA_ODR&=~(1<<4);			
	GPIOB_CRL&=0xFF0FFFFF;		
	GPIOB_CRL|=0x00200000;		
	GPIOB_ODR&=~(1<<5);			 
	GPIOC_CRH&=0xF0FFFFFF;		
	GPIOC_CRH|=0x02000000;	
	GPIOC_ODR&=~(1<<14);		
	while(1){
		GPIOA_ODR|=1<<4;		
	 	Delay();
		GPIOA_ODR&=~(1<<4);		
		GPIOB_ODR|=1<<5;		
	 	Delay();
		GPIOB_ODR&=~(1<<5);		
		GPIOC_ODR|=1<<14;	
	 	Delay();
		GPIOC_ODR&=~(1<<14);		
		}
}

2.汇编语言

 AREA MYDATA, DATA
	
 AREA MYCODE, CODE
	ENTRY
	EXPORT led

led
    ldr r0, =0x40021018
    ldr r1, =0x0000001c
    str r1, [r0]                

	ldr r0, =0x40010800
    ldr r1, [r0]
    bic r1, r1, #0x000f0000
    orr r1, r1, #0x00010000
    str r1, [r0]

    ldr r0, =0x40010c00
    ldr r1, [r0]
    bic r1, r1, #0x00f00000
    orr r1, r1, #0x00100000
    str r1, [r0]
	
	ldr r0, =0x40011004
    ldr r1, [r0]
    bic r1, r1, #0x0f000000
    orr r1, r1, #0x01000000
    str r1, [r0]
    
	ldr r0, =0x4001080c
    ldr r1, =0x00000010
    str r1, [r0]

	ldr r0, =5000000;
    ldr r1, =0
	
blink
    add r1, r1, #1
    cmp r1, r0
    blt blink
	
	ldr r1, =0x4001080c
    ldr r2, [r1]
    eor r2, r2, #0x00000010
    str r2, [r1]
	
	ldr r1, =0x40010c0c
    ldr r2, [r1]
    eor r2, r2, #0x00000020
    str r2, [r1]
	
	ldr r1, =0

blink1	
	add r1, r1, #1
    cmp r1, r0
    blt blink1
	
	ldr r1, =0x40010c0c
    ldr r2, [r1]
    eor r2, r2, #0x00000020
    str r2, [r1]
	
	ldr r1, =0x4001100c
    ldr r2, [r1]
    eor r2, r2, #0x00004000
    str r2, [r1]
	
	ldr r1, =0

blink2
	add r1, r1, #1
    cmp r1, r0
    blt blink2
	
	ldr r1, =0x4001100c
    ldr r2, [r1]
    eor r2, r2, #0x00004000
    str r2, [r1]
	
	ldr r1, =0x4001080c
    ldr r2, [r1]
    eor r2, r2, #0x00000010
    str r2, [r1]
	
	ldr r1, =0
    b blink	
    
	END

3.实现

效果视频:STM32F103寄存器方式点亮LED流水灯
波形图显示:
在这里插入图片描述
在这里插入图片描述
间隔差为0.000002s,周期grid为0.2微秒,换算后正好为1s。

三、总结

学习和理解了STM32F103系列芯片的地址映射和寄存器映射原理;了解了GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。

四、参考

1.STM32寄存器点亮流水灯的三种方法
2.STM32用汇编点亮LED灯

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103寄存器方式点亮LED流水灯 的相关文章

  • centos 7 安装 samba

    centos 7 安装 samba 最近想在linux系统下开发C 43 43 程序 xff0c 想用window的编辑器写代码 xff0c 所以在centos 系统下安装了samba xff0c 让window系统挂载centos 系统的
  • win10如何退出“暂停7天更新”? 恢复自动更新

    services msc 微软社区的解答 xff0c 我复bai制的 断开网络进du行如下操作 xff0c 如果遇到zhi程序占用的问题 xff0c 操作进入到dao安全模式 xff08 设置 更新和安全 恢复 立即重启 xff09 进行
  • 关于Qt中线程的挂起和唤醒问题

    为了平台的可移植性 xff0c 现在好多公司或开发者都在用Qt开发 xff0c 但是Qt开发文档有一个不非常理想的问题是 xff0c 有些问题描述的不是太详细 xff0c 特别是涉及到线程的挂起 xff0c 唤醒 和sleep 等问题 在Q
  • vscode不能跳转到定义的解决方法

    vscode不能跳转到定义的解决方法 0 分析1 安装global的依赖2 安装global3 安装插件并生成索引文件 0 分析 在Linux上使用vscode时发现跳转到定义非常缓慢 xff0c 甚至不能用 打开扩展C 43 43 Int
  • UI----UIslider 和UIcontrol的属性

    UISlide 属性 minimumValue 当值可以改变时 xff0c 滑块可以滑动到最小位置的值 xff0c 默认为 0 0 slider minimumValue 61 10 0 maximumValue 当值可以改变时 xff0c
  • JAVA转义字符详解

    一 JAVA中反斜杠 的作用 在不同的系统中 xff0c 路径的分隔符不同 xff0c 故需要做出判断 xff0c 并切换分隔符 VBS代码中确实不用转义 xff0c 但是在JAVA或JS中 xff0c 它采用的是C语言的语法 xff0c
  • 枚举(enum)

    一 什么是枚举 我们学习过单例模式 xff0c 即一个类只有一个实例 而枚举其实就是多例 xff0c 一个类有多个实例 xff0c 但实例的个数不是无穷的 xff0c 是有限个数的 例如word文档的对齐方式有几种 xff1a 左对齐 居中
  • 安卓so包常见报错问题

    一 lib arm64 system lib64 vendor lib64 couldn 39 t find 34 libAndroidIDCard so 我没有在libs文件夹下面创建类似 arm64 v8a 这个文件夹 xff0c 因为
  • Ubuntu详解

    介绍 Ubuntu是一个以桌面应用为主的Linux操作系统 xff0c 其名称来自非洲南部祖鲁语或豪萨语的 ubuntu 34 一词 xff0c 意思是 人性 我的存在是因为大家的存在 34 xff0c 是非洲传统的一种价值观 Ubuntu
  • Selinux详解

    一 介绍 1 1百度百科 SELinux Security Enhanced Linux 是美国国家安全局 xff08 NSA xff09 对于强制访问控制的实现 xff0c 是 Linux历史上最杰出的新安全子系统 NSA是在Linux社
  • repo init详解

    首先选择manifest源 xff0c 一般直接使用清华或中科大的镜像源 repo init u https aosp tuna tsinghua edu cn platform manifest是清华提供的镜像源 repo init u
  • Android Gradle plugin requires Java 11 to run.

    报错分析 因为别人拷过来的项目gradle版本不同 xff0c 对于jdk的兼容性要求不同 之前调试什么东西 xff0c 不小心改了环境的的某个部分 xff0c 现在莫名其妙所有的项目都运行不了了 后来百度翻译了一下 xff0c Andro
  • 安卓稳定性技术栈

    涉及技术内容 xff1a framework java层 语言 xff1a Java 1 开机启动流程 xff1a Android 7 0平台开机启动 android7 0开机自启 jamousjang的博客 CSDN博客 Android系
  • keil在线调试STM32,点三次运行才能跑到main的问题解决。

    现象 使用keil开发STM32 xff0c 下载完程序后 xff0c 不能运行 在main 的入口处加打印 xff0c 啥也没打出来 xff0c 说明程序都没跑到main 在线调试debug时发现了个有意思的现象 xff0c 每次都是点击
  • JAVA中“...”三个点

    可变长参数 xff0c 就是这个位置可以传入任意个该类型参数 简单来说就是个数组 1 testPoints 7 2 testPoints 7 9 11 3 testPoints new Integer 7 9 11 1 public sta
  • IMSI,SN,IMEI分别是什么意思

    1 IMSI 国际移动用户识别码 xff08 IMSI xff1a International Mobile Subscriber Identification Number xff09 是区别 移动用户 的标志 xff0c 储存在 SIM
  • Glide详解

    现在Android上的图片加载框架非常成熟 xff0c 从最早的老牌图片加载框架UniversalImageLoader xff0c 到后来Google推出的Volley xff0c 再到后来的新兴军Glide和Picasso xff0c
  • ubuntu软件包系统已损坏

    多半是上次更新没有更新完 span class hljs built in sudo span apt get clean 说明 删除包缓存中的所有包 将 var cache apt archives 的 所有 deb 删掉 span cl
  • 机器学习及深度学习中的符号说明

    文章目录 数和数组集合和图索引线性代数中的操作微积分概率和信息论函数数据集和分布 数和数组 a a a 标
  • 51单片机系列外部中断(附源码)

    要求 用STC89C51单片机 xff0c 按键 xff0c LED灯完成外部中断实验 程序中点亮LED流水灯 xff0c 当按键按下时 xff0c 外部中断触发 xff0c 程序转至中断服务程序 xff0c 在中断服务程序中使LED灯全亮

随机推荐

  • Linux执行Jar包出现ClassNotFound、“main”找不到主类

    在Linux虚拟机系统执行jar包的过程中 xff0c 经常会出现类似ClassNotFound等类似的错误 xff0c 无法完成jar包的运行 xff0c 根据经验 xff0c 总结几点如下 xff0c 便于自己记忆 xff0c 后期查看
  • Linux中文乱码问题终极解决方法

    方法一 xff1a 修改 root bash profile文件 xff0c 增加export LANG 61 zh CN GB18030 该文件在用户目录下 xff0c 对于其他用户 xff0c 也必须相应修改该文件 使用该方法时putt
  • CentOS7

    Konsole使用方法 root用户 su su root 打开文件修改文件 按 i 编辑 xff0c esc退出编辑 xff0c 然后 wq 保存退出 vi etc selinux config 桌面环境 yum y groups ins
  • 【模拟测试题】

    B题 题意 xff1a 在另一个位面 xff0c 世界末日发生了 东东作为诺亚方舟的船长 xff0c 他现在从月球开始启动诺亚方舟去其他星球营救民众 东东从若干星球将人运回大本营 xff0c 星球的数目以及每个星球的坐标和人数都将由输入决定
  • 解决Qt Qml应用使用windeployqt部署后仍不能运行的问题

    问题描述 在Windows系统中官方推荐使用windeployqt xff0c 使用C 43 43 开发的应用程序使用windeployqt很好用 xff0c 但是使用Qml开发的应用却不能运行 xff0c 双击之后一点反应也没有 解决方法
  • 模拟题【Week15实验】

    A题 题意 xff1a Q 老师有 N 个学生 xff0c 每个学生都有各自独立的编号 xff0c 且编号范围在 1 N 之间 这一天 xff0c 所有学生都在不同的时间进入教室 Q 老师记录了当编号为 i 的学生进入教室时 xff0c 教
  • 代码Bug太多?给新人Code Review头都大了?快来试试SpotBugs

    如果你需要一个自动化的工具帮助你或者你的团队发现代码中的缺陷 xff0c 在提升代码质量同时减少人工Code Review的成本 xff0c 那这篇文章非常的适合你 本文围绕SpotBugs与Gradle集成 xff0c 将相关配置和使用进
  • Ubuntu 16.04.1配置远程连接(xrdp)

    本文主要介绍如何在windows下连接Ubuntu 16 04 1系统 一 系统信息 1 win7 xff0c win8 xff0c win10均可 xff0c 但需要确认系统为专业版或企业版 xff0c 家庭版无法远程连接Ubuntu系统
  • 刚毕业的表弟年薪40w......程序员薪资天花板?

    前不久 xff0c 腾讯2022校招 应届毕业生年薪 40 万 刷屏了 尽管互联网大厂的薪资高不算什么新鲜事儿 xff0c 但这个热搜仍然让我大受震撼 腾讯校招官网显示 xff0c 2022届腾讯校招开放技术 产品 设计等岗位共计 78 个
  • MySQL5.7安装与配置(YUM)

    原文链接 xff1a http blog csdn net xyang81 article details 51759200 安装环境 xff1a CentOS7 64位 xff0c MySQL5 7 1 配置YUM源 在MySQL官网中下
  • ACM竞赛入门,从零开始

    前言 ACM竞赛其实可以在编程初级阶段边学边练 xff0c 门槛没有比想象中高那么多 xff0c 如果实在不会做也可以直接在网上搜题分析答案 xff0c 弄懂后自己再亲手写出来 xff0c 当然你需要懂得基本的语义 语法 xff0c 保证看
  • matlab寻找函数对应的工具箱

    官方文档说函数对应的工具箱就在函数的介绍页面上方 xff0c 一开始没看懂什么意思 xff0c 后面知道怎么看了 红色方框内的即使函数所在工具箱的信息 例如这个finv函数就在Statistics and Machine Learning工
  • Collecting package metadata (current_repodata.json): done Solving environment: failed with repodata

    用 conda create name test python 61 3 4创建 python3 4 版本的 test环境报错 xff0c 然后在指定位置创建了一个文件 注意到这句话 xff0c 没有找到包 xff0c 换命令为 conda
  • navicat创建数据库后显示图标灰色,右键后无法新建数据库

    双击你的连接即可
  • unity_导出场景、包

    会发现以场景为单位的各种依赖都包括进来了
  • vscode + gdbserver 实现交叉调试

    0 前言 鉴于以下的痛点 xff0c 尝试了一下gdbserver配合vscode xff0c 发现十分好用 应用程序比较大 xff0c 依赖的库也很多 xff0c 设备上没有足够的存储空间 设备没有预留显示接口 在终端里面放断点调试效率低
  • Ubuntu14.04/Linux安装LLVM/clang-3.7(带有标准库 libc++,libc++abi)

    参考文章 https github com yangyangwithgnu use vim as ide 7 1 1 http blog csdn net firebird321 article details 48528569 一 不需源
  • 1.1小程序内置tabbar和自定义tabbar区别

    文章目录 内置tabbar自定义 tabbar创建文件夹 custom tab bar发现小程序自定义tabBar切换颜色总是比点击慢一步switchtab报错 switchTab fail page pages home pages me
  • 无基础小白 js 快速入门1.1

    文章目录 js的运行方法1js的运行方法2如何编写js代码如何运行js文件调试基本语法不一定用 结尾语句块注释 数据类型和变量Number字符串布尔值比较运算符null 和 undefined数组对象变量 区分动态语言和静态语言 js的运行
  • STM32F103寄存器方式点亮LED流水灯

    STM32F103寄存器方式点亮LED流水灯 一 程序设计思路1 GPIO 模式2 控制引脚输出电平3 开启外设时钟 二 编程实现1 C语言2 汇编语言3 实现 三 总结四 参考 以 STM32最小系统核心板 STM32F103C8T6 4