【朱老师课程总结】

第一部分、章节目录

第二部分、章节介绍

3.5.1.STM32的GPIO模块数据手册详解1

本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法。

3.5.2.STM32的GPIO模块数据手册详解2

本节继续讲解STM32的数据手册中GPIO部分,主要是GPIO配置的寄存器列表及寄存器位详解。

3.5.3.原理图分析与MDK工程创建

本节分析ARM3.0的GPIO控制LED相关的原理图,而且创建MDK工程,简单讲一下启动文件。

3.5.4.写代码控制GPIO点亮熄灭LED

本节编写代码控制GPIO以点亮熄灭LED,主要内容是寄存器地址的肯定以及使用C语言操做寄存器的编程技巧。

3.5.5.STM32时钟设置函数移植与讲解1

本节移植STM32时钟设置函数,而且结合前面课程讲过的时钟框图对时钟设置函数进行讲解

3.5.6.STM32时钟设置函数移植与讲解2

本节移植STM32时钟设置函数,而且结合前面课程讲过的时钟框图对时钟设置函数进行讲解

3.5.7.STM32外设编程经验总结

本节对整个课程进行总结,并对比了51单片机和stm32单片机外设编程的差异,告诉你们stm32学习的关键点和思路方法。        3d

第三部分、随堂记录

3.5.1.STM32的GPIO模块数据手册详解1

数据手册第8章:通用和复用功能I/O(GPIO 和AFIO)指针

3.5.1.一、GPIO功能描述调试

(1)每一个I/O端口(GPIOx)包含的寄存器

两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)

两个32位数据输入/输出寄存器(GPIOx_IDR和GPIOx_ODR)

一个32位端口位置位/复位寄存器(GPIOx_BSRR)                置位:写1,复位:写0

一个16位端口位复位寄存器(GPIOx_BRR)                             也是32位寄存器,只不太高16位保留不用!

一个32位端口配置锁定寄存器(GPIOx_LCKR)

PS:BRR和BSRR复位功能类似、在STM32F103C8中每一个GPIO端口包括16个引脚

(2)每一个端口的每一个位能够由软件分别配置成多种输入输出模式。

输入浮空

输入上拉

输入下拉

模拟输入

开漏输出

推挽式输出

推挽式复用功能

开漏复用功能

详细了解能够看这个文件:GPIO输入输出模式详解

(3)每一个端口均可以配置三种最大输出翻转速度

在配置寄存器里设置便可

后面都是关于硬件设计的,只要作了解便可!

(4)外设的GPIO配置

3.5.2.STM32的GPIO模块数据手册详解2

(1)GPIO寄存器描述

GPIO的寄存器基地址是0x40010800

端口配置低寄存器 端口配置低寄存器(GPIOx_CRL) (x=A..E)

端口配置高寄存器 端口配置高寄存器(GPIOx_CRH) (x=A..E)

为何会有两个端口配置寄存器呢?由于一个端口配置寄存器只能配置8个引脚,两个就能够配置一个端口!CNFx位和MODE位关联

端口输入数据寄存器 端口输入数据寄存器(GPIOx_IDR) (x=A..E)

端口输出数据寄存器 端口输出数据寄存器(GPIOx_ODR) (x=A..E)

端口位设置 端口位设置/ 清除寄存器(GPIOx_BSRR) (x=A..E)

是对ODR位置位/复位

若是BRy和BSy同时被置位,BSy有优先权。

端口位清除寄存器 端口位清除寄存器(GPIOx_BRR) (x=A..E)

端口配置锁定寄存器 端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)

(2)复用

AFIO的起始地址:0x4001 0000

3.5.3.原理图分析与MDK工程创建

3.5.3.一、硬件接线

(1)杜邦现链接P0端口到LED接口J19,这样至关于8个LED分别对应PB8-PB15

PB8—LED0,PB9—LED1...

PB8-PC15是我们的P0端口

(2)LED是共阴,因此GPIO输出0就亮,输出1就灭!

接线以下:

3.5.3.二、MDK工程创建

(1)根据STC51的经验

打开keil—new project—添加main.c—create hex file—编程运行!咱们先试一下!

在main.c中添加代码!

int main(void)

{

}

点击编译,发现报错了!

缘由在于,咱们没有给它加启动文件!

启动文件,见过吗?

在STC51开发时,咱们新建一个文件,他就会添加一个文件STARTUP.A51,这个就是启动文件!在STM32中,启动文件是什么呢?

启动文件简介

启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要作了如下工做:

一、初始化堆栈指针SP=_initial_sp

2\初始化PC 指针=Reset_Handler

三、初始化中断向量表

四、配置系统时钟

五、调用C 库函数_main 初始化用户堆栈,从而最终调用main 函数去到C 的世界

启动文件中很重要的一段代码以下,经过这里进入到main函数

; Reset Handler

Reset_Handler PROC

EXPORT Reset_Handler [WEAK]

IMPORT __main

LDR R0, =__main

BX R0

ENDP

在寄存器编程时,你们能够先用下面这个启动文件,下一节库函数编程再细讲!

再次编译就无误了!

至此,一个新创建的工程就算完成了,目前还没开始在main.c中写代码!

3.5.4.写代码控制GPIO点亮熄灭LED

3.5.4.一、编程思路

咱们经过对GPIO寄存器编程来控制LED的亮灭,须要配置寄存器的输入输出模式、须要选择引脚、须要往输出寄存器写值

每一个GPIO寄存器在内存中都有本身的地址,咱们能够经过给地址内写值来配置寄存器

3.5.4.二、寄存器信息确认

(1)STM32 GPIOB的起始地址是:0x40010C00

(2)有可能涉及到的GPIO的地址:

(3)会用到的寄存器

因为PB8-PB15为GPIOB的高八个引脚,因此会使用CRH寄存器

由于要作输出,因此要使用ODR寄存器

BSRR和BRR能够选用!

3.5.4.三、C语言操做寄存器

(1)ARM是内存与IO统一编址的

因此ARM中的全部外设都是经过寄存器的方式来操做的

后面学的库函数编程,本质上也是寄存器编程,只不过是STM32已经作好了寄存器的封装!

(2)每一个寄存器都有地址

C语言经过这些地址来操做这些寄存器位,用到的C语言技巧主要是C语言的位操做和C语言指针。

(3)常见面试题:用C语言向内存地址0x30000004写入16,如何作?

*(unsigned int *)0x30000004 = 16;

或者

unsigned int *p = (unsigned int *)0x30000004;

*p = 16;

(4)编程

咱们能够设置输出模式为推挽输出、输出翻转速度为50MHz

所以CRH = CRH = 0x33333333

咱们能够先点亮全部灯

因此ODR = 0x00000000(8-15位为0,其余0/1均可以!)

(5)代码以下(可是你会发现,灯根本不亮,为何呢?后面分析)

#define GPIOB_CRH 0x40010C04

#define GPIOB_ODR 0x40010C0C

int main(void)

{

//GPIOB设置成推挽输出模式,速度是50MHz

*((unsigned int *) GPIOB_CRH) = 0x33333333;

*((unsigned int *) GPIOB_ODR) = 0x00000000;

//也能够用BSRR将PB8-PB15都复位成0

//*((unsigned int *) GPIOB_BSRR) = 0xff000000;

while(1);

}

3.5.5.STM32时钟设置函数移植与讲解1

3.5.6.一、LED不亮问题解决

(1)为何LED灯不亮呢?

STM32中的每个外设都对应了一个时钟,当咱们想要使用某一个外设的时候,必须先要开启它的时钟才行。GPIO的每个端口,都须要时钟使能才能工做!

(2)GPIO的时钟使能如何实现?

查看数据手册中的:APB2 外设时钟使能寄存器(RCC_APB2ENR)

咱们想要端口时钟使能,只要配置RCC_APB2ENR相应位。

由于咱们用的GPIOB,因此只要寄存器的第三位设置为1便可!

经过查询RCC寄存器组的基地址和RCC_APB2ENR的地址偏移量,获得RCC_APB2ENR的地址为0x40021018

因而RCC_APB2ENR = 0x00000008就能够开启GPIOB的时钟使能开关!

#define GPIOB_CRH 0x40010C04

#define GPIOB_ODR 0x40010C0C

#define RCC_APB2ENR0x40021018

int main(void)

{

//GPIO时钟使能

*((unsigned int *)RCC_APB2ENR) = 0x00000008;

//GPIOB设置成推挽输出模式,速度是50MHz

*((unsigned int *) GPIOB_CRH) = 0x33333333;

*((unsigned int *) GPIOB_ODR) = 0x00000000;

while(1);

}

3.5.6.二、GPIO点亮LED灯的流程

Step1:使能GPIO的时钟

Step2:初始化GPIO引脚至相应的模式

Step3:控制GPIO引脚输出高低电平

Step4:使用GPIO控制LED

到这里咱们基本上已经完成了GPIO点亮小灯的设置,下面是关于官方时钟示例代码的移植。为何移植?

上节课讲过,上电复位以后,系统的默认时钟是内部的HSI,咱们研究下如何从HSI移植到HSE。

3.5.6.四、时钟代码移植

3.5.6.STM32时钟设置函数移植与讲解2

3.5.7.STM32外设编程经验总结

3.5.7.一、STM32和51或其余简单单片机的相同

(1)开关环境都是Keil

(2)都是看原理图和数据手册

(3)都是用C语言

3.5.7.二、STM32和51或其余简单单片机的不一样

(1)工程会更复杂,会用到Keil的一些高级设置

(2)原理图和数据手册比简单单片机更复杂(复杂不是难)

(3)STM32会用到C语言的更多高级特性

3.5.7.三、外设编程思路

(1)都是套路

(2)会出现问题,这时候就须要调试能力(不必定非要调试器)

(3)注意熟悉和体会这种套路,后面引入库函数就是从这里讲起的

keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)相关推荐

  1. 【STM32单片机学习】第一课:STM32那些你该知道的事儿

    [朱老师课程总结 侵删] 第一部分.章节目录 3.1.1.STM32和STC51开发 3.1.2_3.STM32的来历背景 3.1.4.STM32简单中文手册带读 3.1.5.STM32的各种仿真器调 ...

  2. 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础

    上篇文章 单片机入门学习四 STM32单片机学习一 跑马灯程序和创建工程 仅介绍了入门程序及其编译运行过程,下面开始对stm32的一些基础知识做一个记录. 1.stm32f103zet6(上篇问题3 ...

  3. STM32单片机学习(11) DS18B20温度传感器实验

    STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...

  4. STM32单片机K型热电偶温度采集及控制温控模块MAX6675热电偶LCD1602

    实践制作DIY- GC0069-K型热电偶温度采集及控制温控 一.功能说明: 基于STM32单片机设计-K型热电偶温度采集及控制温控 功能介绍: STM32F103CXT6+LCD1602显示器+K型 ...

  5. Arduino小白学习记录:用电位器控制LED灯的亮度

    Arduino小白的学习记录:用电位器控制LED灯的亮度 一.介绍 二.材料准备 三.实验原理 四.实验步骤 五.代码 六.效果展示 七.总结分析 我是一个纯Arduino小白,为了完成老师安排的一个 ...

  6. 51 单片机 (1) I/O口 按键控制LED之P0口排坑篇

    实验内容 此次实验为利用单片机读取开关的状态从而控制LED的亮灭. 实验环境 仿真软件 Protue 8.9 sp2 IDE Keil5 C51 单片机 AT89C51 Protues仿真图 所用器件 ...

  7. 基于STC15W4K32S4单片机仿真《外部中断INT0控制LED亮灭》

    1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12 3.单片机选型:STC15W4K32S4 4.学 习 目 标:   1.学习外部中断INT0 5.程 序 文 件 : ...

  8. JavaScript学习 第四课(四)

    JavaScript学习 第四课(四) 学习内容 一.JavaScript的构成 二.浏览器对象模型(Browser Object Model) 三.window对象包含的方法 四.window对象的 ...

  9. Scrapy学习第四课

    python爬虫框架scrapy学习第四课 任务:爬取凤凰网导航下所有一级.二级和具体新闻数据 执行:爬虫实例 结果:爬取结果展示 任务:爬取凤凰网导航下所有一级.二级和具体新闻数据 凤凰网导航 一级 ...

最新文章

  1. Numpy入门教程:练习作业02
  2. 重构-改善既有代码的设计 读书笔记
  3. 生成有控制台的WIN32程序
  4. ubuntu检查端口是否开启_Ubuntu默认防火墙安装、启用、配置、端口、查看状态相关信息...
  5. 云计算具有什么平台_究竟什么是云计算?
  6. 看完这篇Redis缓存三大问题,够你和面试官battle几回合了
  7. 【转】原来支付宝、财付通每天都是这样对账、风控的!
  8. java bcd码_java中BCD编码
  9. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
  10. 一键伪装成 Windows 10:Kali Linux 2019.4 版本推出 “Undercover” 模式
  11. 算法知识点——(3)监督学习——SVM
  12. MariaDB修改端口号
  13. winform倒计时
  14. 企业管理系统有几种类型,分别是什么?
  15. 皮尔特沃夫服务器在什么位置,你知道LOL大区的服务器在哪吗?很有可能就在你家旁边...
  16. C语言实验——简单排序
  17. SAP FI组织结构及概念
  18. 【python】实现将json字幕转srt,并将繁体中文翻译为简体中文
  19. 社交电商快速吸粉裂变模式-全新拼团模式
  20. 原来动漫中的羞耻表情都是这样出来的,学会以后可以自己慢慢YY了

热门文章

  1. 正大国际期货:做期货主帐户有什么风险?
  2. BP 供应商创建与修改
  3. 矩阵论理论知识(五)矩阵的广义逆
  4. centos虚拟机调皮了
  5. js 中的SetTimeOut()
  6. 电路中TTL与CMOS的解释
  7. 请描述你对测试的了解, 内容可以涉及测试流程, 测试类型, 测试方法, 测试工具等。
  8. MMD初尝试1(骨骼系统)
  9. 安装和配置NFS服务器
  10. 文件服务器之一:NFS 服务器