使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

2023-05-16

板子:普中科技stm32F1(芯片stm32f1103zet6

1 程序如下:

#include "stm32f10x.h"  //导入头文件

typedef unsigned int u32;//typedef是系统关键字之一,用来给数据类型取一个“别名”,这里就是把unsigned int取名为u16,之后可以用u16定义无符号整型变量了,如,u16 a,b;

void SystemInit()
{
	
}


void delay(u32 i)
{
	while(i--);
}


int main()
{
	RCC_APB2ENR|=1<<4;  //开启GPIOC端口时钟
	GPIOC_CRL&=~(0x0f<<(4*0));
	GPIOC_CRL|=(3<<4*0);
	GPIOC_BSRR=(1<<(16+0));
	while(1)
	{
		GPIOC_BSRR=(1<<(16+0));  //点亮LED
		delay(0xfffff);
		GPIOC_BSRR=(1<<(0));   //熄灭LED
		delay(0xfffff);
	}
}

2首先研究开发板的电路图(红色标号相同说明这两个硬件是连在一起的,即LED1和芯片的26号引脚连在一起),要想点亮灯,需要让26(pc0)引脚输出低电平,即可点亮,即二极管的阳极是3.3,阴极是0,所以二极管导通发光(二极管和LED就认为是一个东西吧,其实也就是一个东西)。

该段程序是使用老师教的自建的寄存器

启动文件是系统带的,可以自己查找,这里已经给出,采用汇编语言编写,芯片插电的时候就会从该文件启动一些必要的功能程序,例如初始化的堆栈、指针,pc初始化程序计数器、设置中断、中断的向量表、入口地址。程序在启动时会进入SystemInit这个函数,所以在main.c文件中写了SystemInit{}空函数,不写这个会报错,虽然没用它实现系统初始化功能,但还是得写。,执行完这个,就要执行MAIN(),启动文件更多功能在“普中STM32F1**开发攻略”和“Cortex M3,涉及了寄存器得指令”可查得 。

3 编写控制LED程序

我们要实现的功能:点亮第一个LED,即D1指示灯亮

(1)要操作STM32寄存器,需要使用c语言对其封装,封装的这部分程序放在STM32F10x.h中

让26号管脚(pc0看芯片图,pc0就是26号管脚)输出低电平,需要对其操作,即对GPIO(通用io口)的配置,所以让GPIO配置为输出模式,,对IO口没有特殊要求,都配置为推挽的输出,还有输出的速度,输出是高电平还是低电平(对ODR进行操作),这些都通过查手册GPIO那一章了解到,

要对寄存器以下封装:

stm32f10x.h 文件

#define PERIPH_BASE      ((unsigned int)0x40000000) //定义GPIO外设的基地址,即BLOCK2的首地址
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000)
#define GPIOC_BASE       (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL 	 	 *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH 	 	 *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR 	 	 *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR 	 	 *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR 	 	 *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR 	 	 *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR 	 	 *(unsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)
#define RCC_BASE 		 (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR 	 *(unsigned int*)(RCC_BASE+0x18) 

A:    首先要明白GPIO 这个外设挂接在BLOCK2(所有片内外设都在这个区)区,所以要定于GPIO外设的总线基地址

#define PERIPH_BASE      ((unsigned int)0x40000000) //定义GPIO外设的基地址,即BLOCK2的首地址

BLOCK2的首地址查芯片手册: 普中科技stm32-F1\6--芯片资料\开发板芯片数据手册\STM32F103ZET6.pdf的第四章memory mapping,

B.外设分了很多,GPIO(挂接到APB2)是挂接在APB1、APB2总线、AHB总线,就得找到对应挂接总线的位置,开发攻略里有

#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000)

 C.APB2里面挂接了很多外设,例如所以需要知道GPIOC对应的APB2基地址的偏移量:

#define GPIOC_BASE       (APB2PERIPH_BASE + 0x1000)

用上表的GPIOC起始地址减一下APB2的基地址,就可以算出偏移量

D. GPIOC里面封装了好多寄存器,CR\IDR\ODR\BSRR等等。

#define GPIOC_CRL 	 	 *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH 	 	 *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR 	 	 *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR 	 	 *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR 	 	 *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR 	 	 *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR 	 	 *(unsigned int*)(GPIOC_BASE+0x18)

查中文参考手册的第8章

正式对寄存器开始操作了,例如GPIOC_CRL(端口配置低寄存器),不能直接对这个(GPIOC_BASE+0x00)地址写在这儿,keilb并不能识别这是地址,只认为这是立即数,要让它知道是地址,就将这个地址强制转换成指针类型unsigned int*,(*是指针运算符),要求的地址里面的数据,还得再加一个指针*,通过这样的一个宏定义,后面通过 GPIOC_CRL这个名字就能操控这个寄存器的内容了

E.操控GPIO还需要对时钟RCC进行开启,只有开启时钟才能对GPIO进行控制(必须,在操作任何外设之前都应该开启该外设的时钟),找到GPIO外设的时钟基地址,

#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)
#define RCC_BASE 		 (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR 	 *(unsigned int*)(RCC_BASE+0x18)

(2)开始点亮LED

#include "stm32f10x.h"  //导入头文件

typedef unsigned int u32;//typedef是系统关键字之一,用来给数据类型取一个“别名”,这里就是把unsigned int取名为u16,之后可以用u16定义无符号整型变量了,如,u16 a,b;

void SystemInit()
{
	
}


void delay(u32 i)
{
	while(i--);
}


int main()
{
	RCC_APB2ENR|=1<<4;  //开启GPIOC端口时钟
	GPIOC_CRL&=~(0x0f<<(4*0));
	GPIOC_CRL|=(3<<4*0);
	GPIOC_BSRR=(1<<(16+0));
	while(1)
	{
		GPIOC_BSRR=(1<<(16+0));  //点亮LED
		delay(0xfffff);
		GPIOC_BSRR=(1<<(0));   //熄灭LED
		delay(0xfffff);       
	}
}
	RCC_APB2ENR|=1<<4;  //开启GPIOC端口时钟

 

查看中文参考手册的6.3章:RCC_APB2ENR,看到第四位1控制时钟开启IOPC,但是又不影响其他的位,通过或运算防止对其他位的干扰,

 

下面对GPIOC_CRL寄存器模式进行配置(通用推挽输出和输出模式最大速度50HZ):

 

	GPIOC_CRL&=~(0x0f<<(4*0));  //将寄存器低四位置零

CRL寄存器控制低八位引脚,CRH寄存器控制高八位引脚,GPIOC0是低八位,所以用CRL寄存器来配置,需要哪些控制,工作模式(输出功能)、并且是推挽输出, 0是指控制第零位 LED灯,4是指寄存器低四位,0x0f是1111,取反再进行与操作,就不会影响其他位的值。即令值为1111,再左移(4*0)位,相当。

GPIOC_CRL|=(3<<4*0);   //配置GPIOC_CRL第四位

我猜3应该是配置11,不移位,并且当MOOE不为00的时候,这个寄存器的端口GPIOC就是输出模式。 

GPIOC的模式控制好了,接下来就是控制pc0(LED)输出数据,因为最终要控制灯嘛,要让灯点亮就输出0嘛。就要用到8.2.4的端口输出数据寄存器(GPIOX_ODR)或者端口位设置/清除寄存器(GPIOx_BSRR),

端口位设置清除寄存器也可以对其进行输出操作,通过它控制端口输出寄存器来控制输出电平,

 

 

GPIOC_BSRR=(1<<(16+0));   //控制输出为低电平

 赋值为1后,左移i6位,+0是第0个LED,要是第二个,就要加2,即第16位进行清除操作

然后就编译,烧录,LED灯闪烁。

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

使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6) 的相关文章

  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 查找到 LED 的距离

    想象一下 您有一个圣诞树风格的 LED 灯 距相机的距离为 D 了解了 LED 灯 例如形状和强度 和相机 例如焦距 的属性 是否可以使用快照计算从相机到 LED 灯的距离 如果是 测量的准确度如何 明亮的光源本身对此不利因为明亮的光线通常
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 罗技的 LED 照明 SDK 无法与我的 G502 配合使用

    我想得到罗技自己的 LED SDK http gaming logitech com en us developers正在使用我的 G502 但我不能 我使用的是 SDK 版本 8 82 7 这是迄今为止的最新版本 我在 SO 或互联网的其
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 将 Arduino RGB LED 从一种颜色渐变为另一种颜色?

    目前 我已成功让 LED 灯循环显示我选择的八种颜色 一切都工作正常 除了我想要一种更自然的感觉 并且想要从一种颜色褪色 过渡到下一种颜色 而不是让它们互相替换 到目前为止 这是我的代码 int redPin 11 int greenPin
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 通过 SSH 的 Pygame 不注册击键(Raspberry Pi 3)

    所以我得到了 raspi 3 和简单的 8x8 LED 矩阵 在玩了一些之后 我决定用 pygame 的事件制作一个简单的蛇游戏 显示在该矩阵上 我之前没有 pygame 的经验 除了 LED 矩阵之外 没有连接任何屏幕 显示器 所以最初的
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我

随机推荐

  • VSCode使用Clangd

    前言 在使用微软的C C 43 43 插件时 xff0c 遇到较大项目时 xff0c 代码提示速度非常的慢 xff0c 这时可以使用clangd 1 系统安装clangd 版本选择 xff1a Linux github仓库 https gi
  • 常用通信时序之UART、IIC、SPI(基于STM32)

    常用通信时序 xff08 UART IIC SPI xff0c RS232 RS485 xff09 及协议 xff08 Modbus xff09 通讯时序1 UART2 IIC3 SPI4 RS3235 RS485 通信协议1 Modbus
  • 如何使用SVN查看具体某行代码的提交人、合并分支或者拉取新分支

    1 如何在SVN上查看具体某一行代码的提交人 xff1a 首先选中该文件 xff0c 然后点击 追溯 xff0c 如上图可以选择该文件对应的版本区间 默认不需要设置 如果需要查询该文件在某个特定版本区间的修改人 xff0c 则可以在上面设定
  • 针对lenovo R7000平台的Ubuntu 18.04双硬盘双系统搭建

    双固态双系统安装 分区及启动挂载点 双固态需要把EFI启动项放在同一个硬盘中即在ubuntu分区时应将efi分区建立在和win10同一硬盘中 xff0c 选择启动挂载点时选择该efi分区或者直接不建立efi分区 xff0c 直接挂载在win
  • 如何使用ublox ZED-F9P 配置基准站、移动站+差分电台实现RTK定位

    格林恩德F9P RTK模块 xff0c 集成高精度板卡 ZED F9P 可同时接收GPS 北斗 xff0c GALILEO GLONASS 卫星系统的L1 L2频点 xff0c 结合高精度天线一体化设计 xff0c 体积小 xff0c 重量
  • 北斗卫星导航有哪些频段

    北斗系统是全球第一个提供三频信号服务的卫星导航系统 xff0c GPS使用的是双频信号 xff0c 这是北斗的后发优势 使用双频信号可以减弱电离层延迟的影响 xff0c 而使用三频信号可以构建更复杂模型消除电离层延迟的高阶误差 同时 xff
  • 北斗短报文介绍

    1 什么是北斗短报文通信 xff1f 北斗系统的短报文通信 xff0c 是指北斗地面终端和北斗卫星 北斗地面监控总站之间能够直接通过卫星信号进行双向的信息传递 xff0c 通信以短报文 xff08 类似手机短信 xff09 为传输基本单位
  • 什么是星基增强系统SBAS

    SBAS xff1a 英文全称Satellite Based Augmentation System xff0c 中文意思是广域差分增强系统 xff0c 如果不知道这是什么意思 xff0c 那么说星基增强系统相信大家都知道 广域差分增强系统
  • GNSS PPP和PPK区别

    01 PPP PPP全称Precise Point Positioning xff0c 译为精密单点定位 xff0c 属于单点定位也叫绝对定位 xff0c 精密单点定位是指利用载波相位观测值以及由IGS等组织提供的高精度的卫星星历及卫星钟差
  • 三轴加速度计计算俯仰角、横滚角、偏航角

    pitch是俯仰角 xff0c 是 点头 xff0c xff08 在固定翼飞机中则由升降舵舵机控制 xff09 yaw是偏航角 xff0c 是 摇头 xff0c xff08 在固定翼飞机中则由方向舵舵机控制 xff09 roll是旋转角 x
  • 如何使用UBLOX ZED-F9P +4G获取千寻差分,实现厘米级定位同时回传到IP服务器

    格林恩德F9P 4G RTK模块 xff0c 集成高精度板卡ZED F9P以及4G模组 xff0c 可同时接收GPS xff0c 北斗 xff0c GALILEO GLONASS卫星系统的L1 L2频点 xff0c 结合高精度天线一体化设计
  • 小型RTK/LITE RTK/Mini RTK CR202(9P+4G+imu) 惯导 实现高精度厘米级定位,输出组合导航位置,定位数据回传服务器

    格林恩德 CR202 是一款小巧 迷你的RTK设备 xff0c 集成高精度板卡 ZED F9P 与4G EC20通信模组 xff0c 内置惯性导航IMU三轴加速度计 三轴陀螺仪 CAN收发器 xff0c 支持多种差分链路包括4G 电台 支持
  • 常用CORS账号设置方法(千寻CORS、中国移动CORS、六分CORS、北斗CORS、迅腾CORS)

    1 千寻CORS账号设置方法 2 中国移动CORS账号设置方法 3 六分CORS账号设置方法 4 北斗CORS账号设置方法 5 讯腾CORS账号设置方法 格林恩德专注GPS北斗高精度定位 北斗短报文通信与无线传输应用产品的开发与市场拓展
  • NTRIPClient_1.7 工具使用方法分享

    1 打开NTRIPClient 1 7软件 2 选择串口和波特率 xff0c 正确的与板卡或者模块连接 点击编辑 xff0c 进入串口配置界面 选择正确的端口和波特率 3 输入正确的差分账号 输入千寻差分账号地址 端口 用户名 账号密码 4
  • 导航卫星的时间系统

    1 GPS时间系统 xff08 GPST xff09 GPS系统是测时测距系统 时间在 GPS测量中是一个基本的观测量 卫星的信号 xff0c 卫星的运动 xff0c 卫星的坐标都与时间密切相关 对时间的要求既要稳定又要连续 为此 xff0
  • JT808协议介绍 --- 格林恩德 CR202 RTK 高精度车载定位器协议解读

    部标808又称为JT808 xff0c JT808标准的全称是 道路运输车辆卫星定位系统终端通讯协议及数据格式 808协议适用于GPS定位车载终端和监控平台之间的通信 当前市面上 xff0c 普通车辆监测设备所安装的GPS定位器 xff0c
  • C++析构函数调用顺序

    文章目录 析构函数工作过程 1 执行析构函数的函数体 2 如果该类中拥有类对象成员 xff0c 且类对象有析构函数 xff0c 则以类对象成员声明次序的相反顺序调用其析构函数 xff0c 销毁类对象成员 3 按原来构造顺序的相反顶序向上依次
  • TCP通信C++实现小例子

    TCP通信C 43 43 实现案例 https www bilibili com video BV1Dt411p74c t 61 1746 61 61 全部来自以上视频 xff0c 纯属搬运 xff0c 小可爱有问题可以举手提问哈 61 6
  • 串行通信简介

    一 串行通信与并行通信 计算机与外界的数据交换称为通信 xff0c 通信分为并行通信和串行通信两种基本方式 并行通信 串行通信 并行通信 xff1a 并行通信指各个数据位同时进行传送的数据通信方式 xff0c 因此有多少个数据位 xff0c
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键