点击上方“蓝字”关注我们

物联网协会终于把公众号密码记起来了???

在学习编程语言的时候,第一个程序

是"Hello World!"

学习51单片机的时候,第一个程序

是点亮LED灯

现在开始学习到STM32

第一个程序必须也得是点亮LED灯

因为“祖师爷”说过

当能够输出"Hello World!"或者点亮LED灯的时候,就掌握了90%的知识,可以出师了

1

注:虽然现在趋势是使用STM32CubeMX生成HAL库来编写,但为了让大家理解下STM32的底层操作,本次将使用寄存器操作方式来实现点亮LED灯。小编使用STM32103RCT6芯片的开发板演示。

新建工程模板

使用Keil5就像使用51单片机一样创建一个工程项目,只不过将芯片选择为自己所使用的;加上main.c后编写main函数,编译一轮发现报错了

这主要是因为没有添加启动文件,其实在新建51单片机工程的时候自动添加了STARTUP.A51文件,而在STM32中就要手动添加。

添加启动文件

首先要选择适合自己芯片的启动文件,打开STM32F10X的固件库并且通过FLASH容量进行选择。

小编的是256k容量,选择的是"startup_stm32f10x_hd.s"

把启动文件添加放到工程目录下,打开工程添加刚刚的启动文件。并且main.c下添加一个函数 void SystemInit(void){   }

配置相关寄存器

不管是使用库函数或者HAL库开发,其实都是对寄存器的操作。通过开发板原理图可以发现LED0的引脚为PA8、LED1的引脚为PD2,输出低电平时点亮LED灯。

通过查看“STM32F10x参考手册”配置寄存器,发现控制IO口输出高电平还是低电平的有3个,但是只需要配置ODR寄存器就可以了。ODR寄存器的偏移地址是0x0C,若是点亮LED1即是将PD2置0。首先找到GPIOD的起始地址再加ODR寄存器的偏移地址就能够对PD2引脚进行清零操作了。

GPIOD起始地址:0x4001 1400

ODR的偏移地址:0x0C

两个地址相加后:0x4001 140C

PD2置0:0X4001 140C &= ~(1 << 2);

把程序下载到开发板发现LED并没有点亮。

这是因为STM32和51单片机不同,STM32的IO口为输入模式还是输出模式也是由寄存器控制的。看参考手册得知有“端口配置低寄存器(CRL)”配置0到7位“端口配置高寄存器(CRH)”配置8到15位

GPIOD起始地址:0x4001 1400

CRL的偏移地址:0x00

两个地址相加后:0x4001 1400

PD2写1:0X4001 1400 |= (1 << (2 * 4));

再次下载开发板后,LED灯果然还是不亮的!!!

这是因为STM32为了降低功耗,每个外设都有时钟控制的,默认是全部关闭的,要是使用外设就要打开时钟。时钟是由RCC寄存器控制的,且挂载在APB2总线上。

所以只要找到RCC寄存器的起始地址然后加上APB2的偏移地址就可以使能GPIO时钟了。

RCC起始地址:0x4002 1000

APB2的偏移地址:0x18

两个地址相加后:0x4002 1018

使能GPIOD:0x4002 1018 |= (1 << 5 );

完整代码

下载到开发板后,LED灯神奇地点亮了!!!

总结操作步骤

  1. 在main.c下添加一个void SystemInit(void){          } 函数

int main(void){  while(1)  {      }}void SystemInit(void){}

2.在确定LED的引脚和输出模式后,首先打开GPIO的时钟。即是RCC寄存器的起始地址加上APB2总线的偏移地址,然后根据IO口位置进行配置。比如使能GPIOA就是 1 << 2 ; 使能GPIOD就是 1 << 5。

//RCC寄存器的起始地址:0x40021000//APB2总线的偏移地址: 0x18//相加得到:0x40021018//要是想使能GPIOD就只对第5位进行写1操作// 0x40021018 |= (1 <//由于是对地址进行操作,那就需要指针变量了  *(unsigned int*)0x40021018 |= (1 <

3. 配置CRL寄存器,配置为通用推挽输出模式(前提是引脚在0到7位,若是8到15位如“PA8” 就是去配置CRH高寄存器了 )。要是将PD2配置为通用推挽输出模式(在CNFy[1:0]中选“00”),最大速度为10MHz(在MODEy[1:0]选择"01"代表输出模式,最大速度为10MHz)。由于是PD2即配置CNF2[1:0]MODE2[1:0],即是将第8到第11位配置成“  0001  ” 将第8位写1:1 << 8

// GPIOD的起始地址:0x40011400// CRL寄存器的偏移地址:0x00// 两者相加:0x40011400//配置为通用推挽输出模式和选择最大速度*(unsigned int*)0x40011400 |= (1 << 8);

4.配置ODR寄存器,选择是输出高电平还是低电平。然后对相应的引脚进行配置,高电平时是1,低电平时是0

// GPIOD的起始地址:    0x40011400// ODR寄存器的偏移地址:0x0C// 两者相加:0x4001140C//若是配置PD2为低电平 点亮LED灯,即是对第2位清零操作*(unsigned int*)0x4001140c &= ~(1 << 2);//若是配置PD2为高电平 熄灭LED灯,即是对第2位写1操作*(unsigned int*)0x4001140c |= (1 <2);

本次分享就到这啦

欢迎大家和小编共同学习STM32

回复关键词【0412】可以获取固件库

stm32呼吸灯程序_STM32寄存器操作点亮LED灯相关推荐

  1. 点亮led灯的个数_一个点亮LED灯需要多大电流?

    展开全部 不同功率的单个LED灯的最大工作电流不一样,LED灯里面有大功率和32313133353236313431303231363533e59b9ee7ad9431333433626434小功率的 ...

  2. 4.3、使用寄存器版本点亮LED灯(内附代码)

    第一种:指针形式 led.c文件:#include "led.h" #include "stm32f4xx.h" void LED_Init(void) {// ...

  3. 点亮led灯c语言程序,求最简单点亮LED灯单片机c语言程序

    /*    添加包含芯片的头文件    */ #include  /*  头文件 */ //由原理图得知,给LED一个低电平,LED亮.否则LED不亮. #define         LED1_ON ...

  4. STM32笔记2-使用库函数点亮LED灯

    目录 一.硬件电路设计 二.软件设计 1.工程配置 2.程序编写 (1)led头文件 (2)Led_Init()函数编写 三.实验测试 四.使用宏定义 1.修改后的led.h中程序 2.修改后的Led ...

  5. stm32呼吸灯程序_STM32裸机开发基础篇02点亮LED

    前言 上一节,我们完成了STM32单片机开发环境的搭建,本节我们正式学习STM32单片机,编程语言的学习,通常是从第一个"hello world"开始,而点灯实验便是单片机学习的开 ...

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

    实验要求:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB.GPIOC.GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒.1)写出 ...

  7. STM32汇编语言点亮led灯

    STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...

  8. stm32点亮LED灯

    stm32点亮LED灯 野火烧不尽,春风吹又生,我购买的是野火的指南针开发板,接下来我就以发表动态来跟大家一起学习,也可以让我学习这块开发板更有动力,增加印象. 每一块开发板,第一个例程无一例外就是通 ...

  9. STM32F03寄存器方式点亮LED流水灯

    STM32F03寄存器方式点亮LED流水灯 文章目录 STM32F03寄存器方式点亮LED流水灯 一.题目内容 二.STM32F03系列芯片的地址映射和寄存器映射映射原理:了解GPIO端口的初始化设置 ...

  10. STM32C8T6之使用寄存器点亮LED灯

    这几天肺炎闹得沸沸扬扬,我窝在家里学习STM32.这篇博客筹备了3-4天吧,终于完成了. 实验电路如下图所示: 这里以PC13为例. 用寄存器点亮LED灯,主要就是操作GPIOx_ODR寄存器,GPI ...

最新文章

  1. A TLS packet with unexpected length was received 解决方法
  2. 数据中心100G主流应用技术分析与市场预测
  3. 编写有效的事条指导原则
  4. 用java建立多项式logit模型_使用mgcv向多项式logit模型添加样条
  5. 用webstorm在chrome 调试页面时一直弹出 copy authorization url to clipboard
  6. k8s查看pod的yaml文件_每天5分钟|轻松掌握开发工作中必会的k8s-yaml配置说明和常用命令...
  7. Mac更新之后使用终端提示:The default interactive shell is now zsh.
  8. 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
  9. 规则引擎 drools_网易考拉规则引擎平台架构设计与实践
  10. python字典的键设置条件格式_openpyxl条件格式设置数字格式
  11. python爬虫技术总结_python爬虫知识点总结(二)爬虫的基本原理
  12. 第二章 马尔科夫决策过程和贝尔曼等式-强化学习理论学习与代码实现(强化学习导论第二版)
  13. Julia : win下cmd和repl中执行.jl程序
  14. 单元测试和sit测试和uat测试
  15. matlab mri的k空间,【基础理论】磁共振成像中K空间概念及其应用
  16. SSD目标检测(Single Shot MultiBox Detector)(一)
  17. 心学与技术-大学之道和尽心知性
  18. UE基础知识:虚幻引擎编辑器界面-英汉对照表
  19. react根据中文获取拼音_react-native按照汉字首字母排序
  20. SPA是什么及原生js实现简易SPA单页面

热门文章

  1. 学子商城项目用springboot后端框架搭建(IDEA)
  2. (Win7重装)向官方Win7镜像注入驱动程序
  3. 世界著名厂家单片机简介
  4. 百度云 java私塾_JAVA私塾-百度云
  5. 10分钟入门Shell脚本编程
  6. Microsoft Office Visio 2007 下载安装密钥
  7. EXT3-fs error和EXT4-fs error小总结
  8. linux之ext、ext1、ext2、ext3、ext4文件系统的区别及常用命令
  9. 好看的个人网站源码_CMS建站,asp cms,cms系统,cms源码,内容管理系统 - 下载列表
  10. uctools.php,Discuz曝出安全隐患 XSS脚本漏洞和uctools.php