STM32F103下,通过电路搭建实现LED灯轮流闪烁的实验操作

一、创建一个keil工程
1.打开keil,点击Project,选择New uVision Project
2.选择 CPU 型号,根据开发板进行选择
3.在线添加库文件
用寄存器控制 STM32 时,不需要在线添加库文件,可以直接关掉。
4.添加文件
①添加已经存在文件
在新建的工程中添加启动文件(startup_stm32f10x_hd.s),该文件可以先到固件库中复制到此处startup_stm32f10x_hd.s。
②创建新文件
stm32f10x.h
手动新建,用于存放寄存器映射的代码,暂时为空。
main.c
手动新建,用于存放 main 函数,暂时为空。

在界面左侧的Project栏,打开Target1,鼠标右键单击Source Group1, 选择Add New Item to Group…

5.配置魔术棒选项卡
①Target设置

②Output设置

③Listing设置

④Debug设置

⑤Utilities设置

二、基于寄存器stm32 LED流水灯
1.寄存器的定义
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

2.GPIO (通用输入输出端口)
STM32 可控制的引脚。

此图引用零死角玩转STM32——F103指南版中对GPIO介绍,具体介绍可参考该书。
GPIO的工作模式

 typedef enum
 {
    GPIO_Mode_AIN = 0x0, // 模拟输入
    GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
    GPIO_Mode_IPD = 0x28, // 下拉输入
    GPIO_Mode_IPU = 0x48, // 上拉输入
    GPIO_Mode_Out_OD = 0x14, // 开漏输出
    GPIO_Mode_Out_PP = 0x10, // 推挽输出
    GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
    GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
} GPIOMode_TypeDef;

输入模式:上拉和下拉输入的电平由上拉或者下拉,浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。
输出模式:推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。

3.编写LED的代码(该过程需要参考STM32F10的手册)
stm32f10x.h

/*片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)

/*总线基地址,GPIO 都挂载到 APB2 上 */
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE  (PERIPH_BASE +0x20000)
/*GPIOC 外设基地址*/
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
/* GPIOB 寄存器地址,强制转换成指针 */
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
 
/*RCC 外设基地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*RCC 的 AHB1 时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)

main.c

int main(void)
{
    // 配置RCC寄存器,开启 GPIOC 端口时钟配置RCC寄存器
    *(unsigned int *)0x40021018 |=(1<<4);
    // 配置CRL寄存器,配置 PC2 为通用推挽输出,速度为 10M
    //*(unsigned int *)GPIOC_CRL |=(1<<(4*2));
    *(unsigned int *)0x40011000 |=(1<<(4*2));
    //配置ODR寄存器,清空控制 PC2 的端口位
    //*(unsigned int *)GPIOC_ODR &=~(1<<2);
    *(unsigned int *)0x4001100C &=~(1<<2);
    while (1)
    {
    }
}

3.功能分析
根据题目要求,使用GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚来控制LED灯,在查询C8T6数据手册后,管脚分别连接红绿蓝三种颜色的LED灯
目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让 LED 灯亮起来

三、工程调试编译及问题解决
1.工程调试编译
写入.c工程文件中,build生成hex文件:

成功调试:

四.GPIOx端口的各寄存器地址和详细参数
首先需要知道的是,STM32中对于GPIO口的操作,无非就是操作下面的寄存器而已,所谓的标准库也好,HAL库也好,它们都只是对操作寄存器的过程进行了封装,目的是为了减轻编程时的工作负担:
两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH

两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR

一个32位的置位/复位寄存器:GPIOx_BSRR

一个16位复位寄存器:GPIOx_BRR

一个32位锁定寄存器:GPIOx_LCKR

GPIO地址:

时钟地址:

GPIO的配置寄存器CRL和CRH
STM32的一组GPIO有16个IO口,比如GPIOA这一组,有GPIOA0~GPIOA15一共16个IO口。每一个IO口需要寄存器的4位用来配置工作模式
那么一组GPIO就需要16x4=64位的寄存器来存放这一组GPIO的工作模式的配置,但STM32的寄存器都是32位的,所以只能使用2个32位的寄存器来存放了。CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置
这两个寄存器的全称是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)
也就是每一组GPIO都有两个32位的寄存器是用来配置IO口的工作模式的。
我们都清楚STM32的GPIO有八种工作模式,4个二进制数可以组合出16种情况,而我们只需要8种就行了
2 .工作模式的配置

可以看出,4位中又分为了CNFx和MODEx(x表示这组GPIO的第几个IO口)
CNFx:
在输入模式(MODE[1:0]=00):
模拟输入模式
浮空输入模式(复位后的状态)
上拉/下拉输入模式
保留 在输出模式(MODE[1:0]>00):
通用推挽输出模式
通用开漏输出模式
复用功能推挽输出模式
复用功能开漏输出模式
MODEx:
输入模式(复位后的状态)
输出模式,最大速度10MHz
输出模式,最大速度2MHz
输出模式,最大速度50MHz
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值