分类 STM32单片机 下的文章

实验要求:
开发板PB9连接"按键"一端,"按键"另一端连接地。当按下"按键"时,蓝色LED灯状态进行翻转,由点亮变熄灭或由熄灭变点亮。
按键采集.png

关键程序:
/**

  • 功能:初始化按键引脚PB9
  • 参数:None
  • 返回值:None
    */
void initKey(void)
{
   GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO时钟

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          //设置按键对应引脚 PB9
   GPIO_InitStructure.GPIO_Mode = **GPIO_Mode_IPU;  //设置上拉输入**
   GPIO_Init(GPIOB, &GPIO_InitStructure);              //设置生效
}
/****main.c************/
#include   "LED/LED.h"
#include   "KEY/KEY.h"
#include   "DELAY/DELAY.h"
#include   "stm32f10x.h"

int main(void)
{
    initLED(); //初始化LED    
    Delay_init(); //延时初始化
    initKey();    //初始化按键引脚

    Delay_ms(100);
    R_LED_OFF;
    G_LED_OFF;
    Y_LED_OFF;
    while (1)
    {    //红绿黄流水灯
        R_LED_ON;
        Delay_ms(200);
        R_LED_OFF;
        
        G_LED_ON;
        Delay_ms(200);    
        G_LED_OFF;
        
        Y_LED_ON;
        Delay_ms(200);    
        Y_LED_OFF;    
        //当按下按键并且黄色LED灯熄灭时 , 改变蓝色LED状态
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0)
        {    
            toggleLED();//改变蓝色LED状态
        }
    }
}

1.SysTick 定时器介绍
Systick定时器就是系统滴答定时器,一个24位的“倒计数” 定时器,计到0时(溢出),触发中断或者设置【溢出】标志位,并将从RELOAD寄存器中自动重装载定时初值。只要SysTick控制及状态寄存器中的使能位未清除,就永不停息,即使在睡眠模式下也能工作。
Systick相关寄存器
CTRL :SysTick 控制和状态寄存器
LOAD :SysTick 自动重装载初值寄存器 ---(设置后自动重载值固定不变,最大2^24)
VAL :SysTick 当前值寄存器 ---(每个时钟周期减1,减到0重新装载LOAD的值)
SysTick.png
下载excel文件
2.定时器/计数器 计时原理
定时器从本质上来讲其实就是一个计数器,先给它设置一个初始计数值,它每收到一个脉冲,计数器就会减1,当减到0时,产生一个“叮”的信号,告知我们定时时间到。
定时时间 = 接收到的脉冲个数 * 单个脉冲的周期
时钟.png
STM32F103的工作时钟为72MHz,经过8分频后给SysTick 计数器用。此时计数器接收到的脉冲信号的频率为72/8=9Mhz, 单个脉冲的周期= 1 / (9MHz)= 1/9 us
如果给SysTick 计数器设置初始计数值RELOAD为9,则计数器每接收9个计数脉冲所需要的时间为9 ×(1/9 us)= 1 us.
如果给SysTick 计数器设置初始计数值RELOAD为9 × 1000,则计数器每接收9 × 1000个计数脉冲所需要的时间为9 × 1000 × (1/9 us)= 1000 us = 1 ms.

Systick定时器是24 位的倒计数定时器,RELOAD最大为2^24 = 16777216
16777216 ×(1/9 us)=1864135 us = 1.86 秒

滴答定时器通过查询“计数标志位COUNTFLAG”实现延时

/**

  • 文件:Delay.c

*/
#include "DELAY/Delay.h"

/**

  • 功能:初始化Systick定时器
  • 参数:None
  • 返回值:None
    */

void Delay_init(void)
{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频

}

/**

  • 功能:us级别延时
  • 参数:xus:要延时的时间
  • 返回值:None
    */

void Delay_us(u32 xus)
{

SysTick->LOAD = 9 * xus; //计9次为1us,xus则重装载值要*9

SysTick->VAL = 0; //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开定时器

while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成

}

/**

  • 功能:ms级别延时
  • 参数:xms:要延时的时间
  • 返回值:None
    */

void Delay_ms(u32 xms)
{

SysTick->LOAD = 9000; //计9次为1us,1000次为1ms
SysTick->VAL = 0;     //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;             //开定时器
while (xms--)
{
    while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
}

}

https://blog.csdn.net/qq_38410730/article/details/79858906

STM32的GPIO工作方式

GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。

每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。

GPIO_Mode_AIN 模拟输入 :输入信号是模拟信号,用于ADC
GPIO_Mode_IN_FLOATING 浮空输入 :I/O的电平状态是不确定的
GPIO_Mode_IPD 下拉输入 :默认输入是低电平
GPIO_Mode_IPU 上拉输入 :默认输入是高电平
GPIO_Mode_Out_OD 开漏输出 :可确保输出低电平,是否输出高电平取决于I/O端口外部的上拉或者下拉
GPIO_Mode_Out_PP 推挽输出 :可输出低电平、高电平
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出