首页 > 其他分享 >通院科协电子部第一课——初识单片机

通院科协电子部第一课——初识单片机

时间:2023-10-20 10:55:42浏览次数:40  
标签:电子部 单片机 代码 电子钟 第一课 GPIO 我们 外设

通院科协电子部第一课——初识单片机

什么是单片机?

很多人都还是第一次听说“单片机”这个词汇吧。不要紧,我去年这时也是第一次听说这个玩意儿,当时也是一知半解。下面我就来详细说明一下这是个啥。

电子钟,大家应该都见过。那你们有没有想过,电子钟是如何获取时间并且显示的呢?为什么我们按一下按钮就可以让电子钟改变时间呢?我们可以看下面的框图。

从中我们可以看到,单片机可以从外部RTC(Real Time Clock)获取实时时间,然后显示到LCD屏幕上;同时我们还可以通过按键手动设置时间;有的电子钟还支持联网显示天气等......再形象一些,假设把框图中的单片机换成人,想象你站在电子钟里,外面有个人操纵电子钟。现在,外面的人想看到实时时间,于是你找了一圈,想看从哪能获取时间,然后你发现了一个RTC模块,于是你从那里读取了现在的时间;然后你需要让外面的人知道这个时间,于是你把这个时间放到LCD屏幕上,外面的人就顺利的看到了时间;但是外面的人发现这个时间不太对,想要校准这个时间,于是他就按下按键调整时间,你读取按键信息,知道了他按下的是哪个按键,理解了外面的人想要怎么调整时间,你就按照指令,把从RTC读取到的时间进行处理,然后将他显示在LCD屏幕上,外面的人便看见了修改后的时间;然后,外面的人想要睡觉,他用按键设定了一个时间,想要你在这个时间提醒他起床,于是你就记住了这个时间,并在这个时间通过扬声器播放音乐,提醒他起床。单片机所做的工作,就是站在里面的人所做的事情。

现在,我相信大家应该对单片机有了一个大致的了解。那我们来强化一下大家对单片机的认识。

单片机是一种微型控制器,相当于一个微型计算机(从上面的例子可以看出来,对电子钟有一个输入,电子钟会给一个输出,电脑同理,在键盘上按一个按键,就是给电脑一个输入,电脑就会在屏幕上显示一个字符,即给你一个输出)。它是一种可编程的东西(什么是可编程,就是你想让它做什么,它就可以做什么)。比如,你可以对单片机说:“现在,我让你一直检测按键的情况,如果按键按下,就请你把灯点亮”。于是,单片机会一直检测按键有没有按下,当你把按键按下,它就会输出一个高电平(就是输出一个逻辑1),把灯点亮。那么我们怎么实现他的可编程功能呢?那我们就要使用我们的编程语言了。大家应该都在学C语言吧,我们可以将我们的C语言代码烧录给单片机(就是把代码存到单片机里),然后单片机的芯片里就保存了我们的代码,就是说它记住了一串指令。比方说,我们将一段代码烧录给单片机,这段代码翻译过来就是每隔一秒,灯就会亮灭一次。然后单片机记住了这个代码,他就会遵循我们的指令,每隔一秒,让灯亮灭。

总结一下,单片机就是:一种集成了处理器、存储器和输入输出接口的微型计算机系统。毕竟“单”-->“一个”,“片”-->“”微型“,”机“-->”计算机“,字面意思嘛这不是。

单片机有处理器,这很好理解,毕竟在电子钟里,就是单片机处理从RTC读取的数据然后显示的嘛;然后单片机有存储器,这也很好理解,毕竟单片机可以记住我们的代码(一条条指令);然后还有输入输出接口,这更好理解了,毕竟我们可以通过按下按键改变电子钟的时间嘛。所以“单片机”这个概念,大家应该都理解了吧。

认识单片机

下面我们来系统认识的认识单片机,请看下面的框图:

image

单片机由CPU、存储器、输入输出接口、时钟电路组成,前面三个相信大家应该都能理解,但是最后一个时钟电路是什么鬼?为什么它又是单片机的心脏?这就不得不提其单片机的运行逻辑了。我们刚刚让单片机每隔一秒亮灭灯,那单片机又是如何知道”一秒“这个准确的概念呢?单片机就一小薄片,它怎么知道”一秒“?刚刚电子钟的例子中,单片机是从外部RTC获取到”一秒“这个概念的,那没有RTC模块会怎么样?单片机就不能运作了吗?因此,单片机需要一个”心脏“,让他能够运行代码。而这个心脏,就是一个时钟电路。这个时钟电路每输出一个信号,单片机就会运行一个指令,这样,单片机就运作起来了。

大家应该对单片机有了初步认识,下面我们来介绍一下学习单片机中必须掌握的一些词汇:

  • ”字节、位“:字节,即Byte,位,即bit。1Byte = 8bits。比如说,现有一串二进制数据”10010111“,这串数据长度为8位,也就是一个字节长度的数据。

  • ”高低电平“:在单片机中,我们的运算单位都是0和1,因此我们需要表示这个0和1,于是我们就规定高电平为1,低电平为0。而我们所说的高电平的电压通常是3.3V或5V,低电平一般是0V。

  • 寄存器:寄存器是用于存储和处理数据的元件,主要用于暂时存储 CPU 工作过程中需要处理的数据。比如说,单片机每完成一步操作A,就把一个名为REG的寄存器拉高(从逻辑0变为逻辑1),那么我们就可以通过REG这个寄存器的值来判断单片机是否完成操作A。同理,我们可以通过查看各个寄存器的值来判断单片机进行了哪些操作,这对以后的debug很有用。

  • ”32位单片机“:CPU能够读取和处理的最大数据大小通常为32位;相应的,对于8位单片机,CPU能够读取和处理的最大数据大小通常为8位。市面上流行的ESP32、STM32、CH32、GD32等均为32位单片机。

  • ”内核(Core)、外设(Peripheral)“:内核与外设共同构成单片机。内核包括了寄存器组、指令集、总线、存储器映射规则、中断逻辑和调试组件等;外设包括定时器、A/D转换器、存储器、i2c、UART、SPI、ROM...等等,完全由各芯片厂商自己设计并与内核对接。打个比方,把单片机想象成一只猫,内核就规定了这是一只猫,他有一条尾巴四条腿;而外设就规定了它毛发什么颜色,什么品种等。单片机的内核有很多,如51,AVR,ARM,PIC,Power PC, RISC-V等,我们现在授课使用的STM32F401单片机就是 ARM Cortex-M 内核。外设就是我们常用的GPIO、UART、TIM等,不同外设代表了单片机的不同功能。比如说,一个单片机有UART外设,表明其可以使用串口通信协议向别的芯片发送信息等。在后面的课程中我们会为大家介绍单片机的各个常用外设。总的来说,会使用不同的外设,就能够使用单片机做不同的事情。

image

参考资料:https://www.zhihu.com/question/606404307

我们再来实际的认识一下单片机。(如下图)中间正方形的黑色薄片就是我们所说的单片机。这个单片机的型号是STM32F401CCU6。面对这么一大串字符,大家可能会很害怕,不知道这是啥。别急,我们先从左往右看,”STM32“,表明这是ST公司生产的32位单片机,而ST公司也有生产8位单片机,其开头也就是STM8;”F“,表明他的产品类别,其中F为基础型,其他类别可以看下面的表格;”401“中的”4“表明这是F系列的一款高性能MCU,后两位表明这是F4系列的一个特定产品;后面的"CCU6"可以对照下面的表格看。注意,这个字符序列只适用于ST公司生产的单片机,对于其他公司(比如说乐鑫、Ti等公司)生产的单片机就不一定适用。

image

image

我们再来说一下单片机相关的知识:

  • 工作频率:单片机的工作频率一般以MHz(兆赫兹)为单位,比如我们教学使用的STM32F401CCU6最高工作频率为84MHz。一般可以认为,单片机最高工作频率越大,性能越强

  • 什么是ROM、RAM、Flash:

    ROM:存放指令代码和一些固定数值,程序运行后不可改动。

    .c文件及.h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的BIOS,一些低端的单片机是没有这个的)通通都存储在ROM中。

    RAM:程序运行中数据的随机存取(掉电后数据消失)。

    整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

    Flash:存储用户程序和需要永久保存的数据。
    例如:现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。

开发单片机

我们理解了单片机是什么,那么大家有没有意识到,我们可以用单片机完成很多事情。比如说,像一开始举的例子一样,设计一个电子钟?或者换个方向,设计一个智能小车、智能手表等等。我们可以用单片机完成很多东西。那大家有没有想过,我们怎么去让单片机做这些任务呢?更专业一点的说,我们怎么去开发单片机?

我先拿人举例子:我想要一个人完成特定的动作,我就要将这串动作“告诉”他,然后他”记住“这串动作,最后”执行“这串动作。单片机也是一样,我们想去开发单片机,我们就要把指令告诉单片机,让单片机替我们完成这些任务。更规范一些,整个流程就是:我们在电脑上编写代码,然后将代码烧录到单片机上,然后让单片机运行这些代码。

我们先看第一步,编写代码。这也是最重要的一步。刚才我们说过,单片机有不同的外设,而不同外设代表了单片机的不同功能。因此,我们需要让单片机完成各种事情,首先需要使能(Enable)单片机的各种外设(Peripheral)。单片机的各个引脚(Pin)在最初都是失能(Disable)的,因此我们需要把各个引脚用来做什么事情给划分好。比如说,我们规定PC13引脚用来控制灯的亮灭,PA6、PA7引脚用来通信,那么我们就要把对应的引脚分配工作。

那如何给各个引脚分配工作呢?显然,我们可以通过编写代码来使能各个引脚以及外设。比方说,下面就是一段使能PC13作为GPIO输出引脚的代码。

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

看不懂不要紧,下一节课学完就能大致看懂了。

大家有没有发现,上面的代码很长,如果我要使能单片机的每一个引脚,都要写很长很长的代码,会大大的增加开发周期。因此,ST公司(就是生产STM32单片机的公司)想出了一个点子,就是用图形化界面配置单片机引脚以及各个功能,于是他们写了一套软件,我们只需要在软件里点来点去,它就会自动的帮我们生成代码框架,并且自动写好单片机的各个引脚的配置代码。这个软件就是STM32CubeMX。那我们用什么软件来编写代码呢?目前,对于绝大多数Arm内核的单片机,我们都可以使用keil5软件来编写我们的代码,并通过keil5的一些按钮,将我们的代码烧录给单片机。对于像keil5这种我们用来编写代码的软件,我们称作IDE。比如C语言教学常用的Visual Studio 2010/2022,Dev-c++等,都是IDE,但那些并不是我们单片机开发所使用的IDE。除了Keil5,我们还可以使用VS Code、Clion等IDE来开发单片机。但是请注意,STM32CubeMX并不属于IDE,它只是一个代码生成工具!

对于不同的单片机,我们都可以使用不同的软件进行开发。对于STM32单片机,我们使用的软件就是STM32CubeMX+keil5。

因此,整套开发流程大致就是:使用STM32CubeMX配置单片机参数、外设以及引脚等-->在keil5中使用这些外设,编写代码,完成控制逻辑-->在keil5中烧录给单片机

课后小任务

  • 查一查资料,试着说出STM32H750VB系列单片机的最高工作频率、Flash大小、RAM大小
  • 查资料,了解STM32单片机的GPIO、TIM、USART等外设分别有什么作用
  • 尽可能的学习一下C语言的函数部分
  • 练习如何将代码烧录进手边的STM32F401单片机
  • 尝试修改测试代码,使蓝灯能够以不同的频率闪烁

标签:电子部,单片机,代码,电子钟,第一课,GPIO,我们,外设
From: https://www.cnblogs.com/Asaka-QianXiang/p/17776517.html

相关文章

  • STM32单片机实现Bootloader跳转的关键步骤(转载)
    STM32单片机实现Bootloader跳转的关键步骤-知乎(zhihu.com)STM32单片机实现Bootloader跳转的关键步骤(qq.com)现在越来越多的嵌入式设备支持远程自动升级,不需要再借助下载器。这样对于设备的维护非常方便。当然若使设备支持远程升级,需要编写支持升级的程序代码,可以称之为B......
  • 单片机为什么按下为0
    对于单片机,单片机上电后默认为高电平,所以对于按键,按下去之后变为低电平(因为按键接地了),未按下去则为高电平,而因为单片机不仅可以改变引脚电平,也可以读取引脚电平,所以可以根据读取引脚电平高低来判断按键是否按下。......
  • PHP课程笔记(第一课)
    1.第一课PHP代码标记:在PHP历史发展中,可以使用多种标记来区分PHP脚本ASP标记:<%php代码%>短标记:<?php代码?>脚本标记:<scriptlanguage="php">php代码</script>标准标记(常用):<?phpphp代码?>1.Web技术——B/S架构B/S(Browser/Server)架构:指的是浏览器/服务器端的......
  • 学C单片机1
    C语言的条件语句ifelse,数字是0打印你好,数字是1打印世界,其他则重新输入。#include<stdio.h>intmain(){ inti; while(scanf_s("%d",&i)==1) { if(i==0) { printf("你好\n"); } elseif(i==1) { printf("世界\n"); } else { pri......
  • Python第一课
    一、安装python、pycharm或vscodepython+pycharm安装教程 https://www.bilibili.com/video/BV1xW4y117ww/?spm_id_from=333.337.search-card.all.click&vd_source=85a59106edfe2831df69042969f00cd3python相当于媒婆,pycharm是写代码的文本编辑器,pycharm的代码通过python翻译后才......
  • 第一课:免杀软误杀误报的概念
    什么是免杀软误杀误报,也就是反病毒(AntiVirus)与反间谍(AntiSpyware)的对立面,英文为Anti-AntiVirus(简写VirusAV),逐字翻译为“反-反病毒”,翻译为“反杀毒技术”。通俗点讲,也就是一个被杀软报毒的PE文件,经过一系列处理后,使杀软不认为他是一个病毒或木马。那么,啥是PE文件,PE文件指的是......
  • 8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程
    8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程一、罗克韦尔ABMicro850系列PLC实现ModbusTCP以太网通信协议​服务器视频教程:罗克韦尔ABMicro850系列PLC做ModbusTCP以太网通信服务器、以太网调试助手和ModbusPoll调试助手做ModbusTCP以太网通信客户端,......
  • 嵌入式开发环境Vscode开发STM32单片机程序
       STM32单片机非常强大,大多数教程都是使用keil编译器,keil是收费的而gcc是开源免费的。这里介绍一些使用gcc+ vscode 开发单片机程序的经验。(这里不解释gcc是什么)。第一:环境准备gccARM开发者官网 https://developer.arm.com/我有个习惯:尽量使用免安装版软件,直接解......
  • 单片机中断实验2(按下松开后开始)
    #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharLed[]={0xfa,0xf5,0xaf,0x5f,0xaa,0x55,0x00,0xff};uchartemp;uchark;voidmain(){ uchari; k=0; temp=0; TMOD=0x01;//计数模式为1时间为65535,0x10是256 TH0=(65535-......
  • 51单片机-独立按键控制电机
    #include"reg52.h"typedefunsignedintu16;typedefunsignedcharu8;sbitk1=P3^1;sbitk2=P3^0;sbitk3=P3^2;sbitk4=P3^3;sbitmotor=P1^0;voiddelay(u16i){while(i--);}voidmoto_run(){motor=......