使用STM32实现LED闪烁
目录
使用的开发板是:奋斗版STM32开发板V2
一、参考开发手册
二、GPIO功能描述
三、GPIO寄存器概念
2.3.1 端口配置低寄存器(GPIOx_CRL) (x=A..E)
2.3.3 端口输入数据寄存器(GPIOx_IDR) (x=A..E)
四、开始实现LED灯闪烁
1.先创建新工程
2.选择芯片,这里选择的是STM32F103VE
3.创建.c文件
所使用的开发板是:奋斗版STM32开发板V2
使用该开发板 学习了控制LED灯闪烁。
前言
主要就是会使用STM3210X的开发手册,会查看板子的原理图,理解总线的概念,会找寄存器
一、参考开发手册
可以看到,LED1在GPIOB5。
二、GPIO功能描述
每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32
位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器
(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器
(GPIOx_LCKR)。
根据数据手册中列出的每个I/O 端口的特定硬件特征, GPIO 端口的每个位可以
由软件分别配置成多种模式。
− 输入浮空
− 输入上拉
− 输入下拉
− 模拟输入
− 开漏输出
− 推挽式输出
− 推挽式复用功能
− 开漏复用功能
每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许
半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器允许对任何GPIO 寄存
器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ 时不会发生危险。
端口位配置表上图
输出模式位
三、GPIO寄存器概念
2.3.1 端口配置低寄存器(GPIOx_CRL) (x=A..E)
偏移地址:0x00
复位值:0x4444 4444
2.3.3 端口输入数据寄存器(GPIOx_IDR) (x=A..E)
地址偏移:0x08
复位值:0x0000 0000
地址偏移:0Ch
复位值:00000000h
以上只是寄存器中的一些,stm中的寄存器一共有7组,每组有10个寄存器,大家想要了解可以查询相关的数据手册。
四、开始实现LED灯闪烁
1.先创建新工程
2.选择芯片,选择的是STM32F103VE
3.工程配置
整个工程包含4类源文件:
ASM
–startup_stm32f10x_hd.s 由于奋斗板采用的是STM32F103大存储器芯片,因此采用
STM32标准库自带的大存储器芯片启动代码,这个文件已经配置好了初始状态,以及
中断向量表。可以直接在工程里使用,如果你在以后的应用中采用了中存储器或者小
存储器STM32芯片,可以将启动代码换为startup_stm32f10x_md.s 或者
startup_stm32f10x_ld.s。
FWLIB
–stm32f10x_gpio.c ST公司的标准库,包含了关于对通用IO口设置的函数。
stm32f10x_rcc.c ST公司的标准库,包含了关于对系统时钟设置的函数。
CMSYS—是关于CORETEX-M3平台的系统函数及定义
USER
—main.c 例程的主函数。
RCC_Configuration() 完成对系统时钟的设置,例程中通过系统时钟设置函数,外
接晶振采用8Mhz,经过片内频率合成,9倍频,设置为72MHz的时钟。
LED_Config() 对控制3个LED指示灯的IO口进行了初始化,将3个端口配置为推挽上
拉输出,口线速度为50Mhz。
在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,
由于3个控制口用到了端口B和端口D, 因此要对这两个端口的时钟进行使能,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD ,
ENABLE);
4.创建.c文件
代码如下:
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
#define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_5);
#define LED1_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_5);
#define LED2_ON GPIO_SetBits(GPIOD, GPIO_Pin_6);
#define LED2_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_6);
#define LED3_ON GPIO_SetBits(GPIOD, GPIO_Pin_3);
#define LED3_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_3);
void RCC_Configuration(void);
void LED_Config(void);
void Delay(__IO uint32_t nCount);
void LED_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 V6 //将V6,V7,V8
配置为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3; //LED2, LED3 V7 V8
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration(); //系统时钟配置
LED_Config(); //LED控制配置
while (1)
{
LED1_ON; LED2_OFF; LED3_OFF;
Delay(0xAFFFF);
LED1_OFF; LED2_ON; LED3_OFF;
Delay(0xAFFFF);
LED1_OFF; LED2_OFF; LED3_ON;
Delay(0xAFFFF);
}
}
void RCC_Configuration(void)
{
SystemInit();
}
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
按 编译工程, 完成后会提示如下。
这样就显示编译通过,然后连接到开发板载入程序。
以上是学习stm32LED灯闪烁的心得体会。—-21物联网应用技术2班唐雯婷