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

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

posted on 2012-11-24 14:24  apollius  阅读(1456)  评论(0编辑  收藏  举报

导航