单片机快速入门

发布时间:2024年01月02日

参考连接:

  • 安装MinGW-64(在win10上搭建C/C++开发环境)https://zhuanlan.zhihu.com/p/85429160
  • MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwd=y1mz 提取码:y1mz --来自百度网盘超级会员V7的分享
  • 野火F407开发板-霸天虎视频-【入门篇】 https://www.bilibili.com/video/BV1Vt411X7PK/
  • 野火霸天虎教程https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/ebf_stm32f407_batianhu_v1_v2/download/stm32f407_batianhu_v1_v2.html
  • 【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕) https://www.bilibili.com/video/BV1yW411Y7Gw/?vd_source=39f3289ad7c2358aaf9772ccb7ff98bf

使用软件:

  • MinGW
  • VSCode
  • Keil5

目录:

  • x.1 C语言基础知识
  • x.2 单片机从0实现
  • 单片机GPIO介绍

x.1 C语言基础知识

如果有C语言基础可以直接跳过。

x.1.1 C语言背景知识

C语言是为了Unix系统而诞生的语言。C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

x.1.2 C语言的安装

可以通过访问 MinGW 的主页 mingw-w64.org;知乎上文章- 安装MinGW-64(在win10上搭建C/C++开发环境)https://zhuanlan.zhihu.com/p/85429160 ;MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwd=y1mz 提取码:y1mz --来自百度网盘超级会员V7的分享来下载安装。

当安装 MinGW 时,您至少要安装 gcc-core、gcc-g++、binutils 和 MinGW runtime,但是一般情况下都会安装更多其他的项。

添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。

x.1.3 C语言运行流程

C语言是一门针对操作系统设计的,强类型,面向过程,运行速度媲美汇编,在运行时先要将内容编译成汇编语言的一门语言。我们使用VSCODE编辑文本,使用GCC汇编成二进制文件,输入如下命令将编辑器写好的.c文件转成.out二进制文件,

$ gcc test1.c test2.c -o main.out
$ ./main.out

输出的.out文件可以直接运行。当然更加细节的操作牵扯到更深的计算机知识,链接库等,但并不需要。

x.1.4 C语言的组成和运行规则

C语言由关键字,标识符,常量,字符串值,符号(分号),注释等组成。

C语言都是从main函数开始运行的,一个C语言的简单例程如下所示,

#include <stdio.h>
 
int main()
{
    /* 我的第一个 C 程序 */
    printf("Hello, World! \n");
 
    return 0;
}

所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。

/* … */ 用于注释说明。

printf() 用于格式化输出到屏幕。printf() 函数在 “stdio.h” 头文件中声明。

stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。使用<>来寻找系统环境变量中的问价,使用""先找当前文件中的文件,找不到再去系统环境变量中查找。

return 0; 语句用于表示退出程序。

x.1.5 C语言的变量类型

C语言的基本类型包括整型(int32),布尔型(u8),浮点型(double64),字符型(u8)。我们可以使用sizeof关键字来查看对象或者变量的大小,

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("size of int is: %lu \n", sizeof(int));

    int i = 0;
    printf("%p\n", &i);//输出:000000000061FE1C  输出的是i变量的地址

    return 0;
}

输出结果如下,

在这里插入图片描述

%lu 为 32 位无符号整数,%p为输出指针内存地址,默认以十六位输出。常见的变量类型及其对应的大小如下,

请添加图片描述

我们使用type i的时候是对i变量声明并定义(会在内存开辟空间),使用extern type i的时候只是声明变量(并不会在内存给空间)。

extern int i; //声明,不是定义
int i; //声明,也是定义

x.1.6 C语言的常量

常见的常量有整数常量(如0xFFFFFF,7u等),浮点常量(3.14,3.14f),字符常量(如转义字符\t),还可以使用常见预处理器来定义常量,例如#define和const关键字,如下,

#define PI 3.14
const double PI_2 = 3.14;

推荐使用#define关键字,define是进行简单的文本替换,老外常用。

x.1.7 C存储类

C语言变量存储类常见有auto,register,static,extern四种,局部变量的默认类型是auto,变量在函数和开始时被创建,在函数结束时被销毁。而register是放在寄存器中的变量,运行速度快,static和extern都是全局变量,在全局都可以调用,

static int count=10;        /* 全局变量 - static 是默认的 */

{
   auto int month; // auto是默认的
}

int main(){
	printf(count);
	// printf(month); // can't
	
	return 0;
}

x.1.8 C语言运算符

C语言常见运算符有算数运算符,关系运算符(<,>),逻辑运算符(&&存在短路),位运算符等。

  1. 算数运算符

%是取模,即取余数。

在这里插入图片描述

  1. 关系运算符

关系运算符返回真或假的布尔常量,用于比较大小与相等与否,

在这里插入图片描述

  1. 逻辑运算

逻辑运算符与或非,也返回一个布尔值,但是与或具有短路效应,

在这里插入图片描述

  1. 位运算符(重要)

位运算符在单片机的操作中比较常见且重要,常见的运算符有对位取与,取或,取异或,取非,左移,右移(补码负数高位补1)。

在这里插入图片描述

x.1.8 C语言逻辑

C语言的逻辑由if-else选择判断,和循环组成。

选择判断中有if-else语句,问号语句,switch-case语句(搭配break使用,且switch中变量要为int32),例句如下,

/* ?: */
Exp1 ? Exp2 : Exp3;

/* switch - case */
#include <stdio.h>

int main()
{
    int a;
    printf("input integer number: ");
    scanf("%d",&a);
    switch(a)
    {
        case 1:printf("Monday\n");
        break;
        case 2:printf("Tuesday\n");
        break;
        case 3:printf("Wednesday\n");
        break;
        case 4:printf("Thursday\n");
        break;
        case 5:printf("Friday\n");
        break;
        case 6:printf("Saturday\n");
        break;
        case 7:printf("Sunday\n");
        break;
        default:printf("error\n");
    }
}

循环中有while循环,for循环,do…while循环,搭配break,continue,goto(不推荐),例句如下

x.1.1 指针中的取地址,解地址

取地址符号为&,解地址符号为*,使用如下,

int *p = &value;	// 取地址用&
*p = 1;	// 解地址用*

x.1.2 宏编译的条件判断

使用预编译宏来取消编译,

#if 0

...

#endif

x.1.3 C语言的位操作

常见的位操作有左移,右移,取反,与,或,异或,这部分参考c语言中文网,

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

x.1.4 C语言的置位,清零

第六个位置这个地方设置为1,其他地方不变,使用或操作|= (1<<6)

第六个位置这个地方设置为0,其他地方不变,使用与操作&= ~ (1<<6)

第六五位置设置为0,其他地方不变,&= ~(0x03)<<6;因为0x03是11。

案例如下,孰能生巧,

在这里插入图片描述

x.2 单片机从0实现

x.2.1 51单片机

由于51单片机内部已经实现了寄存器映射,所以在这里可以直接使用寄存器别名来进行访问。

电流从正极流向负极,从高压流向低压(因为存在电势差),电子流动方向和电流流向相反。

如果LED灯的电路图如下,则只需要控制P0,0端口将数值设置为0便可以将电路点亮,

在这里插入图片描述

则代码如下便可实现LED灯的开关,

在这里插入图片描述

x.2.2. stm32f103

寄存器映射指给寄存器地址映射一个别名,这个功能可以通过reg52.hstm32f10x.h两个文件来实现。

LED灯对应的接口为PB0,则意味着是GPIOx_ODR寄存器中的GPIOB0_ODR

GPIOx_ODR是指 general purpose intput output x _ Output data register,是通过ODR来控制LED灯开关的。

  1. SOC厂商在已经有ARM芯片基础上设计了三类地址总线,为AHB,APB2,APB1总线。我们先在参考手册中第二章 存储器和总线架构中找到挂载在APB2地址总线下的GPIOB的绝对地址,

在这里插入图片描述

  1. 我们需要ODR来控制LED灯,所以我们需要找到ODR0的绝对地址,我们根据地址偏移来计算,

在这里插入图片描述

  1. 我们使用ODR0来控制PB0的端口,看了电路图我们知道要实现LED中G颜色的开关,我们需要将PB0的端口电压设置为0V,这个时候我们即将PB0设置为0便可,

在这里插入图片描述

  1. 我们需要通过CRL寄存器来告诉MCU, LED中的PB0为输出值,即配置IO口为 输出。

  2. 打开RCC的时钟寄存器。

最终我们的代码书写如下,

在这里插入图片描述

x.2.2 stm32f407

  1. 更改GPIOx_MODER模式寄存器为输出

AHB1下

  1. 更改RCC时钟控制器

AHB1下

  1. 更改GPIOx_ODR数据寄存器

AHB1下

代码如下,stm32f4xx.h文件内容,

在这里插入图片描述

main.c文件内容,

在这里插入图片描述

x.3 单片机GPIO介绍

x.3.1 GPIO简介

在这里插入图片描述

在这里插入图片描述

407有144个引脚,引脚供电大部分是5V,GPIO属于引脚,但并不是所有引脚都属于GPIO;查找每一个GPIO功能通过数据手册查找。

在这里插入图片描述

x.3.2 GPIO 功能框图讲解

GPIO功能框图如下,

在这里插入图片描述

I/O引脚就是芯片和PCB印刷电路板的解除方式,而I/O引脚的左侧则是芯片的内部电路。

BSRR 指的是bit set reset register,其中set是指置位,是低16位,输出高电平置1。reset是指复位,是指高16位,输出低电平置1。

输入输出是相对ARM芯片而言的,如果往芯片写数据叫输入,从芯片往外写数据叫输出。

在输入中TTL使得输入模拟信号,当大于1.8V时为高电平,当低于1.8V时为低电平。

输入的输入较为简单,输出则较为复杂,输出的流程图如下,

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_43369406/article/details/135298419
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。