使用寄存器点亮一个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) 的相关文章

  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 查找到 LED 的距离

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

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学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 或互联网的其
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 将 Arduino RGB LED 从一种颜色渐变为另一种颜色?

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

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 如何在没有微控制器的情况下用 C++ 连接 LED 灯?

    我想在没有微控制器的情况下点亮 关闭 LED 我希望通过编写 C 程序来控制 LED 但我遇到的问题是把它们连接起来有没有免费的方法 如果相关的话 我正在使用 Windows XP 我有 LED 但没有微控制器 好吧 我找到了一些函数 但它
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 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 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • 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是系统关键