CUBE首先帮我们搭建好了时钟树,即通到各个外设的时钟频率已经全部配置好了,用不用是另一码事(水龙头已经通好水,水温也调好了,外设使用只需打开水龙头),空项目也初始化时钟树。如果不用Cube,我们需要自己配置RCC寄存器,配置通到每个外设的时钟,很麻烦。
Cube在创建好文档后,需要我把USER文件夹复制到工程目录下,并在设置里增添文件路径。想增加自己的文档,就在keil的左侧菜单USER目录里添加新文件,存储在USER文件夹里。如果该项目用不着的文件,可以不添加进keil项目目录。只添加c文件就行,在c文件里包含头文件,在#include那里可以打开头文件。
ps:只要头文件包含进了main.c,我就能用对应的c文件里的函数了,不包含就不能用。头文件必须有其c文件新定义函数的声明。不论是c文件还是h文件,只要用到了其他文件中的函数和宏定义,最好都#include对应的头文件进来,其中c文件的#include可以写在其头文件里,故只需包含其头文件即可。
任何文件(.c、.h)中包含头文件的目的都是事先声明本文件需要用到的函数,而某头文件的目的是需要包含对应c文件的新定义函数的声明。
头文件的精髓——多个文件的公用代码段。
任何c文件都会被编译。但如果主程序不调用其中的函数,就不被连接到主程序中。
GPIO:
GPIO外设功能官方介绍:
根据数据表中列出的每个I/O端口的具体硬件特性,可以通过软件对每个端口位单独配置为以下模式:
•输入模式 Input mode
•模拟模式 Analog mode
•输出模式 Output mode
•切换功能模式 Alternate function mode
•外部中断/事件线 External interrupt/event lines
在复位期间和复位后,备用功能和外部中断线不活动,I/O端口配置为输入浮动模式。
所有的GPIO管脚都有弱的内部上拉和下拉电阻,可以激活或不激活。
在Output或Alternate模式下,每个IO可以配置为open-drain或push-pull类型,IO速度可以根据VDD值进行选择。
所有端口都具有外部中断/事件能力。要使用外部中断线,端口必须配置为输入模式。所有可用的GPIO引脚连接到EXTI0到EXTI15的16条外部中断/事件线。
外部中断/事件控制器由连接线设备中多达20个边缘检测器组成,或其他设备中用于生成事件/中断请求的19个边缘检测器组成。每条输入线都可以独立配置以选择类型(事件或中断)和相应的触发事件(上升或下降或两者都有)。挂起寄存器维护中断请求的状态行。
一、GPIO口输入模式:
Cube用法:
1、选择引脚,设为GPIO_INPUT
2、左侧的GPIO的配置界面中GPIO选项卡下点击该端口,可以修改默认参数
Cube帮我做的:
1、GPIO初始化(CUBE在main.c添加MX_GPIO_Init()已经做好)
时钟使能。时钟树的水龙头有水,现在需要打开取水。(每个AHB时钟周期,采样至输入数据寄存器一次)
初始化结构体填写。包括引脚号、GPIO号、模式、上下拉电阻设置。没有速度设置。
我还要做的:
直接应用(如用库函数获取该端口的状态,用于按键检测)
二、GPIO口输出模式:
Cube用法:
1、选择引脚,设为GPIO_OUTPUT
2、左侧的GPIO的配置界面中GPIO选项卡下点击该端口,可以修改默认参数
Cube帮我做的:
1、GPIO初始化(CUBE在main.c添加MX_GPIO_Init()已经做好)
时钟使能。(对于输出来说其实用不着时钟,但是由于该模式下输入采样仍要进行,所以要开时钟)
输出电平初始化。即软件里设置的初始电平。通过HAL_GPIO_WritePin(···)函数。(该模式独有)
初始化结构体填写。包括引脚号、GPIO号、模式、速度、上下拉电阻设置。
应用步骤:
直接应用(如点灯、翻转)
三、GPIO口模态模式(被设为ADC输入通道时才有实际用处):
Cube用法:
1、选择引脚,设为GPIO_ANALOG
2、左侧的GPIO的配置界面中GPIO选项卡下点击该端口,可以修改默认参数
Cube帮我做的:
1、GPIO初始化(CUBE在main.c添加MX_GPIO_Init()已经做好)
时钟使能。
初始化结构体填写。包括引脚号、GPIO号、模式。没有速度、上下拉电阻(此模式禁用)设置。
我还要做的:
直接应用(暂时不知道用来干嘛)