| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 基于STM32+LED库函数和寄存器点灯(手把手教学) -> 正文阅读 |
|
[嵌入式]基于STM32+LED库函数和寄存器点灯(手把手教学) |
前言???????本次我们学习一下利用库函数和寄存器点亮LED,寄存器操作全程直接参考STM32手册,直接对照寄存器讲解,大部分是自己收集和整理,如有侵权请联系我删除。 本次实验板子使用的是正点原子精英版,芯片是STM32F103ZET6,需要资料可以@我拿取。 本博客内容原创,创作不易,转载请注明 1.利用库函数点亮LED1)查看原理图的LED引脚????????点亮LED灯我们需要了解原理图的引脚,看下LED的对应引脚是什么,再进行配置,本次使用的是正点原子精英版,所以引脚分别是:LED0 --- PB5 , LED1 --- PE5 。
2)加入驱动LED需要的 rcc 和 gpio 的头文件那么这些文件在哪里可以添加呢? 不懂文件放在那里的,可以参考我的博客---新建工程专栏
?接下来我们添加需要的H文件:其中 stm32f10x_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数以及相关的外设时钟使能函数都在这个其源文件 stm32f10x_rcc.c 中。 新建一个 HARDWARE 的文件夹,用来存储以后与硬件相关的代码,当然你也可以随意放在一个文件夹,不过为了后期能快速找到对应文件的代码,我建议还是创建一个。 驱动LED灯,我们需要创建两个文件,分别是LED.c?和 LED.h?的文件,然后放在HARDWARE 的文件夹里面。 LED.h:新建一个led.h的文件,.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
很多人可能不了解sys.h文件,和两个#define的声明,其实这个是一个位操作的文件,就是为了方便控制LED,相信学过51的同学都了解。我们也可以不用这种方式,等会我会直接展示库函数输出的方法来使能LED。这里放下sys.h 的代码: LED . c : 新建一个led.c的文件,存放驱动LED的初始化代码
1)?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);?? ? //使能PB,PE端口时钟这个函数的意思是打开GPIOB和GPIOE的时钟,我们每次使用外设的时候,都需要打开相应的外设时钟,通过查看手册时钟框图可以看到,GPIOB和GPIOE的时钟在APB2总线上: 2) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ?? ??? ? //推挽输出?结论:IO口需要配置为通用推挽输出,输出低电平0时,灯亮。输出高电平1,灯灭 不太了解GPIO模式的,可以去看看我的博客: 基于STM32+认识GPIO引脚的8种输入输出及引脚配置https://blog.csdn.net/qq_49015270/article/details/126336600?spm=1001.2014.3001.5501 3)使能LED0 和 LED1 ,让他们交替闪烁
?GPIO_SetBits()和 GPIO_ResetBits()两个函数分别是把对应的位置1和置0控制LED的亮灭 2.利用寄存器点亮LED????????利用寄存器来驱动使能LED,我们就需要参考STM32中文参考手册来对寄存器的对应位进行位运算,这个就需要同学们会一点C语言的位操作,一般是使用置1操作:|= ,然后置0操作:&=~,然后就是 << 和 >> 这几种,我在这里手把手教学打架看寄存器和位操作使能这些位。 1)打开对应的RCC时钟和库函数一样,我们的第一步也是需要打开RCC时钟,我们知道IO口的RCC时钟在AHB总线的APB2上,所以我们查看手册,找到??APB2 外设时钟使能寄存器(RCC_APB2ENR)
我们可以看到,在这个寄存器的第3位和第6位分别是端口B和端口E的时钟,我们要使能这两个时钟,就需要给这两个位置1 ,才能开启IO口的时钟。
从这里我们能看到,我们分别是把1左移3位和左移6位,然后利用置1 |=,就成功把 端口B和端口E成功使能开启了,是不是觉得很简单呢。 2)配置引脚模式和上面的库函数类似,我们也要给引脚配置模式和引脚速率,所以我们直接参考手册,找到GPIO寄存器的说明看看,我们需要用到?端口配置低寄存器(GPIOx_CRL) (x=A..E) 。 那么这两个寄存器为啥一个高一个低呢? 原来在M3的架构是32为寄存器的芯片,所以这个引脚的一个脚占了4位。低寄存器的引脚范围在0-7之间,就是GPIOA...E的0-7引脚使用低寄存器,然后8-15引脚使用高寄存器 不过这种情况是在M3架构是这样分配的,我了解的M4架构就只要一个寄存器,具体情况配置一切按照寄存器说明来使能。 我们可以一个一个位来分析,首先我们先看20-21位,这个位是控制端口的输入输出位,22-23是端口相应的模式位,这里我们可以分为两个部分来看。 1)当MODEy[1:0]:这个位设置为00,表示为输入,这个时候相对应的CNFy[1:0]:的配置是上面那个,比如我需要浮空输入模式,那么20-23位就是:0100 ,如图: ?? 2)当MODEy[1:0]:这个位设置为 01 或者 10 或者 11,表示为输出,这个时候相对应的CNFy[1:0]:的配置是下面那个,比如我需要通用推挽模式,速度为50Mhz 的输出模式,那么20-23位就是:0011 ,如图:
驱动LED的模式:通用推挽模式,速度为50Mhz 的输出模式
其实这两个代码的意思是一样的,我们需要配置的是20-23位 为? 0011 ?? GPIOB->CRL &=~(0XF<<20);? ?- - - 先对20-23 位? 清0操作 那么这两串代码又是什么意思呢? 其实他和上面的功能一样,我们都知道这是一个32位寄存器,那么一个0XF就是1111,所以 //?? ?GPIOB->CRL&=0XFF0FFFFF;? 3)把引脚输出配置为高,这样使能位0的时候LED亮我们这里就需要使用到端口输出数据寄存器(GPIOx_ODR) (x=A..E)? 这个寄存器,因为这个寄存器只有前16位有效,所以我们只需要控制第5位就是引脚5的输出了。
具体操作代码是:
4)main主函数实现LED闪烁?
?把LED使能为0就是输出低,LED亮,使用的寄存器是端口位清除寄存器(GPIOx_BRR) (x=A..E) 也是把我们的第5位设置为1 ,设置BRR寄存器是把IO输出为0,也就是把1左移5位。 ?把LED使能为1就是输出高,LED灭,设置BSRR寄存器是把IO输出为1,使用的寄存器是: 也是把我们的第5位设置为1 ,也就是把1左移5位 总结:????????以上就是库函数和寄存器花式点灯的教程了,寄存器相对来说比较麻烦,需要对手册来进行操作,不过学会看手册对我们使用单片机很有帮助,我们目前能看得懂寄存器点灯就可以了,以后我们需要配置其他的寄存器也会得心应手。 ???点赞关注双击博主,不定期分享单片机知识,互相学习交流。
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:46:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |