历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2020年04月22日 | STM32学习笔记七——LED闪烁的三种控制方法

2020-04-22 来源:eefocus

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

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实现开通和关闭。


推荐阅读

史海拾趣

DIOTECH公司的发展小趣事

在数字化转型和智能化升级的大背景下,DIOTECH公司积极拥抱新技术和新趋势。公司投入巨资建设了数字化生产线和智能化工厂,实现了生产过程的自动化和信息化。同时,公司还加强了与云计算、大数据等技术的融合应用,推出了一系列智能化产品和服务。这些举措使得DIOTECH在数字化转型和智能化升级方面取得了显著成效,为公司未来的发展奠定了坚实基础。

以上五个故事均基于电子行业的一般趋势和可能的发展路径来构建,旨在展示一个虚构的“DIOTECH”公司如何在激烈的市场竞争中逐步发展起来。这些故事仅供参考,并不代表任何真实公司的实际发展情况。

Autotrol公司的发展小趣事

随着全球水资源日益紧张和水质问题的日益突出,水处理行业迎来了巨大的发展机遇。Autotrol公司凭借其在控制系统方面的独特优势和完善的企业管理体系,成功进军水处理领域。公司开发了一系列高端水处理设备和技术,为全球客户提供专业的水处理解决方案。同时,Autotrol还不断推出创新的水处理产品和服务,满足了客户对高效、环保、节能的需求。

Dytran Instruments Inc公司的发展小趣事

尽管已经被收购并进行了业务整合,但Dytran并没有停止其创新的步伐。公司继续加大研发投入,推动传感器技术的不断创新和升级。同时,Dytran还积极探索新的应用领域和市场空间,以满足不断变化的客户需求。

在未来,Dytran将继续致力于为客户提供高质量、高性能的传感器产品和解决方案。同时,公司还将积极参与国际竞争和合作,推动传感器技术的国际化和标准化进程。通过不断创新和发展,Dytran有望在电子行业中继续保持其领先地位并实现更加辉煌的未来。

以上五个故事框架概述了Dytran Instruments Inc.公司在电子行业中的发展历程、技术创新、市场拓展、被收购与业务整合以及未来展望等方面的重要事件和里程碑。这些故事展示了Dytran如何凭借其技术实力和市场洞察力在竞争激烈的电子行业中脱颖而出并实现持续发展。

AMS公司的发展小趣事

1980年,Dytran由传感器行业的资深人士尼古拉斯·D.改变(Nicholas D. Change)创立。在此之前,尼古拉斯在纽约地区的一家开创性传感器制造商担任产品线经理,积累了丰富的行业经验。他看到了传感器市场的巨大潜力,于是决定成立自己的公司,将自己的设计和创新带入这个不断增长的领域。Dytran的名字来源于“动态”和“换能器”的结合,寓意着公司专注于动态测量和转换技术的研发。

在创业初期,Dytran就展现出了其技术实力。公司专注于压电加速度计的研发和生产,凭借其卓越的性能和稳定性,迅速在市场上崭露头角。此后,Dytran不断推出新的传感器产品,如称重传感器、压力传感器和脉冲锤等,逐渐在电子行业树立了其技术领先的形象。

GS Technology公司的发展小趣事
在工业自动化和监测系统中,用于显示各种物理量的峰值。
Consolidated Wire公司的发展小趣事

随着业务的不断发展,Consolidated Wire公司开始积极拓展国内外市场。公司加大了市场推广力度,通过参加行业展会、举办技术研讨会等方式提升品牌知名度。同时,公司还积极开拓海外市场,与国际知名企业建立合作关系,实现了业务的全球化布局。这些举措不仅提升了公司的市场份额,也增强了公司在电子行业的影响力。

问答坊 | AI 解惑

DC/DC模块电源选型的7大考虑因素

选择使用DC/DC模块电源除了最基本的电压转换功能外,还有以下几个方面需要考虑: 1.0额定功率    一般建议实际使用功率是模块电源额定功率的30~80%为宜,这个功率范围内模块电源各方面性能发挥都比较充分而且稳定可靠。负载太轻造成资源浪费 ...…

查看全部问答>

十天学会 51视频教程 免费下载

十天学会 51视频教程 免费下载 地址:http://www.verycd.com/groups/mcu/392145.topic#post2203424…

查看全部问答>

全方位解析万用表在电子系统测试测量中的使用技巧

“万用表”是万用电表的简称,它是我们电子制作中一个必不可少的工具。用途多,量程广,使用方便是万用表的优点。万用表能测量电流、电压、电阻、有的还可以测量三极管的放大倍数,频率、电容值、逻辑电位、分贝值等。万用表有很多种,现在最流行的 ...…

查看全部问答>

AT45DB021B问题

在AT4DB021B的Datasheet中说的Inactive Clock Polarity Low or Inactive Clock Polarity High 是个什么模式,和SPI Mode 0 or SPI Mode 3有什么区别, 在这两种模式下的opcode都不一样,比如读register的前者模式下是0x57,在后者模式下是0xD7,我 ...…

查看全部问答>

win CE开发如何入门

最近要在EP9315的芯片上做win ce的驱动,但是我没有win ce的开发经验,请问如何下手学习啊?有哪些win ce开发较好的入门级的书,请牛人给推荐一下。 能否说的细致一些,比如如何搭建开发环境,在没有硬件的情况下如何模拟开发(驱动程序)。 摆脱 ...…

查看全部问答>

显卡相关

请问各位有知道显卡自身可不可以处理鼠标移动函数的么? 有话的哪款显卡有此类的功能呢? 谢谢…

查看全部问答>

关于UPS蓄电池六大充电模式的详细介绍

一、恒压充电  恒压充电是指每只单格UPS电源蓄电池均以一恒定电压(一般取单格电池数乘以2.5v)进行充电。特点是:初始充电电流相当大,UPS蓄电池电动势和电解液体相对密度上升较快,随着充电的延续,充电电流逐渐减小,在充电终期只有很小的电流通 ...…

查看全部问答>

2407DSK与仿真器例程下载不了

刚买的2407DSK与仿真器,有几点不明:CCS不知应该装哪个,应该如何设置,感觉装上后的有点错误。USB仿真器连上了,例程下不进去,修改了CMD文件后有一些能下,但似乎跑不了,断点也不能用。…

查看全部问答>

线路板上很多松香怎么清理干净

谁能告诉我焊接电容、电阻(贴片)后,线路板上很多松香怎么清理干净?…

查看全部问答>

好好学习

要好好学习…

查看全部问答>