STM32学习笔记七——LED闪烁的三种控制方法

法一:软件延时(不精准)

void  delay_nms(u16 time)
{
   u16 i=0;
   while(time--)
   {
      i=12000;
      while(i--); 
   }
}

方法二:

main.c

#include "stm32f10x.h"
__IO uint32_t  TimingDelay;
/******************
 *函数名称: LED_GPIO_Config()
 *功    能:实现LED等GPIO的配置
 *参    数:无
 *返 回 值:无
 *作    者:Katter
******************/
void  LED_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
    GPIO_SetBits(GPIOD,GPIO_Pin_2);
}


/******************
 *函数名称: Init_SysTick(void)
 *功    能:1ms中断的定时参数
 *参    数:无
 *返 回 值:无
 *作    者:Katter
******************/
void  Init_SysTick(void)
{
  if(SysTick_Config(SystemCoreClock/1000))
  {
      while(1);    //SysTick_Config等待配置成功
  }
}
/******************
 *函数名称: delay_ms()
 *功    能:delay_ms(__IO uint32_t  nTime)
 *参    数:有
 *返 回 值:无
  *作    者:Katter
******************/
void delay_ms(__IO uint32_t  nTime)
{
   TimingDelay =nTime;
   while(TimingDelay!=0);
}

int main(void)
{
    SystemInit();
    LED_GPIO_Config();
    Init_SysTick();
    while(1)
    {
        GPIO_SetBits(GPIOD,GPIO_Pin_2);
        delay_ms(1000);
        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
        delay_ms(1000);
    }
}

中断函数

void SysTick_Handler(void)
{
    if(TimingDelay!=0x00)
    {
    	TimingDelay--;
    }
}

思路分析:

    Init_SysTick(void)函数是重点。SysTick—系统定时器是属于 CM3 内核中的一个外
设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次
的时间为 1/SYSCLK,一般我们设置 系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的
值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复 也就是相当于只要我们配
置了寄存器中的递减起始值,就可以控制中断的时间。72M的时钟,要1ms产生一次中断,测
起始的值为X/72M=1ms=72K,因此在函数的参数中赋值为SystemCoreClock/1000 这样就将
递减的起始值设置成了72K,可以过1ms产生一次中断,在中断中计数1000次,就可以达到1s
的延时。

方案三:定时器中断

u16 i;

/*******************
 *函数名称: LED_GPIO_Config()
 *功    能:实现LED等GPIO的配置
 *参    数:无
 *返 回 值:无
 *作    者:Katter
********************/

void  LED_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
//  GPIO_SetBits(GPIOA,GPIO_Pin_8);
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);      
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
    GPIO_SetBits(GPIOD,GPIO_Pin_2);
    // GPIO_ResetBits(GPIOD,GPIO_Pin_2);    
}

/*******************
 *函数名称:RCC_Configuare()
 *功    能:实现复位和系统时钟的控制
 *参    数:无
 *返 回 值:无
  *作    者:Katter
********************/

void  RCC_Configuare(void)
{ 
    SystemInit();
    RCC_ClockSecuritySystemCmd(ENABLE);
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
}

/*******************
 *函数名称: NVIC_Configuare(void)
 *功    能:设置中断管理
 *参    数:无
 *返 回 值:无
 *作    者:Katter
********************/
void  NVIC_Configuare(void)
{
     NVIC_InitTypeDef   NVIC_InitStructure;
//     NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
       NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
       NVIC_Init(&NVIC_InitStructure);
}
/*******************
 *函数名称: TIM3_Configuare(void)
 *功    能:初始化TIM3  1ms 定时
 *参    数:无
 *返 回 值:无
 *作    者:Katter
********************/
void TIM3_Configuare(void)
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
      TIM_TimeBaseStructure.TIM_Period=10-1;
      TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);
      TIM_TimeBaseStructure.TIM_ClockDivision=0;
      TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
      TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
      TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
      TIM_Cmd(TIM3,ENABLE);  

}

int main()
{
     RCC_Configuare();
     LED_GPIO_Config();
     NVIC_Configuare();
     TIM3_Configuare();
//    GPIO_ResetBits(GPIOA,GPIO_Pin_8); 
    while(1);   
//  return 0;
} 

思路分析:定时器产生1s的中断,在中断中对LED实现开通和关闭。

参考资料:
STM32单片机应用与全案例实践
http://blog.sina.com.cn/s/blog_e107fa730102vorw.html
零死角玩转STM32.pdf

参考链接

https://blog.csdn.net/D_Katter/article/details/81006424

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于STM32GPIO输出实验,点亮三色LED,您可以按照以下步骤进行操作: 1. 首先,您需要在STM32的开发环境中创建一个新的工程。 2. 在工程中,您需要包含相应的头文件,如"stm32f10x.h"。 3. 接下来,配置相应的引脚为输出模式。假设红色LED连接到GPIOA的Pin0引脚,绿色LED连接到GPIOA的Pin1引脚,蓝色LED连接到GPIOA的Pin2引脚,您可以使用以下代码进行配置: ``` GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置红色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置绿色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置蓝色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 4. 现在,您可以使用相应的寄存器来控制LED的点亮和熄灭。例如,要点亮红色LED,可以使用以下代码: ``` GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将Pin0引脚置高,点亮红色LED ``` 要熄灭红色LED,可以使用以下代码: ``` GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 将Pin0引脚置低,熄灭红色LED ``` 同样的方法,您可以控制绿色和蓝色LED的点亮和熄灭。 这就是点亮三色LED的基本步骤。希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值