使用的普中Stm32F429进行自学,自学视频主要是普中自带的视频以及正点原子的视频。正点原子的视频讲解的更加细致一点。以下是自学中自己的体会和总结,就相当于日记一般,梳理一下自己的思路,如有错误,望指出,感谢!
首先安装keil5以及CH340驱动。
第一个实验是点亮第一个LED小灯
首先创建工程,配置驱动文件,HAL库,以及软件接口,并建立公用系统文件(主要存放开发需要用到的文件,例如片上外设接入层系统头文件等),以及用户文件主函数等,再额外建立一个应用文件(主要针对需要开发的功能进行书写)。
前面的步骤跟着教程一步步走,然后主要就是要进行文件的管理,需要注意的是,在书写.h文件时要主要不要重复预处理相同的头文件,将开发需要的公用文件提取到公用系统文件目录下的文件中,避免后续移植时头文件的大量更改。
在本次实验中LED12分别对应这GPIOB中的PIN0和PIN1,要学会看芯片原理图,找到对应外设的引脚。
在进行点亮LED灯的实验中,首先写LED初始化函数,定义GPIO_InitTypeDef结构体,并将对应的GPIOx的时钟使能。定义结构体中的管脚以及模式,设置上下拉模式,并且定义速度,最后进行初始化,并将对应的引脚置为1.
这里补充一下,对于不同的GPIO模式可以参考开发手册。具体为8种模式。对于输入模式,主要分为上拉,下拉,浮空,模拟功能四种种模式,对于上拉,当I/O引脚无输入时默认为高电平,下拉同样,而浮空状态,当I/O引脚无输入时处于高阻态,会受到外界环境的影响。对于输入模式,主要分为开漏输出,推挽输出,开漏式复用功能,推挽式复用功能,此功能下同样存在上下拉,详细区别参考开发攻略,需要注意的是在输出控制中,存在一个反相器,即取反,即当输出寄存器ODR为高电平时实际输出控制为低电平,PMOS导通,反之则NMOS导通。
在主函数中初始化HAL库,并设置系统时钟,调用LED初始化函数,在While循环中,对利用HAL库对引脚电平进行反转,并加上延迟,进行达到闪烁的效果。
具体LED初始化函数代码如下:
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义初始化结构体变量
__HAL_RCC_GPIOB_CLK_ENABLE();//时钟使能
GPIO_InitStructure.Pin= GPIO_PIN_0|GPIO_PIN_1;//定义管脚
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//定义推挽输出
GPIO_InitStructure.Pull = GPIO_PULLUP;//上拉模式,输出高电平
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;//定义高速
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);//引脚置1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);//引脚置1
}
主函数代码如下:
#include "system.h"
#include "led.h"
void delay(u32 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
HAL_Init(); //初始化HAL库
SystemClock_Init(25,360,2,8); //设置时钟,180Mhz
LED_Init();
while(1)
{
//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
delay(0x7fffff);
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);//设置PB1输出低
// delay(0x7fffff);
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);//设置PB1输出低
// delay(0x7fffff);
}
}