STM32 GPIO——流水灯例程 学习总结

发布者:skyshoucang最新更新时间:2018-09-13 来源: eefocus关键字:STM32  GPIO  流水灯例程 手机看文章 扫描二维码
随时随地手机看文章

通过控制LED灯,熟悉STM32的存储器结构、地址映射、时钟树、库文件、利用库的方法及开发工程的步骤,建立STM32的开发思想。


这是我建立的第一个工程,由于涉及面较广,知识点分散,在此做一个总结。

1)为控制LED灯,知道要使用GPIO外设。

GPIO(General-Purpose I/O):I/O引脚可以被软件设置成各种不同的功能,如输入或输出。控制LED灯,即控制STM32芯片的I/O引脚电平的高低来实现。

2)了解GPIO外设有什么功能,要如何使用。

GPIO引脚又被分为GPIOA、GPIOB、...、GPIOG不同的组,每组端口分为0~15共16个不同的引脚,对于不同型号的芯片,端口的组和引脚的数量不同。

功能查看参考手册

3)获知GPIO的地址映射,知道它所挂载的总线APB2。

4)了解ST官方库对寄存器的封装。

5)了解时钟树,查看GPIOC的时钟来源,即PCLK2。

6)在stm32f10x_conf.h文件中包含用到的头文件stm32f10x_gpio.h、stm32f10x_rcc.h。

7)在工程模板的基础上添加led.c、led.h用户文件。

8)编写驱动初始化函数LED_GPIO_Config()。

9)开启外设GPIOC时钟,分析由SystemInit()函数配置的默认的Sysclk=71MHz的时钟频率是否符合工程要求。

10)根据控制要求,定义并填充初始化结构体GPIO_InitStructure,向相应的结构体成员写入适当的参数。

11)调用初始化函数GPIO_Init()初始化GPIOC。

12)编写相应的led.h头文件。

13)编写main应用程序。

14)调试程序、完成。


我建的工程:




/*led.h*/

#ifndef __LED_H

#define __LED_H

 

#include "stm32f10x.h"

 

#define ON  0

#define OFF 1

 

#define LED1(a) if(a) \

                 GPIO_SetBits(GPIOD,GPIO_Pin_3);\

else   \

GPIO_ResetBits(GPIOD,GPIO_Pin_3)

 

#define LED2(a) if(a) \

                 GPIO_SetBits(GPIOD,GPIO_Pin_6);\

else   \

GPIO_ResetBits(GPIOD,GPIO_Pin_6)

 

#define LED3(a) if(a) \

                 GPIO_SetBits(GPIOB,GPIO_Pin_5);\

else   \

GPIO_ResetBits(GPIOB,GPIO_Pin_5)

void LED_GPIO_Config(void);

 

#endif /*__LED_H*/


/*led.c*/

#include "led.h"

 

/*配置LED用到的I/O口*/

 

void LED_GPIO_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

   GPIO_InitTypeDef GPIO_InitStructure;

/*开启GPIOC的外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

/*选择要控制的GPIO引脚*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_5;

/*设置引脚模式为通用推挽输出*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

/*设置引脚速率为50MHz*/

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/*调用库函数,初始化GPIOB、GPIOD*/

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_Init(GPIOD,&GPIO_InitStructure);

/*关闭所有LED灯*/

GPIO_SetBits(GPIOB,GPIO_Pin_5);//3、6、5引脚输出高电平,关闭三盏LED灯

GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_6);

                                                      

}


/*main.c*/

#include "stm32f10x.h"

#include "led.h"

 

void Delay(__IO u32 nCount);

 

int main (void)

{

    

SystemInit() ;//设置系统时钟SYSCLK

 

LED_GPIO_Config();

   while(1)

{

      LED1(ON);  //亮

 Delay(0x0FFFEF);

 LED1(OFF);

 LED2(ON);  

 Delay(0x0FFFEF);

 LED2(OFF);

 LED3(ON);  

 Delay(0x0FFFEF);

 LED3(OFF);

  }


以上代码在奋斗STM32上课运行,以下是推荐范例,用来对比找出自己的不足。

/*范例*/

#include"stm32f10x.h"

 

#define ON           1

#define OFF          0

 

#define DELAY_TIME   0x3FFFFF

 

enum 

{

        LED1 = 0,

LED2,

LED3,

MAX_LED,

};

 

typedef struct led_gpio_s

{

int                 num;    /* LED编号 */

GPIO_TypeDef        *group; /* LED使用的GPIO在哪一组: GPIOB or GPIOD */

        uint16_t            pin;    /* LED使用的GPIO组中的那一个pin: GPIO_Pin_x */

} led_gpio_t;

 

 

led_gpio_t        leds_gpio[MAX_LED] =

{

{LED1, GPIOB, GPIO_Pin_5}, /* LED1 用的GPB5 */

{LED2, GPIOD, GPIO_Pin_6}, /* LED2 用的GPD6 */

{LED3, GPIOD, GPIO_Pin_3}, /* LED3 用的GPD3 */

};

 

 

void init_led_gpio(void)

{

int                i;

GPIO_InitTypeDef   GPIO_InitStructure;

 

/* 使能PB和PD组 GPIO的时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);

/*设置 PB5(LED1), PD6(LED2), PD3(LED3)为 GPIO 输出推免模式,口线翻转速度为50MHz */

for(i=0; i

{

/*设置 PB5(LED1)为 GPIO 输出推免模式,口线翻转速度为50MHz */

GPIO_InitStructure.GPIO_Pin = leds_gpio[i].pin;     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(leds_gpio[i].group, &GPIO_InitStructure);

  }

}

 

void turn_led(int which, int cmd)

{

         if(which<0 || which> MAX_LED )

return;

 

if(OFF == cmd)

GPIO_ResetBits(leds_gpio[which].group, leds_gpio[which].pin);

else

GPIO_SetBits(leds_gpio[which].group, leds_gpio[which].pin);

}

 

void Delay(__IO uint32_t nCount)

{

   for(; nCount != 0; nCount--) ;

}

 

int main(void)

{

/* 初始化系统时钟 */

        SystemInit();

/* 初始化各个LED的GPIO管脚 */

init_led_gpio();

 

  while(1)

  {

 /* 把LED1点亮, LED2和LED3灭掉 */

turn_led(LED1, ON);

 turn_led(LED2, OFF);

turn_led(LED3, OFF);

 Delay(DELAY_TIME);

 

 /* 把LED2点亮, LED1和LED3灭掉 */

turn_led(LED2, ON);

 turn_led(LED1, OFF);

turn_led(LED3, OFF);

 Delay(DELAY_TIME);

 

 /* 把LED3点亮, LED1和LED2灭掉 */

turn_led(LED3, ON);

 turn_led(LED2, OFF);

turn_led(LED1, OFF);

 Delay(DELAY_TIME);

  }

}


关键字:STM32  GPIO  流水灯例程 引用地址:STM32 GPIO——流水灯例程 学习总结

上一篇:STM32F103C8T6-LED点亮程序
下一篇:stm32f407的串口使用集合(USART1,USART2,USART3,USART6)

推荐阅读最新更新时间:2024-03-16 16:14

STM32-NVIC中断管理实现[直接操作寄存器]
cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断。stm32只有84个中断,包括16个内核中断和68个可屏蔽中断。stm32f103上只有60个中断,f107上才有68个中断。 中断是stm32很基础的一个功能,学会使用中断,才可以更好的使用其他的外设。理解stm32的中断,必须要先从stm32的中断优先级分组是怎么回事。要理解优先级分组,就要先理解什么是先占优先级,和次占优先级。 先占优先级的概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断
[单片机]
STM32 MPU 开发者的十大工作准则
十条准则助你顺利转型MPU 近期,主频为800兆赫的STM32MP1旗舰型重磅发布,与2019年推出的主频为 650MHz STM32MP1 入门级系列全引脚兼容,持续扩展MPU产品系列。 STM32MP1 是STM32的首款MPU,以其创新的异构系统架构,将MPU与MCU合二为一,兼顾运算处理能力和实时控制性能,令产品更实用。新的旗舰型产品系列,功能更强大,满足工业级产品需求,占空比为 100%,结温范围从 -40 ºC to 125 ºC,非常适合24/7(7天24小时)的不间断应用。这意味着STM32MP1系列可以服务于更多更广的应用场景,即使在恶劣工作环境,也能正常工作。 STM32的规模化应用,很重要的原因是因为
[单片机]
stm32 时钟设置函数分析
__IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ 这个函数的主要目的是 设置以上4个时钟的,那这四个时钟主要是用来干什么的? 这个后面再分析。 先看怎么获取72M的频率 /* Enable HSE */ 打开外部高速时钟 RCC- CR |= ((uint32_t)RCC_CR_HSEON); 等待时钟稳定 /* Wait till HSE is ready and if Time out is r
[单片机]
<font color='red'>stm32</font> 时钟设置函数分析
stm32外部中断进入不了的原因分析
最近几天折腾stm32,遇见了很郁闷的问题,外部中断进入不了,最后找到解决方法的时候觉得 唉,下面总结几条原因以便于大家少走弯路。 1.切记打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 2.最好加上一个EXTI_GenerateSWInterrupt(EXTI_LineX);产生软件中断便于判断是不是本来就配置错误; 3.开启硬件仿真: 4.正确设置中断向量地址: #if defined (VECT_TAB_RAM) /* Set the Vector Table base location at 0x20000000 */ NVIC_Se
[单片机]
<font color='red'>stm32</font>外部中断进入不了的原因分析
stm32设置MAC地址设置建议
虽然可以直接使用stm32的唯一ID做mac地址,但是不排除接入系统的设备中有mac地址相同的可能。 MAC地址一共6个字节,前3字节称为OUI,是由IEEE组织注册给网络设备生产商的;每个厂商拥有一个或多个OUI,彼此不同。后三字节则是由网络设备生产商分配给自己生产的每一个拥有MAC地址的设备,互不重复。 原理就是根据MAC地址前3字节来判断的,前3个字节、对应制造商的名称。 比如说,我们这个网络大家都不用苹果的设备,那么我所有stm32的mac地址的前三位都可以设置成苹果的MAC地址范围,这样就保证了后续无论什么设备接入进来,都不用担心mac地址冲突的问题了。 https://mac.51240.com/ 上面这个网站
[单片机]
<font color='red'>stm32</font>设置MAC地址设置建议
stm32 总线与内存分布
1、总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus – DMA1 memory bus – DMA2 memory bus – DMA2 peripheral bus – Ethernet DMA bus – USB OTG HS DMA bus 7个从总线: – Internal Flash memory ICode bus – Internal Flash memory DCode bus – Main internal SRAM1 (112 KB
[单片机]
<font color='red'>stm32</font> 总线与内存分布
STM32中AD采样的三种方法分析
  在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式。三种方法按照处理复杂方法DMA模式处理模式效率最高,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采用DMA模式,在这里我针对三种程序进行分别分析。   1、AD采样查询模式   在AD采样查询模式中,我们需要注意的是IO口的初始化配置,这里我采用PA2作为模拟采集的引脚(AIN2)和串口3作为打印输出。   具体如下:建立一个USART3.C和USART3.H文件,其程序为:   #include usart3.h   #include std
[单片机]
采用STM32 单片机的太阳能LED街灯解决方案
  随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。   本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功
[电源管理]
采用<font color='red'>STM32</font> 单片机的太阳能LED街灯解决方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved