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/
    微信扫码关注我的公众号

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

  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/whik/p/6672730.html
Copyright © 2011-2022 走看看