• 嵌入式stm32学习之路(led流水灯工程)


    之前没接触过单片机,初次学习感到很迷茫,从初识stm'32到建工程模板再到第一个(流水灯实验),用了两天半的时间。因为C语言基础不是很好,有很多语句都看不懂,费了很大的劲才把led灯点亮。因为模电和数电都还没学,电路图也很难弄懂。
    下面是原理图:

    点亮led的方法

    知道了原理之后,根据方法分析,可制定相应的开发步骤如下:
    1)为控制LED灯,知道要使用 GPIO 外设。
    2)了解GPIO外设有什么功能,要如何使用。
    3)获知GPIO的地址映射,知道它所挂载的总线APB2。
    4)了解ST官方库对寄存器的封装。
    5)了解时钟树,查看 GPIOx(x= A…F)的时钟来源,即PCLK2。
    6)在stm32f10x_conf.h文件中包含用到的头文件stm32f10x_gpio.h 、
    stm32f10x_rcc.h。
    7)在工程模板的基础上添加bsp_xxx.c、bsp_xxx.h用户文件。
    8)编写驱动初始化函数 XXX_GPIO_Confi g() (XXX = LED / KEY …。
    9)开启外设GPIOx x= A…F )时钟,分析由SystemInit()函数配置的默认的
    Sysclk=72MHz 的时钟频率是否符合工程要求。
    10)根据控制要求,定义并填充初始化结构体GPIO_InitStructure向相应的结构体成
    员写入适当的参数。
    11)调用初始化函数GPIO_Init()初始化 GPIOx(x= A…F)。
    12)编写相应的XXX_led.h XXX = LED)头文件。
    13)针对不同的应用要求,编写 main 应用程序。
    14)调试程序、完成
    该步骤也适用任何工程。分析完之后,再写三个文件"bsp_led.c","bsp_led.h"和主函数"main.c"
    下面是头文件bsp_led.h的程序代码
     

    [html] view plain copy


    • #include "stm32f10x.h"//这个是STM32的地址映射,包含了STM32的所有寄存器的地址  
    •   
    • #define ON  0  
    • #define OFF 1  
    •   
    • // 定义带参宏,可以像内联函数一样使用  
    • #define LED1(a) if (a)    
    •                     GPIO_SetBits(GPIOB,GPIO_Pin_0);  
    •                     else          
    •                     GPIO_ResetBits(GPIOB,GPIO_Pin_0)  
    •   
    • #define LED2(a) if (a)    
    •                     GPIO_SetBits(GPIOC,GPIO_Pin_4);  
    •                     else          
    •                     GPIO_ResetBits(GPIOC,GPIO_Pin_4)  
    •   
    • #define LED3(a) if (a)    
    •                     GPIO_SetBits(GPIOC,GPIO_Pin_3);  
    •                     else          
    •                     GPIO_ResetBits(GPIOC,GPIO_Pin_3)  
    •   
    •   
    •   
    • void LED_GPIO_Config(void);//初始化LED端口  
    •   
    • #endif   



    头文件的内容不多,但也把它独立成一个头文件,方便以后扩展或移植使用。在写头文件的时候加上类似以下这样的条件编译 :
    #ifndef __LED_H
    #define __LED_H
    ……
    #endif
    这个是非常重要的。

     
    下面试bsp_led.c文件

    [html] view plain copy


    • #include "bsp_led.h"//调用头文件  
    •   
    •   
    • void LED_GPIO_Config(void)//初始化LED的IO  
    • {  
    •        GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体   
    •       
    •                  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//开启LED的外设时钟  
    •       
    •        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择要要控制的GPIOB引脚  
    •       
    •        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚模式为通用推挽输出  
    •       
    •        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速率为50MHZ  
    •       
    •        GPIO_Init(GPIOB,&GPIO_InitStructure);//调用库函数,初始化GPIOB0  
    • lt;span style="color:#ff0000;">        
    •        /*选择要控制的引脚*/                                                              
    •        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  
    •   
    •        GPIO_Init(GPIOC, &GPIO_InitStructure);  
    •   
    •        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  
    •   
    •        GPIO_Init(GPIOC, &GPIO_InitStructure);   </span>  
    •   
    •            GPIO_SetBits(GPIOB, GPIO_Pin_0);//关闭所有的led灯  
    •       
    •        GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);//关闭所有的led灯      
    •   }  



    红色部分是非常重要的,一开始我忘记编写了,烧录成功后只有一个;LED灯闪亮。

     
     
    下面是主函数main.c的代码
     

    [html] view plain copy


    • #include "stm32f10x.h"  
    • #include "bsp_led.h"//两个头文件都必须包含,不要漏掉  
    •   
    •   void Delay(__IO uint32_t nCount);//简单的延时函数的声明,在这里延时函数被调用  
    •   
    •   int main(void)  
    •   {  
    •         LED_GPIO_Config();//LED端口的初始化  
    •       
    •       while(1)  
    •         {  
    •                            LED1(ON);  
    •                    Delay(0x0FFFFF);//延时的时间我用十六进制来表示的,也可以用十进制  
    •                    LED1(OFF);  
    •                     
    •                    LED2(ON);  
    •                Delay(0x0FFFFF);  
    •                LED2(OFF);  
    •                   
    •                LED3(ON);  
    •                Delay(0x0FFFFF);  
    •                LED3(OFF);  
    •   
    •             }  
    •   }  
    •   void Delay(__IO uint32_t nCount)//简单的延时函数  
    •   {  
    •      for(; nCount !=0; nCount--);  
    •   }  


    下面来分析一下主函数

    首先调用了在bsp_led.c文件编写的LED_GPIO_Config()函数,完成了对控制LED 的 GPIO 的初始化。紧接着就在 while死循环里不断执行在bsp_led.h文件中编写的带参宏代码,并加上延时函数,使各盏LED轮流亮灭。当然,在LED控制的部分,如果不习惯带参宏的方式,读者也可以直接使用GPIO_SetBits() 和GPIO_ResetBits() 函数实现对LED的控制。
     


    第一个工程就这样学完了,当然还存在许多疑问,我相信会慢慢解决的。应该抽时间学一下C语言和模电数电的知识,学习是无止境的,加油吧!!!
    创客学院全新视频尽在:www.makeru.com.cn
    嵌入式学习交流群:561213221

  • 相关阅读:
    自测项目:批量删除云盘重复文件
    表格更新成本 二 问用户年龄和口令,直到他们提供有效的输入
    知乎抓取、写入文档
    倒打印心
    HDU 1102 Constructing Roads
    C++模板:字典树
    HDU 3015 Disharmony Trees
    HDU 2227 Find the nondecreasing subsequences
    HDU 3486 Interviewe
    C++模板:ST算法
  • 原文地址:https://www.cnblogs.com/huan-huan/p/8405272.html
Copyright © 2020-2023  润新知