STM32微控制器原理及应用 课件 第3章 基于STM32固件函数库的程序设计基础_第1页
STM32微控制器原理及应用 课件 第3章 基于STM32固件函数库的程序设计基础_第2页
STM32微控制器原理及应用 课件 第3章 基于STM32固件函数库的程序设计基础_第3页
STM32微控制器原理及应用 课件 第3章 基于STM32固件函数库的程序设计基础_第4页
STM32微控制器原理及应用 课件 第3章 基于STM32固件函数库的程序设计基础_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章

基于STM32固件函数库的程序设计基础STM32微控制器原理及应用【本章教学目标】通过本章的学习能够:了解C语言关键字、运算符、预处理等符号的含义了解标准固件函数库中的数据类型和函数命名规则了解RCC寄存器结构与RCC库函数掌握配置时钟的程序设计方法了解STM32工程文件结构主要内容3.1C语言知识简介3.1.1C语言关键字3.1.2运算符3.1.3预处理3.2STM32标准固件库3.2.1标准固件库中的数据类型3.2.2固件库命名规则3.2.3固件函数库文件描述3.3时钟控制3.3.1RCC寄存器结构3.3.2RCC库函数3.3.3时钟配置程序设计3.4STM32工程文件结构3.1C语言知识简介3.1.1C语言关键字3.1.2运算符3.1.3预处理3.1.1C语言关键字ANSIC标准C语言共有32个关键字,9种控制语句,区分大小写。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。auto:声明自动变量char:声明字符型变量或函数返回值类型const:声明只读变量double:声明双精度浮点型变量或函数返回值类型enum:声明枚举类型extern:声明变量或函数是在其它文件或本文件的其他位置定义float:声明浮点型变量或函数返回值类型int:声明整型变量或函数long:声明长整型变量或函数返回值类型关键字register:声明寄存器变量short:声明短整型变量或函数signed:声明有符号类型变量或函数sizeof:计算数据类型或变量长度(即所占字节数)static:声明静态变量struct:声明结构体类型typedef:用以给数据类型取别名unsigned:声明无符号类型变量或函数union:声明共用体类型volatile:说明变量在程序执行中可被隐含地改变关键字break:跳出当前循环case:开关语句分支continue:结束当前循环,开始下一轮循环default:开关语句中的“默认”分支do:循环语句的循环体else:条件语句否定分支(与if连用)for:一种循环语句goto:无条件跳转语句if:条件语句return:子程序返回语句(可以带参数,也可不带参数)switch:用于开关语句void:声明函数无返回值或无参数,声明无类型指针while:循环语句的循环条件

struct:声明结构体类型1.什么是结构体?结构体是一种工具,用这个工具可以定义自己的数据类型。结构体属于构造数据类型。2.结构体与数组的比较(1)都由多个元素组成(2)各个元素在内存中的存储空间是连续的(3)数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以不相同例如//也可以用typedef创建新类型typedef

struct{

int

a;

char

b;

double

c;

}

Simple2;//可以用Simple2作为类型声明新的结构体变量Simple2

u1,

*u3;//给结构体成员赋值u1.a=1;u1.b=2;u3->a=3;u3->b=4;3.1.2运算符算术运算符用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。关系运算符用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。逻辑运算符用于逻辑运算。包括与(&&)、或(||)、非(!)三种。位操作运算符参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。赋值运算符用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。条件运算符这是一个三目运算符,用于条件求值(?:)。逗号运算符用于把若干表达式组合成一个表达式(,)。指针运算符用于取内容(*)和取地址(&)二种运算。求字节数运算符用于计算数据类型所占的字节数(sizeof)。特殊运算符有括号(),下标[],成员(→,.)等几种。3.1.3预处理程序设计语言的预处理的概念:在编译之前进行的处理。C语言的预处理主要有三个方面的内容:1.宏定义;2.文件包含;3.条件编译。预处理命令以符号“#”开头。预处理

宏定义1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。格式:#define标识符文本例如:

#definePI3.1415926把程序中全部的标识符PI换成3.14159262.带参数的宏:除了一般的字符串替换,还要做参数代换格式:#define

宏名(参数表)文本例如:#defineS(a,b)a*barea=S(3,2);第一步被换为area=a*b;,第二步被换为area=3*2;预处理

文件包含一个文件包含另一个文件的内容格式:#include"文件名"或#include<文件名>被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。编译以后只得到一个目标文件.obj(.hex)预处理

条件编译有些语句希望在条件满足时才编译。格式:(1)#ifdef

标识符程序段1#else程序段2#endif或#ifdef标识符程序段1#endif当标识符已经定义时,程序段1才参加编译。预处理

条件编译格式:(2)#ifndef

标识符#define标识1程序段1#endif如果标识符没有被定义,则重定义标识1,且执行程序段1。3.2STM32标准固件库FWlib(firmwarelibrary)固件库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API(applicationprogramminginterface应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。现在用的标准固件库版本是stm32固件库V3.53.2.1标准固件库中的数据类型固态函数库定义了24个变量类型,它们的类型和大小是固定的。typedefsignedlongs32;typedefsignedshorts16;typedefsignedchars8;typedefsignedlongconstsc32;/*ReadOnly*/typedefsignedshortconstsc16;/*ReadOnly*/typedefsignedcharconstsc8;/*ReadOnly*/typedefvolatilesignedlongvs32;typedefvolatilesignedshortvs16;typedefvolatilesignedcharvs8;typedefvolatilesignedlongconstvsc32;/*ReadOnly*/typedefvolatilesignedshortconstvsc16;/*ReadOnly*/typedefvolatilesignedcharconstvsc8;/*ReadOnly*/typedefunsignedlongu32;typedefunsignedshortu16;typedefunsignedcharu8;typedefunsignedlongconstuc32;/*ReadOnly*/typedefunsignedshortconstuc16;/*ReadOnly*/typedefunsignedcharconstuc8;/*ReadOnly*/typedefvolatileunsignedlongvu32;typedefvolatileunsignedshortvu16;typedefvolatileunsignedcharvu8;typedefvolatileunsignedlongconstvuc32;/*ReadOnly*/typedefvolatileunsignedshortconstvuc16;/*ReadOnly*/typedefvolatileunsignedcharconstvuc8;/*ReadOnly*/布尔形变量在文件stm32f10x_type.h中,布尔形变量被定义如下:typedefenum{ FALSE=0, TRUE=!FALSE}bool;标志位类型在文件stm32f10x_type.h中,定义标志位类型(FlagStatustype)的2个可能值为“设置”与“重置”(SETorRESET)。typedefenum{ RESET=0, SET=!RESET}FlagStatus;功能状态类型在文件stm32f10x_type.h中,定义了功能状态类型(FunctionalStatetype)的2个可能值为“使能”与“失能”(ENABLEorDISABLE)。typedefenum{ DISABLE=0, ENABLE=!DISABLE}FunctionalState;错误状态类型在文件stm32f10x_type.h中,定义了错误状态类型(ErrorStatustype)的2个可能值为“成功”与“出错”(SUCCESSorERROR)。typedefenum{ ERROR=0, SUCCESS=!ERROR}ErrorStatus;3.2.2固件库命名规则系统、源程序文件和头文件命名都以“stm32f10x_”作为开头,例如:stm32f10x_conf.h。外设函数的命名以该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。名为PPP_Init的函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP。名为PPP_StructInit的函数,其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能,

例如:USART_StructInit名为PPP_Cmd的函数,其功能为使能或者失能外设PPP,例如:SPI_Cmd.外设缩写PPP表示任一外设缩写,例如:ADC。ADC模数转换器BKP备份寄存器CAN控制器局域网模块DMA直接内存存取控制器EXTI外部中断事件控制器FLASH闪存存储器GPIO通用输入输出I2C内部集成电路IWDG独立看门狗NVIC嵌套中断向量列表控制器PWR电源/功耗控制RCC复位与时钟控制器RTC实时时钟SPI串行外设接口SysTick系统嘀嗒定时器TIM通用定时器TIM1高级控制定时器USART通用同步异步接收发射端WWDG窗口看门狗3.2.3固件函数库文件描述main.c----主函数体示例。stm32f10x_it.h----头文件,包含所有中断处理函数原形stm32f10x_it.c----外设中断函数文件。用户可以加入自己的中断程序代码。对于指向同一个中断向量的多个不同中断请求,可以利用函数通过判断外设的中断标志位来确定准确的中断源。固件函数库提供了这些函数的名称。stm32f10x_ppp.c----由C语言编写的外设PPP的驱动源程序文件。stm32f10x_ppp.h----外设PPP的头文件。包含外设PPP函数的定义,和这些函数使用的变量。3.3时钟控制在STM32中,有五个时钟源:HSI、HSE、LSI、LSE、PLL。①HSI是高速内部时钟,RC振荡器,频率为8MHz。②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③LSI是低速内部时钟,RC振荡器,频率为40kHz。④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。3.3.1RCC寄存器结构时钟配置是与RCC寄存器密切联系的,RCC寄存器(10个)RCC寄存器结构在文件“stm32f10x_map.h”中,RCC_TypeDef定义如下:typedefstruct{vu32CR;vu32CFGR;vu32CIR;vu32APB2RSTR;vu32APB1RSTR;vu32AHBENR;vu32APB2ENR;vu32APB1ENR;vu32BDCR;vu32CSR;}RCC_TypeDef;RCC外设声明如下:#ifdef_RCCEXTRCC_TypeDef*RCC;#endif例如,若要使能外设GPIOC时钟,可以直接给寄存器APB2ENR的D4位“置1”实现。RCC->APB2ENR=0x01<<4;3.3.2RCC库函数函数RCC_DeInit

函数RCC_HSEConfig函数RCC_WaitForHSEStartUp函数RCC_HCLKConfigRCC_HCLK值函数RCC_PCLK2ConfigRCC_PCLK2值函数RCC_PCLK1ConfigRCC_PCLK1值函数FLASH_SetLatencyFLASH_Latency值函数FLASH_PrefetchBufferCmd例:/*EnableThePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);函数RCC_PLLConfigRCC_PLLSource值RCC_PLLMul值(2—16倍)警告:必须正确设置软件,使PLL输出时钟频率不超过72MHz函数RCC_PLLCmd

函数RCC_GetFlagStatusRCC_FLAG值函数RCC_SYSCLKConfigRCC_SYSCLKSource

函数RCC_GetSYSCLKSource函数RCC_APB2PeriphClockCmd

RCC_AHB2Periph值例如:使能GPIOA和GPIOB时钟

/*EnableGPIOA,GPIOBclocks*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);3.3.3时钟配置程序设计STM32程序的一般结构:包含头文件定义变量函数声明主函数初始化时钟配置系统时钟使能外设时钟初始化外设控制程序 子函数1子函数2…… 使用HSE时钟,程序设置时钟参数流程1)将RCC寄存器重新设置为默认值

RCC_DeInit;2)打开外部高速时钟晶振HSE

RCC_HSEConfig(RCC_HSE_ON);3)等待外部高速时钟晶振工作

HSEStartUpStatus=RCC_WaitForHSEStartUp();4)设置AHB时钟

RCC_HCLKConfig;5)设置高速AHB时钟

RCC_PCLK2Config;6)设置低速AHB时钟

RCC_PCLK1Config;7)设置PLL

RCC_PLLConfig;8)打开PLL

RCC_PLLCmd(ENABLE);9)等待PLL工作

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)10)设置系统时钟

RCC_SYSCLKConfig;11)判断是否PLL是系统时钟

while(RCC_GetSYSCLKSource()!=0x08)12)打开要使用的外设时钟

RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()系统时钟初始化函数的实现下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振):voidRCC_Configuration(void)

{/*将外设RCC寄存器重设为缺省值*/ RCC_DeInit();

/*设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON,HSE晶振打开(ON)/*等待HSE起振*/ HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

//SUCCESS:HSE晶振稳定且就绪{/*设置AHB时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1——AHB时钟=系统时钟

/*设置高速AHB时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1);//RCC_HCLK_Div1——APB2时钟=HCLK/*设置低速AHB时钟(PCLK1)*/RCC_PCLK1Config(RCC_HCLK_Div2);

//RCC_HCLK_Div2——APB1时钟=HCLK/2/*设置FLASH存储器延时时钟周期数*/FLASH_SetLatency(FLASH_Latency_2);

//FLASH_Latency_2,2延时周期/*选择FLASH预取指缓存的模式,预取指缓存使能*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*设置PLL时钟源及倍频系数*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//PLL的输入时钟=HSE时钟频率RCC_PLLMul_9,PLL输入时钟x9/*使能PLL*/RCC_PLLCmd(ENABLE);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{}/*设置系统时钟(SYSCLK)*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//RCC_SYSCLKSource_PLLCLK—选择PLL作为系统时钟

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论