zoukankan      html  css  js  c++  java
  • STM32学习笔记(一)——点亮一个LED

    引言

    最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到时候肯定不够用了,正好前几天买了一块STM32F103ZET6的最小系统,那就赶紧学习吧!从哪里学习呢?同样是从点亮一个小灯开始,就建个工程模板就让我没有耐心了,折腾了一上午终于把工程建立好了!

    关于STM32

     

    简介

    STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,按内核架构分为不同产品:

    其中STM32F系列有:
    STM32F103“增强型”系列
    STM32F101“基本型”系列
    STM32F105、STM32F107“互联型”系列
    增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。

    片上资源

    下图是 AT89S52的资源

    再来看看STM32F103ZET的资源

     可以明显看出STM3资源是非常丰富,外设接口很多。正因如此,STM32操作起来不如51那么方便,所以在一些小项目上能用51尽量不用STM32单片机。 

    点亮一个小灯

    LED原理图连接方式

     可以看出只要给D13输出一个高电平就可以将led点亮,低电平熄灭。

    GPIO初始化配置

    学习单片机貌似都是从点亮led灯开始的,像51单片机点亮小灯直接P1=0就ok了,由于STM32的GPIO工作模式有8种(输入4种+输出4种),所以在GPIO输出之前要先对要操作的GPIO进行配置,如下图:

    void GPIO_Config(void)                            //GPIO初始配置
    {
        GPIO_InitTypeDef GPIO_InitStructure;      //定义结构体变量
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOD的时钟
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                    //指定引脚13
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置输出速率50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
        GPIO_Init(GPIOD, &GPIO_InitStructure);                            //初始化外设GPIOx寄存器
    }

    可以看出对GPIO的配置是通过各种函数实现的, 这点和51有所不同,51是直接操作寄存器,其实库函数的本质还是操作寄存器,只不过官方将它封装成了各种函数,来方便操作寄存器,毕竟STM32的寄存器要比51多很多,要记住每个寄存器的名称是不容易的,而通过各个函数就可以简单的操作各个寄存器了,在MDK开发环境中可以通过右键Go to definition of 'xxx'来查看各个函数是如何操作寄存器的。

     从初始化配置时,要先使能GPIO的时钟,指定引脚,设定输出速率和工作模式,这些是必不可少的。

    电平输出

    如何让GPIOD_13输出高低电平呢?官方有对应的函数:

    #define LED_ON GPIO_SetBits(GPIOD, GPIO_Pin_13)        //端口置1
    #define LED_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_13)     //端口置0

      这里使用了宏定义,方便书写,注意高电平点亮,低电平熄灭

    延时函数

    void delay(u32 t)            //延时函数
    {
        u16 i;
        while(t--)
            for(i=0;i<1000;i++);
    }

    由于STM32的主频有72MHz之高,所以这里的形参定义为了unsigned long 类型,同样下面的变量i,定义为了unsigned int类型,为了占用更多的时间。 

     主函数

    int main()
    {
        GPIO_Config();            //GPIOD_1初始化配置
        while(1)
        {
            LED_ON;                    //点亮
            delay(1000);         //延时大概几百毫秒
            LED_OFF;                //熄灭
            delay(1000);
        }
    
    }

     可以看出delay()函数的实参比较大,如果换做100的话,人眼几乎看不出led灯的闪烁,这是因为主频很高,执行一个循环用的时间更少。只有实参足够大,才能达到延时的效果。

    程序下载

    STM32的程序下载方式有很多,其中最经济,最简单的下载方式就是串口isp下载了,连接方式如下图

    另外还要设置一下启动方式;

    串口下载时要设置为第二种启动方式,即BOOT0=1,BOOT1=0,然后在按一下Reset键,才可以开始下载(好麻烦^v^)。

    下载工具(mcuisp)的设置为如下图:

    加载好生成的hex文件后,就可以点击"开始编程"了,等待一小会,就会看到下载完成,小灯闪烁了。

    总结

    通过控制led闪烁的学习,可以看出stm32的GPIO位操作不是很方便,或许做这种简单的事情大材小用了吧!本文是使用库函数操作GPIO,也可以通过直接操作相关的寄存器来实现,以后会学习一下如何通过寄存器的设置来控制led,以上内容是我初学STM32单片机的个人理解,有描述不恰当或者错误的地方,欢迎各位朋友指正.

    参考资料:

    AT89S52_百度百科

    stm32_百度百科

    STM32固件函数库用户手册_百度文库

    欢迎大家关注我的个人博客 http://www.wangchaochao.top/
    微信扫码关注我的公众号

    不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

  • 相关阅读:
    简明Secure boot介绍
    密码学有什么用?
    mkimage, no such file or dir
    嵌入式系统安全简介
    希尔排序
    jQuery选择器
    css 选择器
    安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决
    mac下安装安卓开发环境
    IOS开发小记-内存管理
  • 原文地址:https://www.cnblogs.com/whik/p/6672730.html
Copyright © 2011-2022 走看看