• MDK+VS+Eclipse的STM32库V3.5工程模板的建立(五)


    _【@. 目录】

    @.1 开篇

    @.2 MDK工程建立

    @.3 Visual Studio工程建立

    @.4 Eclipse工程建立

    @.5 工程模板实例:标准库GPIO实例讲解、仿真、下载

    @.6 工程模板下载

    【@.5 工程模板实例:标准库GPIO实例讲解、仿真、下载】

    接下来我们将实际使用我们的工程模板进行一个STM32标准库V3.5的实例。利用库函数进行端口操作十分方便,我们将利用Visual Studio或Eclipse进行代码的编写,操作GPIOA.8端口电平(我手上的开发板的这一端口连着一个LED灯ヾ(*・ω・)ノ),用MDK的仿真功能观察引脚电平是否输出正确,最后通过J-LINK下载到电路板上。

    编写STM32代码时,首先打开STM32官网,找到自己对应CPU的页面,会出现很多相关资料。比如我们这里使用的STM32F103RB的页面,找到下面的Reference Manuals一栏,这个是重要的芯片参考手册,需要下载下来好好研究。

    一.代码编写

    @->首先我们打开下载来的STM32标准库,在路径'STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\'下有很多官方给出的实例,值得我们好好研究,只是这些例程都是针对STM32官方的一个开发板。找到GPIO文件夹选择其中的IOToggle,打开main.c,找到其中主函数int main(void),其中的代码如下(我删减了部分注释)↓

    GPIO_InitTypeDef GPIO_InitStructure;
    int main(void)
    {
           
      /* GPIOD Periph clock enable */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    
      /* Configure PD0 and PD2 in output pushpull mode */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOD, &GPIO_InitStructure);
    
      while (1)
      {
        /* Set PD0 and PD2 */
        GPIOD->BSRR = 0x00000005;
        /* Reset PD0 and PD2 */
        GPIOD->BRR  = 0x00000005;
      }
    }

    分析代码知道,首先使用RCC_APB2PeriphClockCmd()打开APB2外围总线的时钟,使得GPIOD端口的时钟使能。STM32的所有外设在使用之前得打开其对应的外设总线时钟,在芯片的参考手册中可知每个外设所在的外设总线,使用前须开启。下图即为参考手册47页(V14版)第三章'Memory and bus architecture'中对系统总线的描述,在右下角区域可知所有的GPIO端口均在APB2总线上。↓

    image

    @->接下来三行是对一个GPIO的构造体GPIO_InitStructure进行初始化,进行端口模式设置。在STM32参考手册166页(V14版)GPIO寄存器描述章节可知,所有GPIO口都需要通过设置GPIOx_CRL(对应0-7端口)或GPIOx_CRH(对应8-15端口)进行模式设置,这里x=A...G中的一个。其中每个端口都有CNFy,MODEy设置模式y=0~7,8~15。下面的截图描述了可供设置的模式↓

    image

    我们的GPIO需要设置为常用的推挽输出,并且作为通用端口(General)而不是复用端口(Alternate)。关于STM32输出端口的模式的进一步分析可以参考这一篇文章。输出速度就为最大的50MHz即可,所以对应的CNFy位为00,MODEy位为11即可。对于寄存器的操作在STM32库函数里面只需通过前面的代码即可完成,不需要直接操作寄存器。可以打开MDK/VS/Eclipse查看对应上面代码用到的宏定义。

    在While循环里就是简单的置位和清零工作,分别使用对应GPIO端口的BSRR和BRR寄存器即可。

    @->接下来编写我们自己的代码,很简单,我想实现GPIOA.8端口电平高和低的交替,思路是在while循环中先对端口置位,延时一会,再清零,延时一会。所以我们需要在之前的GPIO例程中添加延时功能的实现。一般延时函数的实现在STM32中采用的是Systick系统滴答时钟的中断功能。现在看看我的main.c中的代码。编写代码时随便打开Visual Studio或Eclipse都可以。

    #include "stm32f10x.h"    /*位于当前工程目录下的头文件,即STM32库V3.5中的stm32f10x.h*推荐*/
    //#include <stm32f10x.h>    /*位于MDK安装目录下的头文件stm32f10x.h*/
    
    uint32_t SysCount;
    static void delay_ms(uint32_t time)
    {
        SysCount=time;
        while(SysCount!=0);
    }
    int main(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        SysTick_Config(SystemCoreClock/1000);
        delay_ms(100);
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        while(1)
        {
            GPIOA->BSRR |=0x100;
            delay_ms(50);
            GPIOA->BRR |=0x100;
            delay_ms(50);
    
        }
        return 0;
    }

    打开USER中的stm32f10x_it.c,找到其中的SysTick_Handler(void)函数,本来应该是空的,现修改为如下

    extern uint32_t SysCount;    //apo
    void SysTick_Handler(void)    //apo
    {
        if(SysCount!=0) SysCount--;
    }

    我们使用函数SysTick_Config()对Systick进行配置和开启中断,这之后每次进入中断将会进入SysTick_Handler(void)这一函数里,对SysCount这一全局变量进行递减。这样,在main.c中只需编写我们的delay_ms()函数,输入需要延时的毫秒值,则当SysCount变量归0时delay_ms()函数返回,实现延时功能。

    @->到此为止,我们的这个程序很简单也很好理解,注意到以后如果需要编写中断程序的话,一个好习惯是统统将中断服务函数放到stm32f10x_it.c中,在主函数打开相应的中断即可。

    二.MDK仿真

    @->打开MDK,点击Project->Build Target进行编译。编译成功后点击Debug->Start/Stop Debug Session将进入Debug,再次确认目标选项中的Debug选项卡Use Simulator已选中,则将进入仿真界面。

    image

    @->在我们的while函数中设置断点,方法是单击对应行的行号左侧空白处,出现小红点即为断点↓

    image

    @->之后点击工具栏上的Analysis Windows调用逻辑分析仪

    image

    @->点击Setup,在弹出的信号输入框中输入'porta.8‘,则会新建GPIOA的8端口的信号源↓

    image

    关于信号源的命名,可以打开symbols窗口↓

    image

    可以找到所需观察信号源的名字。我们这里的PORTA.8来源于Symbols窗口中Virtual Register->PORTA中。

    @->点击工具栏中的Run即可运行到断点处。

    image

    由于我们这里的断点设置在GPIOA.8口置位和清零操作的前面,多次点击Run键将会在逻辑分析仪中出现对应电平的图线。可以在逻辑分析仪的Zoom一栏中调整图线为适合大小。↓

    image

    @->仿真成功后点击Debug->Start/Stop Debug Session结束仿真。通过MDK的仿真功能可以快速的观察我们的逻辑是否正确,逻辑值和时间是否为我们的预计值。对于嵌入式开发仿真功能非常有用。

    三.J-LINK在线仿真

    我们使用最常用的J-Link V8可以实现下载和在线仿真功能。

    image

    @->右键工程名,点击Options for target...将弹出工程选项。切换到Debug选项卡,选则Use ‘J-LINK/J-Trace Cortex’则可以使用我们的J-Link V8。

    image

    @->将J-Link查到电脑上,保证安装好驱动程序之后,点击Settings进行设置,MDK会自动检查到J-Link连接到电脑上。选择Port为SW,将使用SW模式进行仿真。SW模式比JTAG模式所使用的引脚更少,所以推荐使用。Max Clock选择最大的10MHz即可。

    image

    切换到Flash Download,点击Add,选中我们CPU适合的芯片为STM32F10x Med-density Flash。在Reset and Run前打勾,这样在下载完成后将自动reset。

    image

    @->之后将J-Link连接上我们的开发板,重复之前的仿真步骤则可实现在线放在功能。可以观察到实验板上的LED在断点处亮,灭交替。

    四.J-Link下载

    这一步的设置起始刚才已经做过了,但是只下载不仿真的话可以按下面方法快速设置

    @->还是刚才的工程选项界面,切换到Utilities选项卡,选择我们的J-LINK/J-Trace Cortex,点击Settings则可进入下载器设置界面。这一步的设置跟之前的设置是一样的这里就不重复了。

    image

    @->点击工具栏上的LOAD图标即可下载程序到实验板。

    image

    @->至此全部的编辑,仿真,下载功能演示结束,大家可以按照自己的工程要求进行自己的工程开发。

  • 相关阅读:
    【模板】多项式开根(加强版)
    【模板】多项式幂函数 (加强版)
    Codeforces Round #628 (Div. 2) 总结
    [TJOI2017] 不勤劳的图书管理员
    [HNOI2015] 接水果
    [USACO3.4] Raucous Rockers
    [CF1268B] Domino for Young
    Linux提权小结
    weblogic漏洞练习
    SSL/TLS 安全测试
  • 原文地址:https://www.cnblogs.com/apollius/p/2784582.html
Copyright © 2020-2023  润新知