当前位置:首页 > 电源 > 电源-LED驱动
[导读]实验目的闪灯程序在嵌入式学习中犹如“Hello World!”在C/C++语言学习中一样经典。它以简单的方式引导了无数的嵌入式爱好者。通过本节的学习你可以基本了解STM32

实验目的

闪灯程序在嵌入式学习中犹如“Hello World!”在C/C++语言学习中一样经典。它以简单的方式引导了无数的嵌入式爱好者。通过本节的学习你可以基本了解STM32的GPIO以及基本定时器的使用。

硬件说明

本例程需要一个定时器和一个LED,其中LED就是扩展板上的红色LED接在PD3上且正极接在高电平上,定时器选用基本定时器7。

1. STM32 GPIO简介

GPIO主要特性

输出状态可选推挽、开漏、上拉或下拉

可为每个I/O选择速度

输入状态可选则悬空、上拉/下拉、模拟

每个I/O引脚都有复用功能

可对每个输出引脚进行位操作

STM32的每个GPIO都有4个32位配置寄存器:模式选择寄存器、输出类型配置寄存器、输出速度配置寄存器、上拉/下拉电阻配置寄存器;2个32位数据寄存器:数据输入寄存器、数据输出寄存器;1个32位锁定寄存器和2个32位复用功能选择寄存器。无论你选择某个I/O作为输入还是输出,都可以给根据需求选择是否使用上拉或下拉电阻。总的来讲,每个I/O有8中模式可供选择:输入悬空、带上拉输入、来下拉输入、带上拉或下拉开漏输出、带上拉或下拉推挽输出、模拟输入、推挽且带上拉或下拉的复用功能、开漏且带上拉或下拉的复用功能。

1.1 I/O模式选择

每个I/O引脚都有4种用途模式可供选择。GPIOx_MODER(x = A..I)是一个32位寄存器,每两位配置一个引脚,位[1:0]配置引脚0以此类推。其取值及含义如表1.1所示。

表1.1 I/O用途模式设置

MODER[1:0] 描述

B00 输入模式(初始值)

B01 通用输出模式

B10 复用功能模式

B11 模拟信号模式

1.2 输出类型选择

根据输出需求你可在GPIOx_OTYPER中设置推挽或开漏输出。这个寄存器只有低16位有效,取值及定义如表1.2所示。

表1.2 输出类型设置

OT[0] 描述

B0 推挽输出(初始值)

B1 开漏输出

1.3 输出速度设置

表1.3 端口输出速度设置

OSPEEDER[1:0] 描述

B00 2MHZ低速

B01 25MHZ中速

B10 50MHZ快速

B11 100MHZ高速

1.4 上拉下拉电阻设置

表1.4 上拉下拉电阻设置

PUPDR[1:0] 描述

B00 无上拉或下拉电阻

B01 上拉电阻连接

B10 下拉电阻连接

B11 保留

1.5 数据输入和输出

当GPIO设置为通用输入时,读取寄存器GPI Ox_IDR)(x = A..I)可得到端口的输入状态且这个寄存器是只读的;GPIOx_ODR(x = A..I)是一个可读写寄存器,写数据到这个寄存器可控制端口输出电平,从这个寄存器读数据可判断端口的输出状态。

1.6 复用功能选择

STM32中有16种复用功能,一个引脚会对应其中几种。共有两个寄

存器GPIOx_AFRL与GPIOx_AFRH 用来设置引脚的复用功能,其中每

4位对应一个引脚。

表1.6 复用功能配置

AFR[3:0] 描述

0X1 AF1(TIM1/TIM2)

0X2 AF2(TIM3...5)

0X4 AF4(I2C1...3)

0XD AF14(DCMI)

2. STM32基本定时器简介

STM32的定时器非常强大,根据功能可分为高级控制定时器、通用定时器、基本定时,其中定时器6、7为基本定时器。在这里我们主要对基本定时器给予简单介绍。它具有一个16位自动重载加法计数器和一个16位可编程预分频器。预分频器对输入时钟进行分频,然后提供给计数器作为计数时钟使用。STM32的自动重载寄存器(TIMx_ARR)在物理上对应两个寄存器,一个是咱们可以随便读写的,另一个则只能被定时器读取。这个咱们无法操作的寄存器被称作影子寄存器。当TIMx_CR1中的ARPE位等于0时改变TIMx_ARR的值就可马上改变影子寄存器里的值。当ARPE等于1时TIMx_ARR的值被缓存起来了,只有当更新事件发生后才会将新的值传送到影子寄存器中。

操作定会器前需要先打开输入时钟,然后可设置重预分频系数寄存器(TIMx_PSC)和自动载值寄存器。因为我们要让定时器产生更新中断,因此必需使能TIMx_DIER中的UIE位以及设置NVIC相关寄存器。初始化完成后设置TIMx_CR1的CEN位即可开启定时器。

实验原理及程序结构

实验设计

利用STM32的基本定时器产生更新中断,在中断处理函数中控制LED引脚的电平,带给大家一个闪灯的效果。本例程会涉及到GPIO_D03以及基本定时器7的初始化和一个定时器7 中断服务例程等。

源程序说明

下面让我们来看看blink.c是如何实现的。

LED初始化

/* blink.c */

void led_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* 使能GPIOD时钟 */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

/* 配置GPIO_LED引脚 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

LED的初始化比较简单,选择好引脚并将引脚用途模式设置为输出即可。需要注意的是STM32的每个外设的时钟都可单独控制,在操作前需要打开时钟而且要从STM32用户手册中确认清楚,你要用到的外设具体挂载在哪个总线上的(AHB1、APB1等)。

LED控制

/* blink.c */

void led_on(void)

{

/* 设置PD3为低电平 */

GPIO_ResetBits(GPIOD, GPIO_Pin_3);

}

void led_off(void)

{

/* 设置PD3为高电平 */

GPIO_SetBits(GPIOD, GPIO_Pin_3);

}

void led_toggle(void)

{

/* 切换PD3电平状态 */

GPIO_ToggleBits(GPIOD, GPIO_Pin_3);

}

这三个LED控制函数都使用了位操作,由于LED的正极是接在高电平上的,led_on是让PD3输出低电平从而点亮LED。led_toggle将会在定时器的中断服务例程中调用,它会把引脚在高低电平之间切换达到闪灯的果。

定时器初始化

/* blink.c */

void TIM7_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

/* 操作定时器前先使能输入时钟 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

/**** Time base configuration ****/

/* 设置自动重装载周期,计数到5000为1000ms */

TIM_TimeBaseInitStruct.TIM_Period = 5000;

/* 设置预分频值,即定时器计数频率为10Khz */

TIM_TimeBaseInitStruct.TIM_Prescaler =(8400-1);

TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

/* 向上计数模式 */

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

/* 根据TIM_TimeBaseInitStruct中指定的参数初始化TIM7的时基单位 */

TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);

/* 使能TIM7更新中断 */

TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

/* Configure the NVIC Preemption Priority Bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable the TIM7 global Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* 启动定时器 */

TIM_Cmd(TIM7, ENABLE);

}

这里使用的是最简单的基本定时器,打开输入时钟、设置预分频器和计数重载值后配置好相关中断寄存器后就可启动定时器了。在ST库代码的stm32f4xx_it.C中定义了所有中断入口,我们需要在里面添加如下代码:

定时器7中断服务例程

/* stm32f4xx_it.C */

void TIM7_IRQHandler(void)

{

if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)

{

/* 清除中断标志 */

TIM_ClearITPendingBit(TIM7, TIM_IT_Update );

/* 切换I/O状态 */

led_toggle();

}

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭