stm32呼吸灯程序_STM32寄存器操作点亮LED灯
点击上方“蓝字”关注我们
物联网协会终于把公众号密码记起来了???
在学习编程语言的时候,第一个程序
是"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灯神奇地点亮了!!!
总结操作步骤
在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灯相关推荐
- 点亮led灯的个数_一个点亮LED灯需要多大电流?
展开全部 不同功率的单个LED灯的最大工作电流不一样,LED灯里面有大功率和32313133353236313431303231363533e59b9ee7ad9431333433626434小功率的 ...
- 4.3、使用寄存器版本点亮LED灯(内附代码)
第一种:指针形式 led.c文件:#include "led.h" #include "stm32f4xx.h" void LED_Init(void) {// ...
- 点亮led灯c语言程序,求最简单点亮LED灯单片机c语言程序
/* 添加包含芯片的头文件 */ #include /* 头文件 */ //由原理图得知,给LED一个低电平,LED亮.否则LED不亮. #define LED1_ON ...
- STM32笔记2-使用库函数点亮LED灯
目录 一.硬件电路设计 二.软件设计 1.工程配置 2.程序编写 (1)led头文件 (2)Led_Init()函数编写 三.实验测试 四.使用宏定义 1.修改后的led.h中程序 2.修改后的Led ...
- stm32呼吸灯程序_STM32裸机开发基础篇02点亮LED
前言 上一节,我们完成了STM32单片机开发环境的搭建,本节我们正式学习STM32单片机,编程语言的学习,通常是从第一个"hello world"开始,而点灯实验便是单片机学习的开 ...
- STM32F103寄存器方式点亮LED流水灯
实验要求:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB.GPIOC.GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒.1)写出 ...
- STM32汇编语言点亮led灯
STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...
- stm32点亮LED灯
stm32点亮LED灯 野火烧不尽,春风吹又生,我购买的是野火的指南针开发板,接下来我就以发表动态来跟大家一起学习,也可以让我学习这块开发板更有动力,增加印象. 每一块开发板,第一个例程无一例外就是通 ...
- STM32F03寄存器方式点亮LED流水灯
STM32F03寄存器方式点亮LED流水灯 文章目录 STM32F03寄存器方式点亮LED流水灯 一.题目内容 二.STM32F03系列芯片的地址映射和寄存器映射映射原理:了解GPIO端口的初始化设置 ...
- STM32C8T6之使用寄存器点亮LED灯
这几天肺炎闹得沸沸扬扬,我窝在家里学习STM32.这篇博客筹备了3-4天吧,终于完成了. 实验电路如下图所示: 这里以PC13为例. 用寄存器点亮LED灯,主要就是操作GPIOx_ODR寄存器,GPI ...
最新文章
- A TLS packet with unexpected length was received 解决方法
- 数据中心100G主流应用技术分析与市场预测
- 编写有效的事条指导原则
- 用java建立多项式logit模型_使用mgcv向多项式logit模型添加样条
- 用webstorm在chrome 调试页面时一直弹出 copy authorization url to clipboard
- k8s查看pod的yaml文件_每天5分钟|轻松掌握开发工作中必会的k8s-yaml配置说明和常用命令...
- Mac更新之后使用终端提示:The default interactive shell is now zsh.
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 规则引擎 drools_网易考拉规则引擎平台架构设计与实践
- python字典的键设置条件格式_openpyxl条件格式设置数字格式
- python爬虫技术总结_python爬虫知识点总结(二)爬虫的基本原理
- 第二章 马尔科夫决策过程和贝尔曼等式-强化学习理论学习与代码实现(强化学习导论第二版)
- Julia : win下cmd和repl中执行.jl程序
- 单元测试和sit测试和uat测试
- matlab mri的k空间,【基础理论】磁共振成像中K空间概念及其应用
- SSD目标检测(Single Shot MultiBox Detector)(一)
- 心学与技术-大学之道和尽心知性
- UE基础知识:虚幻引擎编辑器界面-英汉对照表
- react根据中文获取拼音_react-native按照汉字首字母排序
- SPA是什么及原生js实现简易SPA单页面
热门文章
- 学子商城项目用springboot后端框架搭建(IDEA)
- (Win7重装)向官方Win7镜像注入驱动程序
- 世界著名厂家单片机简介
- 百度云 java私塾_JAVA私塾-百度云
- 10分钟入门Shell脚本编程
- Microsoft Office Visio 2007 下载安装密钥
- EXT3-fs error和EXT4-fs error小总结
- linux之ext、ext1、ext2、ext3、ext4文件系统的区别及常用命令
- 好看的个人网站源码_CMS建站,asp cms,cms系统,cms源码,内容管理系统 - 下载列表
- uctools.php,Discuz曝出安全隐患 XSS脚本漏洞和uctools.php