2023年暑期培训电控组第一讲 - 电控、单片机及其开发环境介绍&GPIO使用&多文件编程基础

@

一、 电控组工作与单片机、stm32系列单片机介绍

(1)电控组工作

为机器人的控制核心—单片机写程序,使机器人按照该程序完成任务。要求会使用开发环境开发STM32单片机及其外设,会使用一些控制算法,对底层的硬件知识也要有一定了解。

(2)初识单片机

又称微控制器,把中央处理器CPU、只读存储器ROM(存储程序)、随机存储器RAM(存储运行时的变量)、多种I/O口和中断、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。可以简单地认为其相比于计算机只缺少了I/O设备。

(3)STM32单片机

STM32是由ST(意法半导体)公司设计的一款MCU(Micro Controller Unit)

*我们选择stm32单片机来使用的原因(它相较于其它单片机对于我们的优点):高性能和易于开发使用。
STM32系列单片机命名规范:

二、 两款软件CubeMX和Keil MDKARM基础使用方法入门

(1) CubeMX:

CubeMX所做的工作(它的作用)

自动生成Keil MDK-ARM工程(包含HAL库文件),工程内单片机外设的相关基本初始代码会根据你在CubeMX中对其的设置进行生成。这样我们想实现功能只需要在CubeMX生成的代码中对应位置调用HAL库中的函数即可实现相应功能。

使用场景

所以,在我们需要新建一个单片机工程(即Keil MDK-ARM工程)时,我们需要打开CubeMX进行对于单片机的一些功能参数进行配置,并让其自动生成我们需要的包含HAL库函数的工程。还有当我们在写代码过程中想要修改在CubeMX中对单片机的某些配置,也需要打开CubeMX修改配置后重新修改代码(我们按照格式要求写的代码仍会被保留)

使用方法

第零步:新建CubeMX工程
新建工程

选择单片机型号

第一步:选时钟源
第一页Pinout&Configuration->RCC(时钟控制器)->HSE(高速时钟):Crystal/Ceramic Resontor (无源外部晶振)。

第二步:选调试接口
第一页Pinout&Configuration->SYS->Debug:选SerialWire (SWD)。

第三步:配置时钟
第二页Clock Configuration:设置时钟树(改两个选择,然后HCLK改为max(72MHz))。

第四步:配置工程属性
第三页ProjectManager->Project:填工程名、选工程地址、ToolChain/IDE 选MDK-ARM(对应Keil MDK-ARM)。

第五步:选择代码生成设置
第三页ProjectManager->CodeGenerator:第一个框选第二个选项(只复制需要的LIB文件),第二个框选1,3,4。

之后就可以在第一页完成你的项目中的对于单片机配置,然后点右上角蓝色GENERATE CODE生成Keil MDK-ARM工程啦

步骤总结:选晶振-》选调试接口-》设置时钟树-》工程属性配置-》代码生成设置-》更改单片机设置-》生成工程

(2)Keil MDK-ARM

打开刚才CubeMX中工程属性设置的工程地址对应目录,下面的MDK-ARM文件夹内的后缀为".uvprojx"的文件(Keil工程文件),双击打开即使用Keil打开了该工程。
软件各部分功能如下所示:

注意:
我们在写Keil代码时一定要写在
/* USER CODE BEGIN *** /
和/
USER CODE END *** */
之间!!!
这样在再次在CubeMX中更改设置并自动生成代码时会保留自己的代码

GPIO介绍及使用

GPIO介绍

GPIO 是通用输入/输出(General Purpose Input Output)的简称,用于需要用到数字量输入/输出的场合,例如:
输出功能: LED、继电器、蜂鸣器等的控制
输入功能:传感器状态、高低电平等信息的读取
复用功能:片内外设的对外接口(一些硬件实现的通信接口和AD、DA转换器等)
时序模拟:模拟 SPI、I2C 和 UART 等常用接口的通信时序

我们使用的是STM32C6T6,有48个引脚,共4个GPIO外设,PA,PB,PC,PD,每个GPIO外设有多个引脚(例如PA0,PA1……PA15)
GPIO 可以配置成八种模式:输入浮空,输入上拉,输入下拉,模拟输入,开漏输出,推挽输出,推挽复用功能,开漏复用功能(具体参考:https://blog.csdn.net/as480133937/article/details/98063549)。

引脚复用与重映射

重映射:每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
引脚复用:STM32有很多的内置外设,如单片机内部硬件实现的对外通信接口和AD、DA转换器等,这些外设的外部引脚都是与GPIO复用的。

通俗地说,
引脚复用:一个单片机引出的物理引脚可以有很多功能
比如说,STM32的串口1的引脚对应的I/O位PA9、PA10。而PA9、PA10默认的功能都是GPIO,所以说当PA9、PA10引脚作为串口1使用的时候就是端口复用。
重映射:内置外设可以用不同的引脚进行输入输出
比如下图我们可以将TIM2_CH1_ETR外设输出重映射到PA15引脚上。
(具体见DataSheet Table 5)

CubeMX配置GPIO输入/输出方法

在第一页中选择引脚并配置

HAL库中GPIO输出相关函数和延时函数

1、HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
作用:设置GPIO输出高低电平

2、HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
作用:翻转GPIO输出电平(高→低,低→高)

示例:选用引脚PA10:GPIOx→GPIOA,GPIO_Pin→GPIO_PIN_10,注意:GPIO_PIN_RESET:低电平(0V);GPIO_PIN_SET:高电平(3.3V)

3、延时函数:HAL_Delay(1000); //延时1000ms

拓展:详细了解HAL中其它相关GPIO函数介绍:https://blog.csdn.net/weixin_44793491/article/details/107603084

多文件编程相关

include原理及注意点

在.c中包含.h了,编译时编译器会怎么处理?
在编译前的预编译过程中处理include之类的宏。对于include,预编译时可理解为编译器会将其包含的文件全部复制到include处将其代替!(示例如下)
那么,考虑以下情况:

c.h中的代码在预编译过程中被复制了两遍!!
如何解决?
解决方法:在每个.h库文件头添加判断条件防止重复复制,如下:

#ifndef _C_H_
#define _C_H_
。。。
#endif

全局变量用法、extern

在下面代码中:

int c = 0;
int func(int a){
	int b = 1; 
	return a+b+c;
}

变量b: 变量定义在函数内部的变量称为局部变量,作用域仅限于函数内部,调用函数执行定义变量时定义,函数结束时就会被清除。
变量c: 定义在函数外的变量称为全局变量,它的作用域默认是整个程序,其它函数也可以使用。

但在多文件编程中,若要在b.c中使用a.c中定义的变量 int c; ,则需要:
1、在a.h中使用 extern int c; 语句声明外部变量c,此时任何include了a.h的源文件中的函数都可以使用变量c
2、在b.c或b.h中include c.h

static修饰变量用法

修饰局部变量:用静态关键字static修饰的局部变量,在编译的过程中,会在数据区为该变量开辟空间,并对其进行初始化,被static修饰的局部变量生命周期是整个程序,但是作用域是和普通局部变量一样的,从定义开始,到最近的花括号结束。
修饰全局变量:普通全局变量对整个工程可见,而静态全局变量仅对当前文件可见。

posted @ 2023-06-26 22:36  北京理工大学机器人队  阅读(293)  评论(0编辑  收藏  举报