STM32库函数开发&按键库函数开发源码篇

发布者:快乐的小鸟最新更新时间:2024-06-04 来源: elecfans关键字:STM32  库函数 手机看文章 扫描二维码
随时随地手机看文章

LED流水灯


led.h



#ifndef __LED_H

#define __LED_H



#include 'stm32f4xx.h'





void Led_Init(void);



void Led1_Init(void);

void Led2_Init(void);

void Led3_Init(void);

void Led4_Init(void);



#endif

typedef struct

{

  uint32_t GPIO_Pin;              /* 指定要配置的GPIO引脚 */



  GPIOMode_TypeDef GPIO_Mode;     /* 指定选定接点的操作模式。*/



  GPIOSpeed_TypeDef GPIO_Speed;   /* 指定选定接点的速度。*/



  GPIOOType_TypeDef GPIO_OType;   /* 指定选定接点的操作输出类型。*/



  GPIOPuPd_TypeDef GPIO_PuPd;     /* 指定选定接点的操作上拉/下拉。*/

}GPIO_InitTypeDef;

led.c


#include 'led.h'





// init 4 pin

void Led_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOE组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  

  //使能GPIOF组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);



  // GPIOF pin9 pin10

  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;    //引脚9/10

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOF, &GPIO_InitStruct);


  // GPIOE pin9 pin10

  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14;    //引脚13/14

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOE, &GPIO_InitStruct);



}





/*********************************

引脚说明:



LED0 -- PF9



**********************************/



void Led1_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;



  //使能GPIOF组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  




  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;    //引脚9

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOF, &GPIO_InitStruct);


}

/*********************************

引脚说明:



LED2 -- PF10



**********************************/

void Led2_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;




  //使能GPIOF组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  




  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_10;    //引脚10

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 




  GPIO_Init(GPIOF, &GPIO_InitStruct);

  

}

/*********************************

引脚说明:



LED3 -- PE13



**********************************/

void Led3_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;



  //使能GPIOE组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  




  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13;    //引脚13

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOE, &GPIO_InitStruct);

}

/*********************************

引脚说明:



LED4 -- PE14



**********************************/

void Led4_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;



  //使能GPIOE组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  




  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_14;    //引脚14

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOE, &GPIO_InitStruct);

}

main.c


#include 'stm32f4xx.h'

#include 'led.h'





// 延时

void delay(int n)

{

  int i,j;


  for(i=0; i< n; i++)

    for(j=0; j< 30000; j++);



}







int main(void)

{

//  Led1_Init();

//  Led2_Init();

//  Led3_Init();

//  Led4_Init();



  Led_Init();


  while(1)

  {



    //输出0  LED0灯亮

    GPIO_ResetBits(GPIOF, GPIO_Pin_9);

    delay(1000);


    //输出1  LED0灯灭

    GPIO_SetBits(GPIOF, GPIO_Pin_9);



    //输出0  LED1灯亮

    GPIO_ResetBits(GPIOF, GPIO_Pin_10);

    delay(1000);


    //输出1  LED1灯灭

    GPIO_SetBits(GPIOF, GPIO_Pin_10);



    //输出0  LED2灯亮

    GPIO_ResetBits(GPIOE, GPIO_Pin_13);

    delay(1000);


    //输出1  LED2灯灭

    GPIO_SetBits(GPIOE, GPIO_Pin_13);



    //输出0  LED3灯亮

    GPIO_ResetBits(GPIOE, GPIO_Pin_14);

    delay(1000);


    //输出1  LED3灯灭

    GPIO_SetBits(GPIOE, GPIO_Pin_14);



  }

  return 0;

}

按键控制灯


#ifndef __LED_H

#define __LED_H



#include 'stm32f4xx.h'







#define LED0_ON    GPIO_ResetBits(GPIOF, GPIO_Pin_9)

#define LED0_OFF  GPIO_SetBits(GPIOF, GPIO_Pin_9)





void Led_Init(void);



#endif



/* ================================================ */



#include 'led.h'





/*********************************

引脚说明:



LED0 -- PF9

LED1 -- PF10

LED2 -- PE13

LED3 -- PE14



**********************************/

void Led_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOE组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);    

  //使能GPIOF组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  




  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;    //引脚9 10

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOF, &GPIO_InitStruct);


  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14;    //引脚13 14

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式

  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 

  GPIO_Init(GPIOE, &GPIO_InitStruct);  


  GPIO_SetBits(GPIOF, GPIO_Pin_9);

  GPIO_SetBits(GPIOF, GPIO_Pin_10);

  GPIO_SetBits(GPIOE, GPIO_Pin_13);

  GPIO_SetBits(GPIOE, GPIO_Pin_14);



}

#ifndef __KEY_H

#define __KEY_H



#include 'stm32f4xx.h'







void Key_Init(void);



#endif



#include 'key.h'





/*********************************

引脚说明:



KEY0--PA0



**********************************/

void Key_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;



  //使能GPIOA组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;    //引脚0

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;    //输入模式

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

  GPIO_Init(GPIOA, &GPIO_InitStruct);  



}

main.c


#include 'stm32f4xx.h'

#include 'led.h'

#include 'key.h'





void delay(int n)

{

  int i,j;


  for(i=0; i< n; i++)

    for(j=0; j< 30000; j++);



}







int main(void)

{


  unsigned char count = 0;


  Key_Init();

  Led_Init();


  while(1)

  {

    /*

    //应用场景1

    //判断按键是否按下 按下为低电平

    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)

    {

      //大约延时20ms 起到消抖作用

      delay(20);

      //判断按键是否按下 按下为低电平

      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)

      {

        //灯状态变更

        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);

        count++;

      }    


    }  

    //根据按键时长实现不同的功能 

    if(count == 50)

    {

      GPIO_ResetBits(GPIOE, GPIO_Pin_14);

    }

    */


    //应用场景2  比如输入银行密码

    //判断按键是否按下 按下为低电平

    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)

    {

      //大约延时15ms 起到消抖作用

      delay(15);

      //判断按键是否按下 按下为低电平

      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)

      {

        //等待按键松开

        while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET);

        //灯状态变更

        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);


      }    


    }  




  }

  return 0;

}

按键中断


#ifndef __EXTI_H

#define __EXTI_H



#include 'stm32f4xx.h'





void Exti_PA0_Init(void);



#endif



#include 'exti.h'



/*********************************

引脚说明:



KEY0--PA0(选择下降沿触发)





**********************************/



void Exti_PA0_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;

  EXTI_InitTypeDef  EXTI_InitStruct;

  NVIC_InitTypeDef  NVIC_InitStruct;


  //使能SYSCFG及GPIOA时钟:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  //使能GPIOA组时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);




  //初始化IO口为输入。

  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;    //引脚0

  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;    //输入模式

  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉

[1] [2]
关键字:STM32  库函数 引用地址:STM32库函数开发&按键库函数开发源码篇

上一篇:频率测量方法及STM32微控制器代码示例介绍
下一篇:基于RT-Thread与STM32F407的温湿度天气时钟设计案例

推荐阅读最新更新时间:2024-11-11 10:43

意法半导体发布全新STM32超值系列微控制器
基于ARM® Cortex™-M0的STM32F030超值系列微控制器让成本敏感型应用受益于32位优势 中国, 2013年7月11日 —— 横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)发布最新的STM32F030超值系列微控制器。批量订货最低价仅为0.32美元,STM32F030是低预算项目的理想选择,同时还让设计人员有机会使用型号齐全且软硬件兼容的32位微控制器产品组合,从而提升应用性能,扩大产品系列。 全新STM32F030超值系列基于48MHz的ARM® Cortex™-M0处理器内核。与同类竞争产品不同,STM32F030虽然只有8位
[单片机]
STM32通用定时器使用
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。(TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生) 本实验要实现的功能是:用普通定时器TIM2每一秒发生一次更新事件,进入中断服务程序翻转LED1的状态。 预备知识: ① STM32通用定时器TIM2是16位自动重装载计数器。 ② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。 需要弄清楚的两个问题: 1.
[单片机]
<font color='red'>STM32</font>通用定时器使用
STM32学习笔记之基础介绍(一)(时钟源,系统时钟)
这是我第一次在CSDN上写博客,准备把自己学习STM32的内容记录下来。 因为最近在复习,所以就当作是巩固学习吧。 首先我用的具体型号是STM32F407ZGT6,属于M4系列的,使用Keil平台开发,ST-LINK下载。 第一篇的话,就先简单介绍一下开发环境,以及一些相应的问题。 1、我学习的是寄存器版本,相对于库函数版本来说,学习起来比较困难;不过学习寄存器版本优点是能更深入的了解单片机的运行原理,而且寄存器版本学会了,库函数也就能会了。 STM32 有两种操作方式: 方式1:库函数操作 ----ST为了用户编写方便,把MCU中的外设功能全部封装成
[单片机]
STM32 systick 定时 时间计算
系统嘀嗒(SysTick)校准值寄存器 1.(SysTick) 系统嘀嗒时钟是由HCLK 分频 出来的。HCLK=SYSCLK=72MHz /* Select HCLK/8 as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 当系统嘀嗒时钟设定为9 兆赫 或是: SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 当系统嘀嗒时钟设定为72 兆赫 2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。 /* SysTick interrupt eac
[单片机]
STM32之DAC原理
1.DAC模块 1.数模转换功能 2.可以配置为8位和12位模式(8位右对齐,12位左对齐,12位右对齐) 3.DAC模块有两个单独的控制器,每个通道有着单独的转换器,可以独立转换,也可以同时转换 4.可以实现噪声波形和三角波形的生成 5.每个通道有着DMA功能 6.图示: PS:左上方为一些触发的条件,左下方为一些数字电源(VDDA,VSSA) Vref+为参考电压,DAC_OUT_x为DAC的输出通道,(2.4v Vref VDDA) 数据并不是直接传入DORx的,需要先传入DHRx(如果没有选择硬件触发(TENx=0),在一个时间周期后传入DORx),同时,又经过Tsetting(大约3us)
[单片机]
<font color='red'>STM32</font>之DAC原理
stm32高级定时器重新学习
最近做项目,用到定时器,索性重新学习一下,以前只是用于简单的pwm生成和中断处理,对定时器根本就没有进行深入研究,今天借此机会,重新学习一下高级定时器,只要高级定时器学会了,基本定时器也就没什么问题了。总体上来说,stm32的定时器,功能非常多。看了一下,大概有20个功能。我就按照数据手册,一一的重新学习一下。 首先是框图,娘的,看着就眼晕 1、时基:包含计数器寄存器(TIMx_CNT) 预分频器寄存器 (TIMx_PSC) 自动装载寄存器 (TIMx_ARR) 重复次数寄存器 (TIMx_RCR) 计数类似于51单片机中的TH1和TL1。预分频器就是将输入时钟进行降低。重复寄存器类似与51中的自动装载模式中的TH寄存器
[单片机]
<font color='red'>stm32</font>高级定时器重新学习
时钟资源总结
STM32F1xx 1、时钟系统 1.1、五个时钟源 1、HSI(High speed internal clock)高速内部时钟,RC振荡器,频率为8MHz。 2、HSE(High speed external clock)高速外部时钟,可接外部时钟源,频率范围为4MHz~16MHz。 3、PLLCLK为锁相环倍频输出。 4、LSI(Low speed internal clock)低速内部时钟,RC振荡器,频率为40kHz。 5、LSE(Low speed external clock)低速外部时钟,接频率为32.768kHz的石英晶体。 1.2、时钟名词解释 SYSCLK :系统时钟 HCLK 时钟
[单片机]
时钟资源总结
STM32固件库
很久没有碰单片机了,两年了吧,因为项目需要,最近入手一块红牛的开发板,核心为STM32F103ZE。虽然以前做过大概半年的stm32的开发,现在天天在.net平台下写代码,已经忘记的差不多,恰逢周末,补补课,以后用的时候也方便点。 ST推出的FW大大提高了单片机SW的开发效率,所以在新建工程前先来了解下这个SDK。我使用的是最新的v3.5固件库,这个固件库可以分为三个部分: 1、内核支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport) 2、硬件系统支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSI
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved