创建工程
本次学习是用标准库来开发stm32,所以在创建工程时需要添加必要的文件
启动文件
启动文件:https://pan.baidu.com/s/1VBbIG73hm5_4d8dO3UXBbw?pwd=3232
打开Keil5,创建一个新的工程,在工程文件夹下把下载好的启动文件夹放进去,然后再添加组
添加库函数文件
刚刚添加好的启动文件可以用写寄存器的方式来开发stm32,但用寄存器的方法过于繁琐,所以还需要添加标准库。库函数文件:https://pan.baidu.com/s/1jYKRPQNz6K7rnYgFjlOjEw?pwd=3232
将库函数文件添加到工程文件夹里面,然后再添加组,把库函数文件夹中所有文件添加。
还要需要添加配置头文件包含关系的文件:https://pan.baidu.com/s/1JkgFp0GGdCvBFc5wQwU7jg?pwd=3232
也将这个文件添加到工程文件里面,再添加组即可。
其他设置
文件路径
刚刚添加的启动文件和库函数文件,不能直接用,还要把这些文件路径添加进去
设置STLink
MDK默认使用的是ULink,需要再设置中修改成STLink
条件编译,选择使用标准外设驱动
头文件包含关系的头文件,有一段条件编译,这里我们选择标准外设驱动
其他设置
Keil5的缩进和中文乱码问题比较麻烦,可以选择自己设置一下
这样就可以用标准库来开发stm32了
GPIO口
GPIO就是通用输入/输出口,GPIO有A~G端口,每个有0~15的IO口,每个端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问;这 样,在读和更改访问之间产生IRQ时不会发生危险。GPIO口可以配置成多种模式,包括浮空输入、下拉输入、上拉输入、模拟输入、开漏输出、推挽输出、推挽复用输出。
IO口的基本结构
输入部分
保护电路部分:如果输入的电压过大,上面的二极管导通,不会流入芯片;如果电压过低,下面的二极管导通,不会让电流从芯片流向外面。
上拉和下拉部分:上面接通的话,外部没有输入,会默认读取高电平,也就是被配置成上拉输入,下拉则反之。如果都没有接通则会配置成浮空输入,输入会不稳定,不建议配置成浮空输入。
施密特触发器:这里应该是翻译错误,施密特触发器可以自行去了解。
模拟输入和复用功能输入后面再细说。
输入的部分没有进入模拟输入和复用功能输入的话,就会转变成数字信号(0和1)存入寄存器,芯片和读取寄存器中的值。
输出部分
推挽输出:输出控制旁边上端的mos管导通,高电平具有驱动能力,能点亮LED灯
开漏输出:下端的mos管导通,高电平不具有驱动能力,如果想要操作外设,还要外接一个高电平
复用功能输出之后再了解
RCC时钟
在使用一个外设之前,首先要开启对应外设的时钟。之后会细讲RCC时钟
关于GPIO的函数
固件函数链接:https://pan.baidu.com/s/1Q5bLtZ89uHsVwaPegwUPoQ?pwd=3232
在文档里面有各种函数的介绍和使用方法。
点亮LED灯
点亮一个LED灯
接线图
代码部分
#include "stm32f10x.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//配置成推挽输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//置低电平
while(1)
{
}
return 0;
}
标准库初始化GPIO的方式,是通过一个结构体,在通过这个结构体完成GPIO的初始化。
小结
要使用GPIO输入输出,首先要打开对应外设的时钟,再创建GPIO_InitTypeDef的结构体变量,给变量赋值,再用结构体来初始化,最后用函数来读取/写入GPIO的高低电平。