你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32f103之流水灯

[复制链接]
STMCU小助手 发布时间:2022-5-13 20:00
   这几天打算复**stm32有关的硬件资源,就想着从最开始做起,熟悉下当初所学的知识。学习stm32最初都基本是从流水灯开始的,今天就开始点亮流水灯。

首先,必须明白流水灯的硬件原理,以下是原理图:

FGNL{IQB}Z8E2[)RS9T}%FI.png

它由8个管脚控制,因此首先必须进行初始化8个引脚。

  1. //初始化PE8...PE15为输出口.并使能这八个口的时钟                    
  2. //LED IO初始化
  3. void LED_Init(void)
  4. {

  5.         GPIO_InitTypeDef  GPIO_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);                        //使能PE端口时钟

  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                         //LED1-->PE.8 ...  LED8-->PE.15 端口配置
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                    //推挽输出
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                 //IO口速度为50MHz
  10.         GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                         //根据设定参数初始化GPIOE
  11.         GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                                                                                 //PE.8 输出低

  12. }
复制代码


这样就实现了流水灯管脚初始化的操作,剩下的操作只需要在主函数中进行相应的调用操作即可完成。
为了使程序更加完美,加入了蜂鸣器的初始化,流水灯亮的同时蜂鸣器响。

  1. <span style="font-size:14px;"><strong>//初始化PB5为输出口.并使能这个口的时钟                    
  2. //蜂鸣器初始化
  3. void BEEP_Init(void)
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能GPIOB端口时钟

  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //BEEP-->PB.5 端口配置
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //速度为50MHz
  10.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据参数初始化GPIOB.5

  11.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);                                                //输出0,关闭蜂鸣器输出
  12. }</strong></span>
复制代码

在流水灯操作中还有一个很关键的步骤,要想实现精确的延时,哪就要自己编写延时函数。延时有微妙、毫秒延时,可分别按自己的需求进行编写。

  1. <span style="font-size:14px;">//初始化延迟函数
  2. //SYSTICK的时钟固定为HCLK时钟的1/8
  3. //SYSCLK:系统时钟
  4. void delay_init()         
  5. {
  6.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
  7.         fac_us=SystemCoreClock/8000000;        //为系统时钟的1/8  
  8.          
  9.         fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
  10. }</span>
复制代码

毫秒函数初始化

  1. //延时nms
  2. //注意nms的范围
  3. //SysTick->LOAD为24位寄存器,所以,最大延时为:
  4. //nms<=0xffffff*8*1000/SYSCLK
  5. //SYSCLK单位为Hz,nms单位为ms
  6. //对72M条件下,nms<=1864
  7. void delay_ms(u16 nms)
  8. {                                    
  9.         u32 temp;                  
  10.         SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
  11.         SysTick->VAL =0x00;           //清空计数器
  12.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
  13.         do
  14.         {
  15.                 temp=SysTick->CTRL;
  16.         }
  17.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
  18.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  19.         SysTick->VAL =0X00;       //清空计数器                     
  20. }
复制代码

在主函数中进行调用和初始化操作

主函数的调用


  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "beep.h"
  4. #include "delay.h"
  5. #include "sys.h"

  6. int main(void)
  7. {
  8.         delay_init();                //延时函数初始化
  9.          LED_Init();                        //LED端口初始化        
  10.         BEEP_Init();        //初始化蜂鸣器端口
  11.         
  12.         while(1)
  13.         {
  14.                 LED1 = LEDON;
  15.                 LED2 = LEDOFF;
  16.                 LED3 = LEDOFF;
  17.                 LED4 = LEDOFF;
  18.                 LED5 = LEDOFF;
  19.                 LED6 = LEDOFF;
  20.                 LED7 = LEDOFF;
  21.                 LED8 = LEDOFF;
  22.                 BEEP = 1;
  23.                 delay_ms(100);
  24.                
  25.                 LED1 = LEDOFF;
  26.                 LED2 = LEDON;
  27.                 LED3 = LEDOFF;
  28.                 LED4 = LEDOFF;
  29.                 BEEP = BEEPOFF;
  30.                 LED5 = LEDOFF;
  31.                 LED6 = LEDOFF;
  32.                 LED7 = LEDOFF;
  33.                 LED8 = LEDOFF;
  34.                 delay_ms(100);
  35.                
  36.                 LED1 = LEDOFF;
  37.                 LED2 = LEDOFF;
  38.                 LED3 = LEDON;
  39.                 LED4 = LEDOFF;
  40.           LED5 = LEDOFF;
  41.                 LED6 = LEDOFF;
  42.                 LED7 = LEDOFF;
  43.                 LED8 = LEDOFF;               
  44.                 delay_ms(100);
  45.                
  46.                 LED1 = LEDOFF;
  47.                 LED2 = LEDOFF;
  48.                 LED3 = LEDOFF;
  49.                 LED4 = LEDON;
  50.                 LED5 = LEDOFF;
  51.                 LED6 = LEDOFF;
  52.                 LED7 = LEDOFF;
  53.                 LED8 = LEDOFF;               
  54.                 delay_ms(100);
  55.                
  56.                 LED1 = LEDOFF;
  57.                 LED2 = LEDOFF;
  58.                 LED3 = LEDOFF;
  59.                 LED4 = LEDOFF;
  60.                 LED5 = LEDON;
  61.                 LED6 = LEDOFF;
  62.                 LED7 = LEDOFF;
  63.                 LED8 = LEDOFF;
  64.                 delay_ms(100);
  65.                
  66.                 LED1 = LEDOFF;
  67.                 LED2 = LEDOFF;
  68.                 LED3 = LEDOFF;
  69.                 LED4 = LEDOFF;
  70.                 LED5 = LEDOFF;
  71.                 LED6 = LEDON;
  72.                 LED7 = LEDOFF;
  73.                 LED8 = LEDOFF;
  74.                 delay_ms(100);
  75.                
  76.                 LED1 = LEDOFF;
  77.                 LED2 = LEDOFF;
  78.                 LED3 = LEDOFF;
  79.                 LED4 = LEDOFF;
  80.                 LED5 = LEDOFF;
  81.                 LED6 = LEDOFF;
  82.                 LED7 = LEDON;
  83.                 LED8 = LEDOFF;
  84.                 delay_ms(100);
  85.                
  86.                 LED1 = LEDOFF;
  87.                 LED2 = LEDOFF;
  88.                 LED3 = LEDOFF;
  89.                 LED4 = LEDOFF;
  90.                 LED5 = LEDOFF;
  91.                 LED6 = LEDOFF;
  92.                 LED7 = LEDOFF;
  93.                 LED8 = LEDON;
  94.                 delay_ms(100);
  95.                
  96.         }         
  97. }
复制代码

       主函数中写的其实是最简单理解的程序,也是很多初学者很容易编写出的程序。原理是依次让每个灯亮,每个灯之间添加延时函数,以实现流水的效果,具体延时多少看自己的个人爱好,想让它变化多快在延时函数里面实现。
一下是实验的最终结果。其实还很好看。(在以后做东西的时候可以将流水灯加上去,效果很好看的,比如加在小车上,或者四轴飞行器上,这样的话看起来挺酷的!)

一切都得从最基础开始,小的实验室为了以后做更大项目。

20140920114510038.jpg





收藏 评论0 发布时间:2022-5-13 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版