常用开发模式
一、寄存器开发方式
在单片机中的寄存器就是一些具备特定功能内存单元,访问寄存器就是要操作这些内存单元,所谓的寄存器开发也就是通过操作内存单元实现相应的功能。
代码示例
#define PERIPH_BASE ((unsigned int) 0x40000000)
#define APB2PERIPH_BASE ((PERIPH_BASE+0x00010000))
#define GPIOA_BASE (PERIPH_BASE+0x0800)
#define GPIOA_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOA_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOA_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOA_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOA_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOA_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOA_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
工程模板
首先需要新建一个文件夹用于存放项目软件,在该文件夹下再次新建Obj与User两个文件夹,其中Obj文件夹用于存放编译过程中产生的C/汇编/链接的列表清单、调试信息、hex文件、以及封装库等文件;User文件夹用于存放用户编写的程序main.c、STM32F1启动文件、stm32f10x.h头文件。
优劣比较
寄存器开发模式,有具体参数更直观、程序运行占用资源少等优势。但对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了,包括:开发速度慢、程序可读性差、维护复杂等问题。
二、标准库函数开发方式
讲到库函数开发,就需要提及STM32的固件库,它是ST公司推出的已经在内部对STM32全部外设寄存器的控制封装成了可提供给用户的API函数,用户只需要将调用这些API函数即可完成对stm32的软件开发。
代码示例
#include “stm32f10x.h”
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
固件库
在开发前,我们需要首先在官网上下载相应的固件库,进行配置。以ST官网中的STM32F10X v3.5版本的固件库为例,其文件夹下包含_htmresc、Libraries(子目录中CMSIS存放符合CMSIS标准的文件,文件夹中inc存放外设头文件,src存放外设源文件)、Project(子目录中STM32F10x_StdPeriph_Examples存放ST公司提供的外设驱动例程,STM32F10x_StdPeriph_Template存放官方固件库工程模板)。
工程模板
优劣比较
标准库函数开发相对于寄存器开发,有了API函数的存在,开发效率大大提升,代码可读性增强。但在配置文件方面仍有不足,需要我们自己下载与开发板相应的版本的标准库函数,并且在开发时,还需要写大量代码进行模块的初始化。
三、HAL库函数开发方式
HAL(Hardware Abstraction Layer,抽象印象层)库是ST主推的一种开发方式,HAL库中的部分函数是特定功能实现的集成,因此其开发简单方便大大节省了单片机外设的基础配置。
代码示例
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
工程模板
创建HAL库函数工程
使用STM32CubeMX创建HAL库工程的详细步骤为: 1、打开STM32CubeMX软件,在主界面中选择“ACCESS TO MCU SELECTOR”; 2、选择开发所使用的STM32芯片型号; 3、对工程项目进行配置。在Project Manager界面中对项目的名称、文件位置以及IDE版本等信息进行设置。 完成这些操作后点击GENERATE CODE便可生成keil5工程项目,软件目录如下图中所示,并且随时在这个软件中对stm32芯片进行配置等相关操作。 在MDK-ARM文件下就有所熟悉的keil5工程项目文件,双击后便可在keil5 IDE中打开。
优劣比较
通过HAL库所编写的程序还能够移植到其它系列的stm32单片机中,比如在F1中程序直接复制到了F4中也能够正确的执行,这一点在标准库中是无法做到的(F1与F4的标准库是两个不同的文件)。ST公司的STM32CubeMX软件就是专为HAL库所设计的一款软件,通过使用图形化配置的方式,就可以生成整个全部使用HAL库的工程文件。
总结
经过比较,本书中采用的开发方式为标准库函数开发,目前我们常用的开发方式为HAL库函数开发。
|