备注:此实验是根据正点原子视频所写。初学STM32,完全是用于自我记录,若有问题,麻烦指正。
1. 初始化HAL库。
HAL_Init();
2.初始化系统时钟。
Stm32_Clock_Init();
3.使能IO口时钟。
__HAL_RCC_GPIOB_CLK_ENABLE(); 。此处使能的是GPIOB。其原理图如下图所示:
4.初始化IO口模式。
在GPIO的源文件中,void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init),其中第一个参数是用来指定需要初始化的GPIO对应的GPIO组,取值范围是GPIOA~GPIOK。第二个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。
故先在main函数中定义一个变量:
GPIO_InitTypeDef GPIO_InitStructure;
而GPIO_InitTypeDef中,包括了,Pin(指定IO口),Mode(模式设置),Pull(上下拉设置),Speed(速度模式)和Alternate(复用映射配置,此实验为设计到)。模式设置中输入模式有:GPIO_Mode_AIN(模拟输入)、GPIO_Mode_IN_FLOATING(浮空输入)、GPIO_Mode_IPD(下拉输入)、GPIO_Mode_IPU上拉输入。输出模式有:GPIO_Mode_Out_OD(开漏输出)、GPIO_Mode_Out_PP(推挽输出)、GPIO_Mode_Out_OD(复用开漏输出)、GPIO_Mode_Out_PP(复用推挽输出)。
笔者在想设置了模式,却还要设置上下拉,这是为什么?其答案连接在此:GPIO_Init函数里明显是有这个上下拉配置的,并没有针对这个输入输出模式的if字段。 就电路分析的角度来看,复用推挽输出模式下无论是上拉还是下拉都不会影响其原本配置的电平输出。 而在开漏输出模式下,其高电平输出的实际电平却由外部的上下拉决定,类似于TTL门电路的漏极开路输出,而低电平输出的实际电平与复用推挽一致,不被外部的上下拉影响,恒为低电平。 https://www.cnblogs.com/LeoCathyFelix/p/12938319.html
其速度模式不在此述说。
5.操作IO口,输出高低电平。
操作高低电平,是为了控制灯的亮与灭。
HAL_GPIO_WritePin();
6.其全部完整代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main(void)
{
HAL_Init(); //³õʼ»¯HAL¿â
Stm32_Clock_Init(360,25,2,8); //ÉèÖÃʱÖÓ,180Mhz
__HAL_RCC_GPIOB_CLK_ENABLE(); //ʹÄÜPBʱÖÓ
delay_init(180); //ÑÓʱº¯Êý£¬ÏµÍ³Ê±ÖÓΪ180M
//³õʼ»¯IO¿Ú
GPIO_InitTypeDef GPIO_InitStructure; //³õʼ»¯²ÎÊý½á¹¹ÌåÖ¸Õë
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.Pin=GPIO_PIN_0 | GPIO_PIN_1; //ÉèÖÃÒý½Å
GPIO_InitStructure.Pull=GPIO_PULLUP; //ÉèÖÃÉÏÏÂÀ£¬´Ë´¦ÎªÉÏÀ
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //ÉèÖÃËÙ¶È
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure); //½á¹¹Ì壬ÐèҪȡµØÖ·&
//²Ù×÷IO¿Ú£¬Êä³ö¸ßµÍµçƽ
while(1){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB0=0µÍµçƽ
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0=0µÍµçƽ
delay_ms(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
delay_ms(500);
}
}