用寄存器&HAL库完成LED流水灯程序以及通过MDK5模拟示波器观察波形

前言

1.学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
2.用 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。
3.安装 stm32CubeMX,用cubemx完成初始化过程,采用HAL库编程实现。
4.在Keil下用软件仿真运行上面代码,并用虚拟逻辑分析仪观察 对应管脚上的输出波形(高低电平转换),看是否是1秒的周期。

一、相关寄存器配置介绍

1.相关寄存器配置介绍

不管是库函数操作还是HAL操作,本质上都是对寄存器的操作。
在提供的“ STM32F103中文教程及参考手册”中看到GPIO寄存器7种类型,首先看下5.2.1端口配置低寄存器,通过该寄存器具体介绍下。
先解释下(GPIOx_CRL)(x=A…E)的意思。stm32f103引脚有多有少,多则144个,少则48个(本实验用的48脚芯片),所以会把这些引脚分成组,A、B、C、D…每组最多16个引脚,注意,是最多,并不是一定要有16个引脚!
在这里插入图片描述
48引脚的单片机只分成了A、B、C、D(PA、PB、PC、PD)组。GPIO英语的全称是General-purpose input/output,翻译过来就是通用的IO口。GPIOA_CRL的意思是控制A口的CRL寄存器。在这里插入图片描述再回到上面的CTRL寄存器图,“偏移地址0x00”。那么偏移是相对于谁偏移的,应该有个基准!先给大家举个例子,要盖一幢商务大楼,外面盖完了如果里面是空的,是不行的,所以要盖一层层,一层层盖了也不行,在每一层隔处一个个房间,这样一幢商务大楼才能使用。我们单片机内存也是,整一大块是不能用的,也要隔成一个个房间才能使用,每个房间相当于寄存器,要么有人(相当于为1),要么没人(相当于为0)。所以要查下GPIOC安排在几楼!

在提供的手册中(P18页)可以看到GPIOC的地址范围是0x4001 1000~0x4001 13FF。所以它的起始地址是0x4001 1000,也就是基地址!偏移0x00后可以得出GPIOC->CRL的地址(GPIOC端口的起始地址+偏移地址)为0x40011000。
所谓的复位值,就是指如果没有操作这个寄存器时,寄存器存放的默认值。复位值按位拆分0x4 = 0b0100,0x表示16进制,0b表示二进制,也就是默认CNF 01,MODE 00,是浮空输入。
在这里插入图片描述
再回到CTRL寄存器图,看下面的图。一共有32个位,0~31,也就是CTRL寄存器有32位,这也是为什么叫做stm32的原因,以前的51单片机是8位单片机也就是一次性最多能处理8个位。在这里插入图片描述
看红色框部分(0-3位),CNF0和MODE0。再看4-7位,CNF1和MODE1。说明GPIOC中的第0位需要CNF0和MODE0这4个位来控制,GPIOC中的第1位需要CNF1和MODE1这4个位来控制。具体可以控制哪些呢,在往下看。在这里插入图片描述
在上图中,以MODE0为例,占了两个位,每个位可以表示0或1,所以可以表示4种情况!一般情况下是输出模式,在下表中的MODEy[1:0]就可以看到③,有输出和输入模式,本次实验就是选择“10”表示输出模式,最大速度为2MHZ,再去看CNFy[1:0],根据输入输出的不同有不同的选择,那么我们刚才选的是输出模式,所以看②,选择“00”,表示“通用推挽输出模式”。
通过以下代码实现通用推挽输出模式:

GPIOC_CRH &= ~(0x0F<<(4*5));
GPIOC_CRH |= (1<<(4*5));

再看5.2.3和5.2.4,一个用于配置输入,一个用于配置输出,那么我们看输出。在这里插入图片描述
因为每个GPIO组只有16个引脚,所以ODR寄存器只用了低16位,高16位保留。在这里插入图片描述
这个寄存器功能很简单,控制输出的数据为0或者1 。
所以我们控制LED延时闪烁也很简单,就是控制ODR寄存器先输出1,LED灯亮,延时一段时间,控制ODR寄存器先输出0,LED灯灭,一直循环,就能实现流水灯的效果。
代码如下:

GPIOC_ODR &= ~(1<<13);//配置输出低电平0
GPIOC_ODR |= (1<<13);//配置输出高电平1

二、使用寄存器点亮LED灯

1.工程模板的建立

stm32提供了一个用c语言封装好的固件库,我们要实现什么功能,直接调用相应的库函数即可。
要使用ST固件库,可以建立一个工程模板,方便我们调用函数。

2.配置GPIO端口

GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
GPIO端口的初始化设置三步骤:
a.时钟配置
b.输入输出模式设置
c.最大速率设置
库函数中提供了一个结构体来配置GPIO端口的输入输出模式设置 、 最大速率设置等。
定义的结构体如下:

// @file    stm32f10x_gpio.h
typedef struct
{
   
  uint16_t GPIO_Pin;           /*!< 选择要配置的 GPIO 引脚 */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< 选择 GPIO 引脚的速率 */

  GPIOMode_TypeDef GPIO_Mode;    /*!< 选择 GPIO 引脚的工作模式 */
}GPIO_InitTypeDef;

这个结构体中包含了初始化 GPIO 所需要的信息,包括引脚号、工作模式、输出速率。
设计这个结构体的思路是:初始化 GPIO 前,先定义一个这样的结构体变量,根据需要配置 GPIO 的模式,对这个结构体的各个成员进行赋值,然后把这个变量作为“GPIO 初始化函数”的输入参数,该函数能根据这个变量值中的内容去配置寄存器,从而实现 GPIO 的初始化。
配置 端口位为通用推挽输出,速度为 2M

GPIO_InitTypeDef   GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;  			//输出模式为通用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 ;             		//选定输出端口为GPIO_Pin_4
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;				//输出速度为2M

GPIO_Init(
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值