一、库函数版本

1、硬件原理图

2、软件设计

打开上一节新建的库函数版本工程模板,直接点击工程下面的 USER 目录下面的 Template.uvproj。

跑马灯实验我们主要用到的固件库文件是:
stm32f4xx_gpio.c /stm32f4xx_gpio.h
stm32f4xx_rcc.c/stm32f4xx_rcc.h//每个实验中都要引入,因为系统时钟配置函数以及相关的外设时钟使能函数
misc.c/ misc.h //SYSTEM 文件夹中都需要使用到
stm32f4xx_usart .c/stm32f4xx_usart.h//SYSTEM 文件夹中都需要使用到
stm32f4xx_syscfg.c/stm32f4xx_syscfg.h//后面很多实验都要使用到

在FWLIB文件夹中有多余的源文件,使得编译速度变慢,可以去掉多余的源文件,留下上面使用的5个源文件,右击 Template,选择“Manage project Items”,进入这个选项卡

选中“FWLIB”分组,然后选中不需要的源文件点击删除按钮删掉,剩下上述5个源文件

然后我们进入我们工程的目录,在工程根目录文件夹下面新建一HARDWARE 的文件夹,用来存储以后与硬件相关的代码。然后在 HARDWARE 文件夹下新建一个 LED 文件夹,用来存放与 LED 相关的代码。

新建一个文件,然后保存在 HARDWARE->LED 文件夹下面,保存为 led.c
然后在 led.c 文件中输入如下代码,点击保存

#include "stm32f4xx.h"
//LED IO初始化
void LED_Init(void)
{        GPIO_InitTypeDef  GPIO_InitStructure;//配置GPIO所用的结构体RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//时钟使能函数,PF9和PF10为输出口,所以使能这两个口的时钟,GPIOF又在AHB1总线下,所以调用AHB1函数//GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED所对应的两个IO口,两个IO口的功能一样才能这么设置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉,在硬件原理图中看出上拉led熄灭GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10拉高}

用同样的方法新建一个 led.h 文件,也保存在 LED 文件夹下面。在 led.h 中输入如下代码:

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);     #endif

接着,我们在 Manage Project Itmes 管理里面新建一个 HARDWARE的组,并把 led.c 加入到这个组里面。这样就把led.c文件添加到工程中了

然后将 led.h 头文件的路径加入到工程里面

最后在main.c中输入如下代码,烧录进开发板,使两个led间隔500ms闪烁

#include "stm32f4xx.h"//顶层头文件
#include "led.h"
#include "delay.h"int main ()
{delay_init(168);//此模板默认设置是168LED_Init();//初始化ledwhile(1){GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_10);//输出高电平,熄灭delay_ms(500);GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_10);//输出高电平,点亮delay_ms(500);}
}

函数快速跳转:双击函数,右键点击Go To Definition Of ’ ’

二、寄存器版本

操作步骤与库函数版本一致,在led.h输入如下代码:

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);     #endif

在led.c中写寄存器的led初始化函数

1、使能IO口时钟

配置相关寄存器寄存器RCC->AHB1ENR,打开STM32F4XX中文参考手册的6.3.12 小节RCC AHB1 外设时钟使能寄存器,可以看到GPIOF在标号的第5位,设置为1使能IO端口F时钟,其他位不变

RCC->AHB1ENR |= 1<<5;

2、初始化IO口模式

配置四个配置寄存器 GPIOx_MODER/ GPIOx_OTYPER/ GPIOx_OSPEEDR/ GPIOx_PUPDR;打开STM32F4XX中文参考手册的7.4.1小节可以看到控制IO口的9和10,设置为01:通用输出模式

GPIOF->MODER &= ~(3<<2*9);//第18和19位的MODE寄存器清零其他位不变,11左移18位然后取反按位与
GPIOF->MODER |= 1<<(2*9);//清零的18和19位置为 01其他位不变,01左移18位后按位或

OSPEEDR和PUPDR寄存器同MODER寄存器一样都是32位寄存器,配置方式相同,OTYPER是16位寄存器,有一点不同

设置0为输出推挽

3、操作IO口,输出高低电平

配置寄存器GPIOX_ODR或者BSRRL/BSRRH。

1拉高,0拉低

GPIOF->ODR |= 1<<9;//拉高
GPIOF->ODR &= ~(1<<9);//拉低.用&

在led.c文件中的代码:

#include "stm32f4xx.h"
//LED IO初始化
void LED_Init(void)
{        RCC->AHB1ENR |= 1<<5;//通过寄存器使能GPIOF时钟,GPIOF在寄存器的第六位,所以将1左移5位,其他不变//PF9GPIOF->MODER &= ~(3<<2*9);//第18和19位的MODE寄存器清零其他位不变,11左移18位然后取反按位与GPIOF->MODER |= 1<<(2*9);//清零的18和19位置为 01其他位不变,01左移18位后按位或GPIOF->OSPEEDR &= ~(3<<2*9);//清零GPIOF->OSPEEDR |= 2<<(2*9);//10,50HZGPIOF->PUPDR &= ~(3<<2*9);//清零GPIOF->PUPDR |= 1<<(2*9);//01,上拉GPIOF->OTYPER &= ~(1<<9);//清零GPIOF->OTYPER |= 0<<9;//输出推挽GPIOF->ODR |= 1<<9;//拉高//GPIOF->ODR &= ~(1<<9);//拉低.用&//PF10GPIOF->MODER &= ~(3<<2*10);//第18和19位的MODE寄存器清零其他位不变,11左移18位然后取反按位与GPIOF->MODER |= 1<<(2*10);//清零的18和19位置为 01其他位不变,01左移18位后按位或GPIOF->OSPEEDR &= ~(3<<2*10);//清零GPIOF->OSPEEDR |= 2<<(2*10);//10,50HZGPIOF->PUPDR &= ~(3<<2*10);//清零GPIOF->PUPDR |= 1<<(2*10);//01,上拉GPIOF->OTYPER &= ~(1<<10);//清零GPIOF->OTYPER |= 0<<10;//输出推挽GPIOF->ODR |= 1<<10;//拉高
}

主函数的代码为:

#include "stm32f4xx.h"//顶层头文件
#include "led.h"
#include "delay.h"int main ()
{delay_init(168);//初始化时钟,此模板默认设置是168LED_Init();//初始化ledwhile(1){GPIOF->ODR &= ~(1<<9);//拉低GPIOF->ODR |= 1<<10;//拉高delay_ms(500);GPIOF->ODR |= 1<<9;//拉高GPIOF->ODR &= ~(1<<10);//拉低delay_ms(500);}
}

烧录进开发板后看到两个LED交替闪烁

三、位操作

前两步使能IO口时钟和初始化IO口模式操作跟前面一样,只是在操作IO口,输出高低电平时使用位带操作。
只需要修改主函数:

#include "stm32f4xx.h"//顶层头文件
#include "led.h"
#include "delay.h"int main ()
{delay_init(168);//初始化延时函数,此模板默认设置是168LED_Init();//初始化ledwhile(1){PFout(9) = 1;//拉高PFout(10) = 1;//拉高delay_ms(500);PFout(9) = 0;//拉低PFout(10) = 0;//拉低delay_ms(500);}
}

这里的PFout(9)和PFout(10)可以简单理解为GPIOF寄存器第9和10端口的另一个地址,与寄存器上32个地址一一对应,他们之间是映射关系中间通过进行转换。
关于如何转换可看工程代码SYSTEM文件夹下的sys.h头文件查看宏定义

正点原子stm32F407学习笔记2——GPIO操作跑马灯实验相关推荐

  1. 正点原子stm32F407学习笔记1——新建工程模板

    一.基于固件库 1.新建文件夹 新建一个Template文件夹,在此文件夹下新建五个子文件夹 2.打开keil软件,点击菜单栏Project –>New Uvision Project,如果有其 ...

  2. 正点原子stm32F407学习笔记4——按键输入实验

    一.硬件连接 KEY0.KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效,并且外部都没有上下拉电阻,所以,需要在 STM32F4 内部设置上下拉. 二.软件设计 参考蜂鸣器一节新 ...

  3. 正点原子stm32F407学习笔记3——蜂鸣器实验

    一.硬件设计 蜂鸣器为有源蜂鸣器,当 PF.8 输出高电平的时候,蜂鸣器将发声,当 PF.8 输出低电平的时候,蜂鸣器停止发声,硬件原理图如下 二.软件设计 1.新建beep.c文件 打开keil软件 ...

  4. 【STM32F407学习笔记】GPIO(一)

    [STM32F407学习笔记]GPIO(一) 1. GPIO基础知识 1.1 GPIO工作方式 1.2 GPIO相关配置寄存器 1.2.1 端口模式寄存器:GPIOx_MODER 1.2.2 输出类型 ...

  5. 正点原子探索者原理图_正点原子【STM32-F407探索者】第六章 跑马灯实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...

  6. STM32F4(正点原子)学习笔记(一):GPIO及其小实验

    目录 一.写在前面: 二.GPIO基本情况 1.概述 2.引脚说明 3.GPIO工作方式 (1)4种输入模式 (2)4种输出模式 (3)4种最大输出速度 (4)主要特性 4.GPIO相关配置寄存器 三 ...

  7. 正点原子STM32F103ZET6学习笔记-新建库函数工程模板

    STM32F10x系列官方固件包免费下载链接 新建STM32工程 步骤一:创建工程文件 1,新建工程目录temp 2,在工程目录temp下面新建四个文件夹 (1)USER:存放工程文件(templat ...

  8. 正点原子STM32F103学习笔记(六)——时钟系统

    时钟系统 RCC: reset clock control 复位和时钟控制器. 注意: 任何一个外设在使用之前,必须首先使能其相应的时钟 时钟系统框图 图形含义 梯形灰色方块:选择器 蓝色框:时钟源 ...

  9. (实验4)单片机,STM32F4学习笔记,代码讲解【串口实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 串口中断程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] (实 ...

最新文章

  1. [Ms SQL] 基本創建、修改與刪除
  2. 切换日期_2.4.14-切换时区分析
  3. STM32开发 -- 无线网络协议
  4. SAP UI5对于颜色使用的最佳实践
  5. Intel硬件加速 VS CUDA完胜 视频转码感受
  6. Node.js -- 目录
  7. Jquery中选择器
  8. 软件著作权算法软件设计说明书_软件详细设计说明书例子.pdf
  9. C++ MFC字体设置
  10. 飞桨黑客马拉松线上收官,线下HACK Together,继续COOL
  11. win10下标注工具sloth的安装及使用
  12. 快速上手 TypeScript
  13. AcWing每日一题2041. 干草堆
  14. 蚌埠市哪有学计算机编程的,蚌埠小孩学习编程
  15. 细数中国历史上的十大乱世枭雄(上)
  16. SEED-XDS560Plus Emulator for CCS3.3.82.exe 在硬盘上都安装了什么?
  17. 艾宾浩斯遗忘曲线PHP,艾宾浩斯抗遗忘曲线 [抗遗忘艾宾浩斯记忆法]
  18. 解题思考F. 解方程(二分法解方程)
  19. sql列转行逗号连接_SQL行转列,逗号隔开
  20. 数据结构与算法-打印直角三角形算法

热门文章

  1. for循环从一到一百的数字及九九乘法表
  2. PC - IPS 屏幕到底哪里好?
  3. 下载b站视频以及视频剪辑软件推荐
  4. 汉诺塔移动过程c语言,汉诺塔移动过程(C语言)
  5. Hexo NexT主题添加友链
  6. SQL注入漏洞的攻击与防御
  7. java拦截器实现防止SQL注入与xss攻击拦截
  8. 【个人回顾】C语言程序设计-第三版-何钦铭主编-4
  9. 130. 火车进出栈问题
  10. Open3D c++配置(VS2019)