精华内容
下载资源
问答
  • 《《《《《正文》》》》》 ...2、这里多说几句,打开stm32f10x_gpio.h,看里面的全局函数。学点英语,看全局函数的命名你都能知道函数的作用了,这是一个使用库函数的技巧。 《软件设计》 ...

    图片


    《《《《《正文》》》》》


     

    《硬件设计》

    原理图:

    GPIO引脚
    LED1 PA11
    LED2 PA12
    LED3 PB9
    LED4 PB8

    图片

    图片


     

    《加载GPIO库文件》

    1、按下图步骤加载GPIO库文件(环境搭建已经写过了,这里不多说明)

    图片

     

    图片


     

    2、这里多说几句,打开stm32f10x_gpio.h,看里面的全局函数。学点英语,看全局函数的命名你都能知道函数的作用了,这是一个使用库函数的技巧。

    图片


     

    《软件设计》

    LED的GPIO模块编程流程图:

    图片


     

    一、》GPIO时钟初始化 

        库函数在stm32f10x_rxx.h库文件里。这里注意,因为各功能模块的时钟总线的时钟源不同,因此需要选择能提供时钟的总线,时钟总线时钟源不同,时钟初始化函数就不同,STM32就分APB1、APB2、AHB时钟总线;下图是时钟初始化库函数。

    图片


     

        那如何知道自己的功能模块的时钟总线初始化函数呢?

        同样在stm32f10x_rxx.h库文件里,找到如下宏定义:

    图片

    图片

     

    根据宏定义后面的功能简写即可知道自己的功能模块的时钟总线,就如今天我们的指示灯的GPIO是PB8、PB9、PA11、PA12因此我们要找到GPIOA和GPIOB的时钟总线,如下图我们就知道是APB2时钟总线;

     

    图片

    因此初始化函数为

    //GPIOA和GPIOB分2行初始化也没关系 一行的话要或运算RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

     

    二、》GPIO相关参数配置

        初始化函数在stm32f10x_gpio.h库文件里。如下图

    图片


     

    看到传参是结构体,我们跳转结构体(如下图),可以看到配置GPIO的参数,包括GPIO名称、GPIO速率、GPIO模式,这些具体可配置参数,在下图结构体中跳转类型就可以进一步看到了。

    图片

     


     

        我们今天输出LED,因此需要输出模式,代码如下

      GPIO_InitTypeDef GPIO_InitStruct;    //GPIO传输结构体创建  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;  //引脚编号  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //  GPIO_Init(GPIOB,&GPIO_InitStruct);  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;   GPIO_Init(GPIOA,&GPIO_InitStruct);

     

    三、》GPIO输出电平设置

    库函数在stm32f10x_gpio.h中,该文件中还有很多其他的函数,这些函数看名字就知道大概意思了,今天我们只需要2个函数,就是输出高或者低电平,如下图红框内函数,GPIO_SetBits表示输出高,GPIO_ResetBits表示输出低;

    图片


     

        为了方便,我把4个LED的GPIO电平操作宏定义,代码如下。​​​​​​​

    #define  LED1_1   GPIO_SetBits(GPIOA,GPIO_Pin_11);#define  LED1_0  GPIO_ResetBits(GPIOA,GPIO_Pin_11);#define  LED2_1   GPIO_SetBits(GPIOA,GPIO_Pin_12);#define  LED2_0  GPIO_ResetBits(GPIOA,GPIO_Pin_12);#define  LED3_1   GPIO_SetBits(GPIOB,GPIO_Pin_9);#define  LED3_0  GPIO_ResetBits(GPIOB,GPIO_Pin_9);#define  LED4_1   GPIO_SetBits(GPIOB,GPIO_Pin_8);#define  LED4_0  GPIO_ResetBits(GPIOB,GPIO_Pin_8);

     

    《流水灯实验》

    下面用我的无人机测试板做个江湖上人称流水灯的传说;

    图片


     

    下面是整合的整个代码,这里延时函数我懒,所以随便写了一下;

    源代码百度盘地址:(公众号发送1234获取提取码,需要自提)

    https://pan.baidu.com/s/1t9HQSca6UHnZSdcVZi45YQ​​​​​​​

    #include "main.h" //这里加载stm32f10x.h文件#define  LED1_1   GPIO_SetBits(GPIOA,GPIO_Pin_11)#define  LED1_0    GPIO_ResetBits(GPIOA,GPIO_Pin_11)#define  LED2_1   GPIO_SetBits(GPIOA,GPIO_Pin_12)#define  LED2_0    GPIO_ResetBits(GPIOA,GPIO_Pin_12)#define  LED3_1   GPIO_SetBits(GPIOB,GPIO_Pin_9)#define  LED3_0    GPIO_ResetBits(GPIOB,GPIO_Pin_9)#define  LED4_1   GPIO_SetBits(GPIOB,GPIO_Pin_8)#define  LED4_0    GPIO_ResetBits(GPIOB,GPIO_Pin_8)//LED GPIO初始化函数void LED_Init(void){  GPIO_InitTypeDef GPIO_InitStruct;   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;       //推挽输出  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOB,&GPIO_InitStruct);  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;   GPIO_Init(GPIOA,&GPIO_InitStruct);  LED1_1;LED2_1;LED3_1;LED4_1;    //初始化熄灭}//延时函数void dealy(void)  {  uint32_t  timer = 1000000;  while(timer--);}int main(void){    LED_Init();    for(;;)    {//LED灯轮询 江湖上称流水灯        LED1_0;dealy();        LED2_0;dealy();        LED4_0;dealy();        LED3_0;dealy();        LED1_1;dealy();        LED2_1;dealy();        LED4_1;dealy();        LED3_1;dealy();    }}

    STM32f103流水灯

    《《《《《END》》》》》

    图片

    展开全文
  • stm32震动感应

    千次阅读 2021-04-04 22:17:38
    1.先上图 ...#include “stm32f10x.h” #include “relay.h” #include “led.h” #include “shake.h” #include “exti.h” void delay(uint16_t time) { uint16_t i = 0; while(time–) { i=120

    1.先上图

    在这里插入图片描述

    2.接线图

    在这里插入图片描述
    在这里插入图片描述

    3.实现效果

    触碰一下震动传感器,灯亮起,过一会儿灯熄灭

    4.原理

    当震动传感器io为低电平打开继电器,高电平关闭继电器,触碰震动传感器时io接收低电平。

    5.应用模块

    • 继电器
      在这里插入图片描述
      引脚及接线:
      vcc:5v
      gnd:gnd
      in:接到板子io口
      com:公共端(线的一端)
      NO:常开端(线的另一端)
      NC:常闭端(基本不使用)

    原理:当in输入低电平时,灯线路导通,高电平时断开

    • 震动传感器
      在这里插入图片描述

    引脚及其接线:
    VCC:接电源正极
    GND:接电源负极
    DO:接数字量信号输出(与单片机相连)
    AO:无效
    此时AO无效端口

    原理:
    当传感器未检测到震动时,震动开关呈断开状态,输出端为高电平,绿色指示灯不亮。
    当传感器检测到震动时,震动开关呈导通状态,输出端为低电平,绿色指示灯亮。
    所以我们只需检测输出端的电平即可判断是否有震动。

    附上代码

    
    
    #include "stm32f10x.h"
    #include "relay.h"
    #include "led.h"
    #include "shake.h"
    #include "exti.h"
    void delay(uint16_t time)
    {
    	uint16_t i = 0;
    	while(time--)
    	{
    	i=12000;
    	while(i--);
    	
    	}
    }
    
    
    
    ## main主函数
    
    
    
    int  main()
    {
    Shake_Init();//震动io调用
    LED_Init();//ledio调用
    Relay_Init();//继电器io调用调用各个模块的io口,io口默认高阻态无电平
    exti_init();//中断io调用
    	//拉高函数GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    //GPIO_ResetBits(GPIOA,GPIO_Pin_3);//拉低函数,将3电平拉低
    	 
    GPIO_SetBits(GPIOA,GPIO_Pin_3);//拉高函数,将3电平拉高,初始化继电器为关闭状态
    	
       while(1)
    	 {
    		 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
    		 {
    		 GPIO_ResetBits(GPIOA,GPIO_Pin_3);//拉低函数,将3电平拉低,打开继电器,初始化继电器为关闭状态
    	delay(1000);
    	GPIO_SetBits(GPIOA,GPIO_Pin_3);//拉高函数,将A3电平拉高
    		 }
    		 else
    		 {
    		 GPIO_SetBits(GPIOA,GPIO_Pin_3);//拉高函数,将3电平拉高,初始化继电器为关闭状态
    
    		 }
    		
    	}
    }
    
    
    ***
    
    ## 振动传感器.c文件
    
    ***
    #include "stm32f10x.h"
    #include "shake.h"
    
    
    void Shake_Init()//驱动振动传感器
    {
    	GPIO_InitTypeDef shake_init;//结构体变量名
    	
    //打开gpioA时钟
    	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    //配置gpioA结构体
    	
    	
    	shake_init.GPIO_Pin  = GPIO_Pin_0;
    	shake_init.GPIO_Speed=GPIO_Speed_10MHz;
    	shake_init.GPIO_Mode =GPIO_Mode_IPD;
    	//gpioA初始化
    	GPIO_Init(GPIOA,  &shake_init);
    }
    
    ## 继电器.c文件
    
    #include "relay.h"
    #include "stm32f10x.h"
    void Relay_Init(void)
    {
    	
    	GPIO_InitTypeDef Relay_init;//结构体变量名
    //1.打开继电器gpioA时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);
    	//2.gpioA3结构体的配置
    	
    	Relay_init.GPIO_Pin  =GPIO_Pin_3;//选择引脚
    	Relay_init.GPIO_Speed=GPIO_Speed_10MHz;//选择电平大小,初始状态无电平
    	Relay_init.GPIO_Mode =GPIO_Mode_Out_PP;//用推挽输出
    	
    	//3.gpio初始化
    	
    GPIO_Init(GPIOA, &Relay_init);//选择gpio端口,加入配置好的结构体
    
    }
    
    
    展开全文
  • stm32F1控制LED指示灯以及蜂鸣器详解 下面以stm32f103zet6以及51单片机为例,讲解单片机基础知识LED指示灯以及蜂鸣器的控制 第一部分:stm32 1、首先我们先介绍LED指示灯以及蜂鸣器的电路图以及控制原理,电路图如下...

    嵌入式工程师成长之路(二)

    stm32F1控制LED指示灯以及蜂鸣器详解

    下面以stm32f103zet6以及51单片机为例,讲解单片机基础知识LED指示灯以及蜂鸣器的控制

    第一部分:stm32

    1、首先我们先介绍LED指示灯以及蜂鸣器的电路图以及控制原理,电路图如下:
    蜂鸣器电路图如下:
    在这里插入图片描述
    LED原理图如下:
    在这里插入图片描述
    由上图可以分析出蜂鸣器高电平有效(发声),LED指示灯低电平有效(发光)。
    2、硬件部分介绍完了之后我们就可以写代码控制蜂鸣器发声或者LED指示灯发光了
    (1)我们先介绍LED以及蜂鸣器的初始化函数:

    void LED_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE,GPIO_Pin_5); /PE.5 输出高
    }
    

    该函数的功能就是用来实现配置 PB5和 PE5 为推挽输出,传输速度为50MHz,并将PB5和 PE5引脚置为高电平状态。***注意:***在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。代码:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
    这行代码的作用是使能 APB2 总线上的 GPIOB 和 GPIOE 的时钟。
    ***说明:***因为 GPIOB 和 GPIOE 的 IO 口的初始化参数都是设置在结构体变量GPIO_InitStructure 中,因为两个 IO 口的模式和速度都一样,所以我们只用初始化一次,在
    GPIOE.5 的初始化的时候就不需要再重复初始化速度和模式了。最后一行代码:
    GPIO_SetBits(GPIOE,GPIO_Pin_5);的作用是在初始化中将 GPIOE.5 输出设置为高。
    ***如何设置某个引脚的高低电平状态?***用以下代码:
    GPIO_SetBits(GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 1,也就是高电平
    GPIO_ResetBits (GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 0,也就是低电平
    讲完以上的知识我们再看蜂鸣器的初始化代码就一目了然了:

    void BEEP_Init(void)
    {
     GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
     //使能 GPIOB 端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP-->GPIOB.8 端口配置
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为 50MHz
     GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化 GPIOB.8
     GPIO_ResetBits(GPIOB,GPIO_Pin_8); //输出 0,关闭蜂鸣器输出
    }
    

    我们来总结一下如何初始化stm32的一个引脚:


    1、使能端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
    2、设置某个具体引脚(PB5)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    3、设置IO口具体模式(一共8种,举例为推挽输出)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    4、设置IO口的传输速度(50Hz)
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    5、设置引脚的电平状态
    GPIO_SetBits(GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 1,也就是高电平
    GPIO_ResetBits (GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 0,也就是低电平

    第二部分:51单片机

    51单片机的引脚状态设置:
    P1^2=0; //将p1.2引脚置低电平
    P1^2=1;//将p1.2引脚置高电平

    展开全文
  • STM32呼吸

    2019-02-21 17:05:06
    STM32——呼吸 2018年03月29日 21:44:06 hustcw98 阅读数:1908更多 所属专栏: STM32学习   实验要求 效果图 基础电路 用定时器生成PWM波 程序流程 代码实现   实验要求 效果图 基础电路 ...

    STM32——呼吸灯

    2018年03月29日 21:44:06 hustcw98 阅读数:1908更多

    所属专栏: STM32学习

     

     

    实验要求

    这里写图片描述

    效果图

    这里写图片描述

    基础电路

    这里写图片描述

    此时PA1相当于开关,输入高则导通,灯亮,输入低则截至,灯暗。


    用定时器生成PWM波

    PWM全称是Pulse Width Modulation,通过控制高频信号的占空比,眼睛当成低通滤波器,可以控制亮暗。再循环更改pwm的阈值,就弄出了呼吸的效果. 这里采用一个比较简单的方法生成PWM波:设置定时器中断然后根据阈值判断置高和置低.

    void TIM3_IRQHandler(void)  
    {
            TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  
    
            if(counter==255)            
                counter = 0;
            else 
                counter +=1;
    
            if(mode == 0){
                if(counter < pwm)              
                    GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); 
                else 
                    GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);    
            }
    
            if(mode == 1)
            {
                if(counter < pwm)              
                    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); 
                else 
                    GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);     
    
            }  
    
            if(mode ==2){
                if(counter < pwm)              
                    GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); 
                else 
                    GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); 
            }
    }   
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    程序流程

    1. 开启外设时钟(GPIO和TIM)

      void RCC_Configuration(void)                
      {
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);                                                       
           RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3, ENABLE); 
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    2. 配置GPIO
    3. 配置时钟, 使能中断(计数阈值,预分频,时钟分频,计数模式)

      void tim3()                           //配置TIM3为基本定时器模式 ,约10us触发一次,触发频率约100kHz
      {
      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure  
      
      TIM_TimeBaseStructure. TIM_Period =9;         //配置计数阈值为9,超过时,自动清零,并触发中断
        TIM_TimeBaseStructure.TIM_Prescaler =71;     //    时钟预分频值,除以多少
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频倍数
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数方式为向上计数
      
      TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);      //  初始化tim3
      TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志
      TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //  使能TIM3的溢出更新中断
      TIM_Cmd(TIM3,ENABLE);                     //           使能TIM3
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    4. 配置中断优先级

      void nvic()                                 //配置中断优先级
      {    
       NVIC_InitTypeDef NVIC_InitStructure;  //    //   命名一优先级变量
      
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //     将优先级分组方式配置为group1,有2个抢占(打断)优先级,8个响应优先级
       NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //该中断为TIM4溢出更新中断
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//打断优先级为1,在该组中为较低的,0优先级最高
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 响应优先级0,打断优先级一样时,0最高
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //  设置使能
       NVIC_Init(&NVIC_InitStructure);                        //  初始化
      
      
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //要用同一个Group
       NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 溢出更新中断
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//    打断优先级为1,与上一个相同,不希望中断相互打断对方
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     //  响应优先级1,低于上一个,当两个中断同时来时,上一个先执行
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
    5. 写中断服务函数


    代码实现

    • 为了方便按键检测,除了TIM3配置PWM波之外,TIM4用来检测是否有输入.
    • 由于使用开漏输出,这里使用5V电源.
    • 焊接的时候可以通过长引脚减少飞线.比较方便.
    • 三极管的CBE的认法:TO-92封装,圆弧面朝向自己,从左至右依次为C,B,E 
      这里写图片描述
    
    #include "stm32f10x.h"
    #include "math.h"
    #include "stdio.h"
    
    u8  counter=0; 
    int  pwm=100;
    int flag=0;
    int mode =0;
    int velocity =0;
    int turning=1;
    
    void RCC_Configuration(void);    //时钟初始化,开启外设时钟
    void GPIO_Configuration(void);   //IO口初始化,配置其功能
    void tim3(void);                 //定时器tim4初始化配置
    void tim4(void);                 //定时器tim4初始化配置
    void nvic(void);                 //中断优先级等配置
    void exti(void);                 //外部中断配置
    void delay_nus(u32);           //72M时钟下,约延时us
    void delay_nms(u32);            //72M时钟下,约延时ms
    void breathing(int velocity){
            switch(velocity){
                    case 0:
                        if(flag)
                                pwm +=1;
                                if(pwm>240) flag=0;
                        if(flag == 0){
                                pwm -=1;
                                if(pwm<10) flag=1;
                        }
                        break;
    
                    case 1:
                        if(flag)
                                pwm +=2;
                                if(pwm>240) flag=0;
                        if(flag == 0){
                                pwm -=2;
                                if(pwm<10) flag=1;
                        }
                        break;
    
                    case 2:
                        if(flag)
                                pwm +=3;
                                if(pwm>240) flag=0;
                        if(flag == 0){
                                pwm -=3;
                                if(pwm<10) flag=1;
                        }
                        break;
            }
    }
    
    void assert_failed(uint8_t* file, uint32_t line)
    {
        printf("Wrong parameters value: file %s on line %d\r\n", file, line);
        while(1);
    }
    
    
    
    void TIM4_IRQHandler(void)   //TIM4的溢出更新中断响应函数 ,读取按键输入值,根据输入控制pwm波占空比
    {
    
            u8 key_in1=0x01,key_in2=0x01;
            TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//     清空TIM4溢出中断响应函数标志位
    
    
            key_in1= GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12);  // 读PC12的状态
            key_in2= GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);// 读PC13的状态
    
            if(key_in1 && key_in2) turning =1;
    
            breathing(velocity);
    
    
            if(key_in1==0 && turning){
                    turning =0;
            velocity = (velocity + 1) % 3;
        }//调速度
    
    
        if(key_in2==0 && turning){
                    turning =0;
            mode = (mode + 1) % 3;
        }//调颜色
    }   
    
    void TIM3_IRQHandler(void)      //    //TIM3的溢出更新中断响应函数,产生pwm波
    {
            TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //   //  清空TIM3溢出中断响应函数标志位
    
            if(counter==255)            //counter 从0到255累加循环计数,每进一次中断,counter加一
                counter = 0;
            else 
                counter +=1;
    
            if(mode == 0){
                if(counter < pwm)              //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低
                    GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); //将PC14 PC15置为高电平
                else 
                            GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);     // 将PC14 PC15置为低电平
            }
    
            if(mode == 1)
            {
                if(counter < pwm)              //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低
                    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); //将PC14 PC15置为高电平
                else 
                            GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);     // 将PC14 PC15置为低电平
    
            }  
    
            if(mode ==2){
                if(counter < pwm)              //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低
                    GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); //将PC14 PC15置为高电平
                else 
                    GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); // 将PC14 PC15置为低电平
            }
    }   
    
    
    
    
    
    int main(void)
    {
    
        RCC_Configuration();                                                                    
      GPIO_Configuration();                         
        tim4();
        tim3();
      nvic(); 
    
    
        while(1)
        { 
        }   
    
    }   
    
    
    void delay_nus(u32 n)       //72M时钟下,约延时us
    {
      u8 i;
      while(n--)
      {
        i=7;
        while(i--);
      }
    }
    
    void delay_nms(u32 n)     //72M时钟下,约延时ms
    {
        while(n--)
          delay_nus(1000);
    }
    
    
    void RCC_Configuration(void)                 //使用任何一个外设时,务必开启其相应的时钟
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);    //使能APB2控制外设的时钟,包括GPIOC, 功能复用时钟AFIO等,                                                                              
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3, ENABLE); //使能APB1控制外设的时钟,定时器tim3、4,其他外设详见手册             
    }
    
    
    void GPIO_Configuration(void)            //使用某io口输入输出时,请务必对其初始化配置
    {
        GPIO_InitTypeDef GPIO_InitStructure;   //定义格式为GPIO_InitTypeDef的结构体的名字为GPIO_InitStructure  
                                              //typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; } GPIO_InitTypeDef;
    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //配置IO口的工作模式为上拉输入(该io口内部外接电阻到电源)
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置IO口最高的输出速率为50M
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;  //配置被选中的管脚,|表示同时被选中
        GPIO_Init(GPIOC, &GPIO_InitStructure);                  //初始化GPIOC的相应IO口为上述配置,用于按键检测
    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;       //配置IO口工作模式为 推挽输出(有较强的输出能力)
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //配置IO口最高的输出速率为50M
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;  //配置被选的管脚,|表示同时被选中
        GPIO_Init(GPIOA, &GPIO_InitStructure);        //初始化GPIOA的相应IO口为上述配置
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //失能STM32 JTAG烧写功能,只能用SWD模式烧写,解放出PA15和PB中部分IO口
    }
    
    void tim4()                           //配置TIM4为基本定时器模式,约10ms触发一次,触发频率约100Hz
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure  
    
        TIM_TimeBaseStructure. TIM_Period =9999;          // 配置计数阈值为9999,超过时,自动清零,并触发中断
            TIM_TimeBaseStructure.TIM_Prescaler =71;         //  时钟预分频值,除以多少
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频倍数
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式为向上计数
    
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);      //  初始化tim4
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除TIM4溢出中断标志
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);   //  使能TIM4的溢出更新中断
        TIM_Cmd(TIM4,ENABLE);                //        使能TIM4
    }
    
    void tim3()                           //配置TIM3为基本定时器模式 ,约10us触发一次,触发频率约100kHz
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure  
    
        TIM_TimeBaseStructure. TIM_Period =9;         //配置计数阈值为9,超过时,自动清零,并触发中断
          TIM_TimeBaseStructure.TIM_Prescaler =71;     //    时钟预分频值,除以多少
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频倍数
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数方式为向上计数
    
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);      //  初始化tim3
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //  使能TIM3的溢出更新中断
        TIM_Cmd(TIM3,ENABLE);                     //           使能TIM3
    }
    
    
    void nvic()                                 //配置中断优先级
    {    
         NVIC_InitTypeDef NVIC_InitStructure;  //    //   命名一优先级变量
    
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //     将优先级分组方式配置为group1,有2个抢占(打断)优先级,8个响应优先级
         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //该中断为TIM4溢出更新中断
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//打断优先级为1,在该组中为较低的,0优先级最高
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 响应优先级0,打断优先级一样时,0最高
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //  设置使能
         NVIC_Init(&NVIC_InitStructure);                        //  初始化
    
    
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //要用同一个Group
         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 溢出更新中断
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//    打断优先级为1,与上一个相同,不希望中断相互打断对方
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     //  响应优先级1,低于上一个,当两个中断同时来时,上一个先执行
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStructure);
    展开全文
  • 基于STM32-跑马实现

    万次阅读 多人点赞 2018-06-01 09:38:23
    1.首先讲下GPIOGPIO—general purpose intput output是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能...
  • 3.1、方式一:实时检测按键状态,联动控制LED 3.1.1、使用 STM32CubeMX 新建项目工程 3.1.2、编写实施代码 3.1.3、配置烧写参数 3.1.4、烧写程序 3.2、方式二:按键中断,联动控制LED 3.2.1、使用 STM32...
  • STM32按键控制

    千次阅读 2019-06-01 21:20:47
    我想问一下各位老哥,写博客时怎么才能一次性把所有代码...#include "stm32f10x.h" #include "sys.h" #include "delay.h" #include "led.h" #include "key.h" int main (void) { u8 a; RCC_Configurat...
  • STM32(一)STM32简介

    万次阅读 多人点赞 2018-02-03 14:44:00
    大家好,今天我跟大家分享一下学习STM32的一些收获,希望对初学STM32的同学有所启示。当然,本人也是一名初学者,如果有谈论不妥之处,还望您能够批评指正,不吝赐教,本人将非常感激。如果有什么问题,欢迎您到...
  • STM32——呼吸

    万次阅读 2018-03-29 21:44:06
    此时PA1相当于开关,输入高则导通,亮,输入低则截至,暗。 用定时器生成PWM波 PWM全称是Pulse Width Modulation,通过控制高频信号的占空比,眼睛当成低通滤波器,可以控制亮暗。再循环更改pwm的阈值,就弄...
  • stm32读取按键的状态led显示 已经通过
  • STM32STM32F4开发板简介

    千次阅读 2020-08-17 11:08:27
    ALIENTEK 探索者 STM32F4 开发板,资源十分丰富,并把 STM32F407的内部资源发挥到了极致,基本所有 STM32F407 的内部资源,都可以在此开发板上验证,同时扩充丰富的接口和功能模块,整个开发板显得十分大气 02. STM...
  • STM32开发,定时器和状态机实现不一样的跑马1 概述1.1 资源概述1.2 实现功能 1 概述 1.1 资源概述 开发板:正点原子STM32F103 Nano开发板 CUBEMX版本:1.3.0 MDK版本:5.23 主控芯片型号:STM32F103RBT6 1.2 实现...
  • stm32 嵌入式系统之 LED状态灯服务

    千次阅读 2018-06-10 23:06:08
    下面是由request gpio,及注册式驱动启发,在freertos上实现led服务。该服务可提供:led控制常关方式,常开方式,闪烁方式。每个控制任务都可单独设定时间,周期频率,还有各自优先级。 指导思想:开一个周期性...
  • STM32多种方式实现闪烁,用多种方式操作GPIO,使之呈现闪烁、流水
  • tid=86980 第18章 STM32H7的GPIO应用之跑马 ...本章教程为大家介绍STM32H7的GPIO应用之跑马,跑马作为经典的测试例程,可以让大家对STM32H7应用有个简单的整体认识。 目录 第18章 STM32H7的GPIO应...
  • STM32_PWM呼吸

    2021-03-30 11:16:57
    由亮到暗逐渐变化,很有节奏感地一起一伏,感觉好像人在呼吸,当手机收到消息,屏幕上的指示灯会渐变,比较显眼,能起到一个通知提醒的作用,其实这就一个呼吸灯。 (备注:现在由于手机都在往全面屏发展,因此很多...
  • 基于STM32的简易交通设计

    万次阅读 多人点赞 2018-11-23 22:51:22
    设计十字路口红绿灯的控制电路,根据交通规则,控制4组红绿黄共12个LED指示灯的显示。    通过对车流量的捕获,来合理的安排各个方位的红绿黄灯的时间,从而达到更高效率的交通。采用了摄像头OV7670模块来获取...
  • STM32单片机实现LED反转

    千次阅读 2020-08-08 21:33:05
    一、工程项目结构:其中画红色方框...#include "stm32f10x.h" int main(void) { u16 i,j; initLED(); //初始化LED while (1) { toggleLED();//翻转LED for(i=0;i<10000;++i) //阻碍单片机进而产生延时 {
  • 目录01、STM32F4开发板的资源图02、STM32F4开发板板载资源03、STM32F4部分资源说明3.1、JTAG/SWD3.2、STM32F407ZGT604、声明 01、STM32F4开发板的资源图 F4开发板图示如下: ALIENTEK 探索者 STM32F4 开发板,资源...
  • 这里写目录标题一、寄存器与基于固件库的stm32 LED流水的差异二、STM32的USART窗口通讯 一、寄存器与基于固件库的stm32 LED流水的差异 二、STM32的USART窗口通讯
  • STM32新手入门教程

    万次阅读 多人点赞 2020-11-24 09:53:38
    STM32简介 简介参考自:小马哥STM32四轴学习平台–DragonFly四轴STM32单片机软件入门级飞控算法课程 单片微型计算机简称单片机(MCU(MicrbControl Unit)),我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是...
  • STM32内部FLASH 1. 内部FLASH简介 2. 硬件设计 3. 软件设计 3.1 STM32CubeMX设置 3.2 MDK-ARM编程 4. 下载验证
  • 本章教程为大家介绍STM32F429的GPIO应用之跑马,跑马作为经典的测试例程,可以让大家对STM32F429应用有个简单的整体认识。 目录 第18章 STM32F429的GPIO应用之跑马 18.1 初学者重要提示 18.2 跑马硬件...
  • 本章教程为大家介绍STM32F407的GPIO应用之跑马,跑马作为经典的测试例程,可以让大家对STM32F407应用有个简单的整体认识。 目录 第18章 STM32F407的GPIO应用之跑马 18.1 初学者重要提示 18.2 跑马硬件...
  • STM32定时器之控制LED循环显示

    千次阅读 2018-02-25 19:20:47
    名称:STM32定时器之控制LED循环显示 说明:对于STM32来说,其定时器要比C51的定时器要多,功能也更复杂。 就数目来说来说,STM32的定时器可以分为基本定时器,通用定时器和高级定时器(还包括Systick、看门口...
  • stm32模拟车门实验

    2019-01-19 09:38:33
    stm32模拟车门实验,内有代码以及实验报告。LED灯模拟车门指示灯,按键模拟车门开关状态
  • STM32程序:按键长按和短按的判断,用来控制LED,有借鉴了其他程序,但是有细节上的不同。 (因为这里做的按键是速度,所以写的SP,根据自己情况自己定义就好) 用定时器中断定时,配置部分就不写了,都差不多 time...
  • C#上位机控制STM32 LED开关

    千次阅读 2019-11-15 16:02:21
    先从最简单的开始,上位机控制LED的亮灭。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191115160822631.png)![这个是UI的设计界面] namespace LED开与关 { public partial class Form1 : Form {...
  • 程序通过keil5软件编写,你可以通过串口发送指令,来控制STM32F103C8T6单片机,并且通过串口返回LED的状态。(注意:程序中我使用的是PB8引脚和USART1串口。结和自己情况可以改变程序中的引脚,同时你也可以在引脚上...
  • 正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,661
精华内容 664
关键字:

stm32状态指示灯