_【@. 目录】
【@.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总线上。↓
@->接下来三行是对一个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。下面的截图描述了可供设置的模式↓
我们的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已选中,则将进入仿真界面。
@->在我们的while函数中设置断点,方法是单击对应行的行号左侧空白处,出现小红点即为断点↓
@->之后点击工具栏上的Analysis Windows调用逻辑分析仪
@->点击Setup,在弹出的信号输入框中输入'porta.8‘,则会新建GPIOA的8端口的信号源↓
关于信号源的命名,可以打开symbols窗口↓
可以找到所需观察信号源的名字。我们这里的PORTA.8来源于Symbols窗口中Virtual Register->PORTA中。
@->点击工具栏中的Run即可运行到断点处。
由于我们这里的断点设置在GPIOA.8口置位和清零操作的前面,多次点击Run键将会在逻辑分析仪中出现对应电平的图线。可以在逻辑分析仪的Zoom一栏中调整图线为适合大小。↓
@->仿真成功后点击Debug->Start/Stop Debug Session结束仿真。通过MDK的仿真功能可以快速的观察我们的逻辑是否正确,逻辑值和时间是否为我们的预计值。对于嵌入式开发仿真功能非常有用。
三.J-LINK在线仿真
我们使用最常用的J-Link V8可以实现下载和在线仿真功能。
@->右键工程名,点击Options for target...将弹出工程选项。切换到Debug选项卡,选则Use ‘J-LINK/J-Trace Cortex’则可以使用我们的J-Link V8。
@->将J-Link查到电脑上,保证安装好驱动程序之后,点击Settings进行设置,MDK会自动检查到J-Link连接到电脑上。选择Port为SW,将使用SW模式进行仿真。SW模式比JTAG模式所使用的引脚更少,所以推荐使用。Max Clock选择最大的10MHz即可。
切换到Flash Download,点击Add,选中我们CPU适合的芯片为STM32F10x Med-density Flash。在Reset and Run前打勾,这样在下载完成后将自动reset。
@->之后将J-Link连接上我们的开发板,重复之前的仿真步骤则可实现在线放在功能。可以观察到实验板上的LED在断点处亮,灭交替。
四.J-Link下载
这一步的设置起始刚才已经做过了,但是只下载不仿真的话可以按下面方法快速设置
@->还是刚才的工程选项界面,切换到Utilities选项卡,选择我们的J-LINK/J-Trace Cortex,点击Settings则可进入下载器设置界面。这一步的设置跟之前的设置是一样的这里就不重复了。
@->点击工具栏上的LOAD图标即可下载程序到实验板。
@->至此全部的编辑,仿真,下载功能演示结束,大家可以按照自己的工程要求进行自己的工程开发。