| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 韦东山老师的单片机核心课程学习笔记(二) -> 正文阅读 |
|
[嵌入式]韦东山老师的单片机核心课程学习笔记(二) |
上一节课学习了单片机的微控制单元的组成,那么怎么使用这个为控制单元呢 首先我们需要一个类似于Hello,World!的入门课程,在单片机里这个入门课是:点亮一个led灯 想要利用单片机点亮一个LED灯,不同的单片机可能会有不同的实现方法,问题是我们能不能找到一种泛化的操作步骤,让我们面对不同的单片机都可以游刃有余呢 韦东山老师将点亮一个LED这个操作分为了三个步骤:
1、看原理图下图是利用单片机的一个引脚来控制LED灯的原理图: ?上图是利用某款单片机某个引脚控制LED灯点亮的原理图,分为两种情况,图中都说的非常明白 我像记录以下,为什么要加一个电阻,因为上图中单片机引脚输出的电压为3.3V,而LED灯导通所需的电压非常小,3.3V的电压加在LED两端会将其烧坏,因此需要加一个分压的电阻。 那么问题又来了,如果我们使用的单片机无法输出3.3V的电压呢?或者说,我们的单片机驱动能力不足以点亮一个LED灯,那这个电路应该怎么设计呢? 答案是:我们可以引入一个三极管来提高电路的驱动能力! ?改进的原理图如下所示: 上图对单片机引脚的驱动能力要求大大降低,从驱动LED灯变成了驱动三极管,只要达到三极管的导通要求便可以。 ?需要注意其中输入电阻的作用与上面介绍的情况相同,在选型时要注意其阻值是否符合要求! ?2、阅读主芯片手册阅读主芯片手册是为了确定我们如何才能访问到控制LED灯的这个引脚 不同的单片机可能采用不同的控制芯片,因此芯片手册也会有差别,因此我们要阅读对应的手册 但是本质上我们都是操作对应的寄存器,其操作寄存器的思路是不变的 首先我们操作寄存器时要遵循的一个原则是:修改某个寄存器位时不影响到其他位 其具体操作为:
我们要控制led,就要控制与led相连的引脚,使其作为一个普通引脚(GPIO)来工作,对于控制某一引脚的操作,如果我们想让其作为一个GPIO来使用,可以分为下面几个步骤:
对于上述四个步骤我们都是读写寄存器来完成的。 我们可以通过上述的操作寄存器的步骤来修改,但是上述的方法需要散布,明显不够高效,对应GPIO这种频繁使用的引脚功能,一般单片机都会做出更加方便的寄存器操作方法。 为了更方便的操作GPIO数据寄存器,很多单片机都提供了另外两个寄存器:Set_reg, Reset_reg 置位寄存器Set_reg中对应位为1时,GPIO数据寄存器中的对应位就被设置成了1 清零寄存器Reset_reg中对应位为1时,GPIO数据寄存器中的对应位就被设置成了0 我们如果想修改某一个GPIO数据寄存器的值,可以找到其对应的置位和清零寄存器,对其进行各位的赋值就可以了。 3、编写程序?在经过上述学习后,我特地找来了一块STM32开发板来实践刚刚的操作 重新走上了为LED电灯的道路? 此次我找到的开发板是野火的F103指南者: 野火的STM32F103指南者采用了STM32F103VET6芯片作为主控芯片,具有 512kB Flash,64kB SRAM,系统时钟 72MHz,LQFP100 封装。支持JTAG,SWD,ISP烧录模式。 利用ISP烧录模式简单测试了一下板子,是可以被正常识别出来的: 之后按照上面的步骤,开始点亮第一个LED灯: ?我们找到原理图可以看到led灯是由单片机IO直接驱动的,由PB5,PB0,PB1分别控制RGB三种灯色,低电平点亮,高电平熄灭。 要点亮这个led灯就要明白这三个引脚是怎么控制的,虽然上面已经讲了,但是我还是找到了具体的芯片手册,一步步查找了对应的寄存器内容 首先我们找到时钟RCC外设使能寄存器: ? ?使能IOPB的时钟 再找到GPIOB的低位控制寄存器CRL ?设置PB0的模式为输出模式,并配置为推挽输出模式 再找到GPIOB数据输出寄存器ODR ?设置PB0电平周期反转 我还想试一试GPIO设置/清除寄存器,于是又利用SET/RESET寄存器配置了PB1 代码段如下:
测试后可以正常点亮LED_G和LED_B 但是发现两个小问题,或者说是小疑惑:
问题1:?为什么配置引脚为输出模式后,该引脚默认输出低电平 因为输出数据寄存器默认全是0,表现出来被配置好的输出引脚就都是低电平 问题2:?warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion] 解释:大意是提示在将int转换位unsigned int类型时,隐含一些问题。 拿一句代码举例(*pReg)是一个unsigned int类型的变量,而编译器在进行(1<<0)移位操作时会将其保存为int类型的数据,这样我们就将一个int类型的数据赋值给了unsigned int类型的变量,由于两种类型取值范围不同,所以可能存在隐含的问题。 具体理解可见C?integer promotion原理 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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年12日历 | -2024/12/28 17:29:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |