前言
使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx
学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。
本文档添加了对代码的在线调试功能,有助于大家更好理解相关寄存器的变化。
理论学习
GPIO的相关理论请参考:
GPIO配置相关的IO口寄存器:
实践学习
一、设计规划
1.1 实验目标
开发板上两个LED:DS0和DS1交替闪烁,实现跑马灯的效果。
1.2 硬件资源
二、程序设计
2.1 工程文件
添加工程目录(.c和.h)
2.2 led.h文件
#ifndef _LED_H
#define _LED_H
#include "sys.h"
//LED端口定义
#define LED0 PFout(9) //DS0,基于sys文件的位带操作
#define LED1 PFout(10) //DS1
void LED_Init(void); //初始化函数声明
#endif
2.3 led.c文件
使用sys.c文件中的GPIO_Set函数对IO口进行初始化
RCC AHB1外设时钟使能寄存器(RCC_AHB1ENR)
#include "led.h"
//初始化PF9和PF10为推挽输出
//LED IO初始化
void LED_Init(void)
{
RCC->AHB1ENR |= 1<<5; //使能相关位的时钟
GPIO_Set(GPIOF,PIN9|PIN10, //设置相应的IO口
GPIO_MODE_OUT,GPIO_OTYPE_PP, //MODE_OUT:输出 OTYPE_PP:推挽
GPIO_SPEED_100M,GPIO_PUPD_PU); //SPEED_100M PUPD_PU:上拉
LED0 = 1;
LED1 = 1;
}
1<<5 = 0x0000 0010
RCC->AHB1ENR = RCC->AHB1ENR | 0x0000 0010 //将寄存器与左移表达式按位或,即将第5位置为1,即GPIOF的时钟进行时钟使能。
然后通过sys.c程序中的GPIO_Set函数对IO口进行配置与使能。
2.3 text.c文件
Stm32_Clock_Init(336,8,2,7);
plln:主频系数 = 8*366 = 2688MHz
pllm:主PLL = 2688 MHz / 8 = 366MHz
pllp:系统时钟 = 366 / 2 = 168MHz
pllq:USB/SDIO/随机数产生器时钟 = 168MHz / 7
#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(336,8,2,7); //时钟频率168M
delay_init(168);
LED_Init();
while(1)
{
LED0 = 0;
LED1 = 1;
delay_ms(500);
LED0 = 1;
LED1 = 0;
delay_ms(500);
}
}
三、在线调试
将代码下载到32开发板上,然后点击1进行代码在线调试。
点击2打开观察窗口,添加PF9和PF10两个GPIO的值,同时打开GPIOF的寄存器(最右面所示)
- 如下图在线调试后代码运行到启动文件的_main程序,下一步将进入main中执行C程序。
- 在LED_Init(void)中的GPIO_set后设置一个断点,来观察GPIO相关寄存器配置变化
可以通过寄存器相关的位看出其GPIO模式的配置:MODER将GPIO9/10配置为01(通用输出模式)、OTYPER复位状态(输出推挽)、OSPEEDR将GPIO9/10配置为11(100MHz高速)、ODR将GPIO9/10两个位配置为1(初始化点亮LED灯)
整体运行代码,可以发现输出寄存器PF9/10在0、1两者进行转换。
LED寄存器变化
四、上板验证
代码编译后无错误,点击下载按钮