新建STM32工程的架构:


我们主要是为了看一下STM32配置的那些文件有啥作用:
stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,在keil可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦。

所以就提供了库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式。

这个conf的文件就是用来配置头文件的包含关系的,在keil中可以看到conf文件include了所有的库函数头文件,

同时我们在stm32f10x.h的最后又包含了conf,

所以在使用这些库函数时,我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,这样我们就可以任意地调用库函数了。
记得包含下面这个宏定义:


GPIO的结构:

推挽输出模式
在推挽输出下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出接到VDD输出高电平,反之同理。这种模式下高电平均有较强的驱动能力,所以又称强推输出模式。
开漏输出模式
在开漏输出模式下,P-MOS无效,数据寄存器为1时,下管断开,输出断开,高阻模式。
8种GPIO模式:

我们可以在手册上看到相关的GPIO配置时钟等信息:

不同情况下GPIO的配置可能不一样,我们可以看手册中的内容自行选择

在rcc.h的文件可以配置时钟那些,主要有三条函数:

主要的函数:
1 2 3 4 5 6 7
| void GPIO_DeInit(GPIO_TypeDef* GPIOx); 被指定的GPIO外设会被复位 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 用结构体参数来初始化GPIO口(⭐重要函数) void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); 把结构体变量赋一个默认值 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读取输入状态、读取指定引脚的输入电平(1位) uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 读取输入状态、读取整个端口的输入数据(16位) uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);读取输出状态、读取指定引脚的输出锁存值(1位) uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);读取输出状态、读取整个端口的输出锁存值(16位)
|

LED.c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include "stm32f10x.h"
void LED_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); }
void LED_ON(void){ GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); }
void LED_OFF(void){ GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); }
|