版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
LED流水灯与SysTick定时器作者:黄克亚2025年5月本章概要CONTENTS基于库函数的开发方式库函数版LED流水灯程序设计基于SysTick定时器延时的LED流水灯项目SysTick毫秒和微秒延时函数GPIO输出相关库函数SysTick概述、寄存器和应用方法5.1库函数开发方法在第4章中我们介绍了STM32的GPIO,并给出寄存器版的LED灯闪烁工程,本章将介绍STM32的库函数开发方式,并详细给出库函数版的LED流水灯程序设计方法。5.1库函数开发方法为了简化编程开发难度,ST公司向用户提供了STM32标准库函数,又称为STM32固件库,是由ST公司针对STM32微控制器为用户开发提供的API(ApplicationProgramInterface,应用程序接口),它包括所有标准外设的驱动程序,是位于寄存器和用户之间的预定义代码,由程序、数据结构和各种宏定义组成。可以极大地方便用户使用STM32微控制器的片上外设。通过使用固件库的标准函数,无须深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。就像学习C语言编程使用库函数printf()和scanf()时一样,只是学习它们的调用方法,并没有去研究它们的源代码实现。5.2GPIO输出库函数本节讲解GPIO输出控制相关库函数。5.2GPIO输出库函数5.2.1函数RCC_APB2PeriphClockCmd函数名RCC_APB2PeriphClockCmd函数原形voidRCC_APB2PeriphClockCmd(u32RCC_APB2Periph,FunctionalStateNewState)功能描述使能或者失能APB2外设时钟输入参数1RCC_APB2Periph:门控APB2外设时钟参阅Section:RCC_APB2Periph查阅更多该参数允许取值范围输入参数2NewState:指定外设时钟的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无5.2GPIO输出库函数5.2.1函数RCC_APB2PeriphClockCmdRCC_AHB2Periph描述RCC_APB2Periph_AFIO功能复用IO时钟RCC_APB2Periph_GPIOAGPIOA时钟RCC_APB2Periph_GPIOBGPIOB时钟RCC_APB2Periph_GPIOCGPIOC时钟RCC_APB2Periph_GPIODGPIOD时钟RCC_APB2Periph_GPIOEGPIOE时钟RCC_APB2Periph_ADC1ADC1时钟RCC_APB2Periph_ADC2ADC2时钟RCC_APB2Periph_TIM1TIM1时钟RCC_APB2Periph_SPI1SPI1时钟RCC_APB2Periph_USART1USART1时钟RCC_APB2Periph_ALL全部APB2外设时钟例:/*EnableGPIOA,GPIOBclocks*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);例如对于LED流水灯控制来说,因为LED的阴极由STM32单片机的GPIOC口控制的,所以需要调用该函数打开GPIO时钟,其语句为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2Periph参数:5.2GPIO输出库函数5.2.2函数GPIO_Init函数名GPIO_Init函数原形voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)功能描述根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器输入参数1GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息参阅Section:GPIO_InitTypeDef查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无GPIO_InitTypeDefstructure//GPIO结构体的宏定义GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:typedefstruct{u16GPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;5.2GPIO输出库函数5.2.2函数GPIO_InitGPIO_Pin:该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。Pin描述Pin描述GPIO_Pin_0选中管脚0GPIO_Pin_9选中管脚9GPIO_Pin_1选中管脚1GPIO_Pin_10选中管脚10GPIO_Pin_2选中管脚2GPIO_Pin_11选中管脚11GPIO_Pin_3选中管脚3GPIO_Pin_12选中管脚12GPIO_Pin_4选中管脚4GPIO_Pin_13选中管脚13GPIO_Pin_5选中管脚5GPIO_Pin_14选中管脚14GPIO_Pin_6选中管脚6GPIO_Pin_15选中管脚15GPIO_Pin_7选中管脚7GPIO_Pin_All选中全部管脚GPIO_Pin_8选中管脚8
GPIO_Speed
:用以设置选中管脚的速率。GPIO_Speed描述GPIO_Speed_10MHz最高输出速率10MHzGPIO_Speed_2MHz最高输出速率2MHzGPIO_Speed_50MHz最高输出速率50MHz5.2GPIO输出库函数5.2.2函数GPIO_InitGPIO_Mode:用以设置选中管脚的工作状态。GPIO_Speed描述GPIO_Mode_AIN模拟输入GPIO_Mode_IN_FLOATING浮空输入GPIO_Mode_IPD下拉输入GPIO_Mode_IPU上拉输入GPIO_Mode_Out_OD开漏输出GPIO_Mode_Out_PP推挽输出GPIO_Mode_AF_OD复用开漏输出GPIO_Mode_AF_PP复用推挽输出对于LED流水灯控制,因为既需要输出高电平,又需要输出低电平,所以需要将GPIOC配置为推挽输出模式;而对于输出速度并没有特殊要求,配置成2MHz即可。管脚可以选全部也可选GPIO_Pin_0~GPIO_Pin_7。所以其参考初始化程序如下:/*ConfigurealltheGPIOCinOutputPush-Pullmode*/GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);5.2GPIO输出库函数5.2.3函数GPIO_Write函数名GPIO_Write函数原形voidGPIO_Write(GPIO_TypeDef*GPIOx,u16PortVal)功能描述向指定GPIO数据端口写入数据输入参数1GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2PortVal:待写入端口数据寄存器的值输出参数无返回值无先决条件无被调用函数无在LED流水灯控制中,由于采用共阳接法,GPIOC的I/O口输出低电平点亮,如果只需要点亮L1,只需要PC0输出低电平,其余I/O口输出高电平,对应GPIO输出数据为0xFE,其对应的控制语句为:GPIO_Write(GPIOC,0xFE);5.2GPIO输出库函数5.2.4函数GPIO_SetBits函数名GPIO_SetBits函数原形voidGPIO_SetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin)功能描述设置指定的数据端口位输入参数1GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2GPIO_Pin:待设置的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合参阅Section:GPIO_Pin查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无例:/*SettheGPIOAportpin10andpin15*/GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);5.2GPIO输出库函数5.2.5函数GPIO_ResetBits函数名GPIO_ResetBits函数原形voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin)功能描述清除指定的数据端口位输入参数1GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2GPIO_Pin:待清除的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合输出参数无返回值无先决条件无被调用函数无例:
/*ClearstheGPIOAportpin10andpin15*/GPIO_ResetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);5.2GPIO输出库函数5.2.6函数GPIO_WriteBit函数名GPIO_WriteBit函数原形voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin,BitActionBitVal)功能描述设置或者清除指定的数据端口位输入参数1GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2GPIO_Pin:待设置或者清除指的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合参阅Section:GPIO_Pin查阅更多该参数允许取值范围输入参数3BitVal:该参数指定了待写入的值该参数必须取枚举BitAction的其中一个值Bit_RESET:清除数据端口位Bit_SET:设置数据端口位输出参数无返回值无先决条件无被调用函数无例:/*SettheGPIOAportpin15*/GPIO_WriteBit(GPIOA,GPIO_Pin_15,Bit_SET);5.3LED流水灯控制项目实现的目标为,8个LED依次点亮约1s,循环往复。5.3LED流水灯控制由图可知,如需实现LED流水灯控制只需要依次点亮L1-L8,即需依次设置PC0-PC7为低电平即可,对应GPIOC端口写入数据分别为0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。项目分析5.3LED流水灯控制第一步:复制第三章创建工程模板文件夹到桌面,并将文件夹改名为“2LED流水灯”,将原工程模板编译一下,直到没有错误和警告为止。项目实施0Template2LEDWater第二步:点击“File/New”新建两个文件,将其改名为LED.C和LED.H并保存到工程模板下的APP文件夹中。并将LED.C文件添加到APP项目组下。5.3LED流水灯控制第三步:在LED.C文件中输入如下源程序,在程序中首先包含LED.H头文件,然后创建三个函数,分别是延时函数“voiddelay(u32i)”,LED流水灯初始化函数“voidLEDInit()”,以及流水灯显示函数“voidLEDdisplay()”。项目实施#include"LED.h"voiddelay(u32i) { while(i--);}voidLEDInit(){ GPIO_InitTypeDefGPIO_InitStructure; SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOC,&GPIO_InitStructure);}
voidLEDdisplay(){ while(1) { GPIO_Write(GPIOC,0xfe); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xfd); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xfb); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xf7); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xef); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xdf); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0xbf); delay(6000000);//延时约为1s GPIO_Write(GPIOC,0x7f); delay(6000000);//延时约为1s }}参考程序代码5.3LED流水灯控制第四步:在LED.H文件中输入如下源程序。项目实施参考代码如下:#ifndef_LED_H#define_LED_H#include"stm32f10x.h"voiddelay(u32i); voidLEDInit(void);voidLEDdisplay(void);#endif第五步:在main.h文件的中间部分添加#include“LED.H"语句,即包含LED.H头文件,任何时候程序中需要使用某一源文件中函数,必须先包含其头文件,否则编译是不能通过的。main.h文件的源代码如下所示。参考代码如下:#ifndef_MAIN_H#define_MAIN_H#include"stm32f10x.h"#include"LED.H"#endif5.3LED流水灯控制第六步:在main.c文件中输入如下源程序,其中main函数就是两条语句,分别调用LEDInit()函数对GPIO管脚进行初始化,调用LEDdisplay()函数进行流水灯显示。第七步:编译工程,如没有错误,则会在MDK文件夹中Objects文件夹生成“Template.hex”文件,如有错误则修改源程序直至没有错误为止。第八步:将生成的目标文件通过ISP软件下载到开发板微控制器的FLASH存储器当中,复位运行,检查实验效果。参考代码如下:#include"main.h"intmain(){ LEDInit(); LEDdisplay(); }项目实施5.4SysTick定时器在上一节讲解的LED流水灯项目中延时时间是十分不准确的,STM32F103微控制器自带一个SysTick定时器可以实现精确定时,使用灵活方便。5.4SysTick定时器5.4.1SysTick定时器概述大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。Cortex-M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作得以简化。SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其他系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。SysTick定时器除了能服务于操作系统之外,还能用于其他目的:如作为一个闹铃,用于测量时间等。5.4SysTick定时器5.4.2SysTick定时器寄存器4个寄存器控制SysTick定时器。SysTick控制及状态寄存器STK_CSR01位段名称类型复位值描述16COUNTFLAGR0如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清零2CLKSOURCER/W00=外部时钟源(STCLK)1=内核时钟(FCLK)1TICKINTR/W01=SysTick倒数到0时产生SysTick异常请求0=数到0时无动作0ENABLER/W0SysTick定时器的使能位SysTick重装载数值寄存器STK_LOAD02位段名称类型复位值描述23:0RELOADR/W0当倒数至零时,将被重装载的值5.4SysTick定时器5.4.2SysTick定时器寄存器SysTick当前数值寄存器STK_VAL03位段名称类型复位值描述23:0CURRENTR/Wc0读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志SysTick校准数值寄存器STK_CALIB04位段名称类型复位值描述31NOREFR‐1=没有外部参考时钟(STCLK不可用)0=外部参考时钟可用30SKEWR‐1=校准值不是准确的10ms0=校准值是准确的10ms23:0TENMSR/W010ms的时间内倒计数的格数。芯片设计者应该通过Cortex‐M3的输入信号提供该数值。若该值读回零,则表示无法使用校准功能5.3LED流水灯控制第一步:复制上一节项目文件夹到桌面,并将文件夹改名为“3SysTick”,将原工程模板编译一下,直到没有错误和警告为止。项目实施-利用SysTick定时器可以分别编写delay_us()延时函数和delay_ms()延时函数,供流水灯控制程序调用,实现精确延时。2LEDWater3SysTick第二步:点击“File/New”新建两个文件,将其改名为systick.c和systick.h并保存到工程模板下的APP文件夹中。并将systick.c文件添加到APP项目组下。5.4.3SysTick定时器应用第三步:在systick.c文件中输入如下源程序,在程序中首先包含systick.h头文件,然后创建两个延时函数,一个是微秒延时函数:delay_us(u32i),一个是毫秒延时函数:delay_ms(u32i)。项目实施#include"systick.h“voiddelay_us(u32i){ u32temp; SysTick->LOAD=9*i;//设置重装数值,STCLK=HCLK/8=9MHz SysTick->CTRL=0X01; //使能,减到零是无动作,
采用外部时钟源
SysTick->VAL=0;//清零计数器
do { temp=SysTick->CTRL;//读取当前倒计数值
} while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器}
voiddelay_ms(u32i){ u32temp; SysTick->LOAD=9000*i;//设置重装数值,STCLK=HCLK/8=9MHz SysTick->CTRL=0X01; //使能,减到零是无动作,
采用外部时钟源
SysTick->VAL=0;//清零计数器
do { temp=SysTick->CTRL;//读取当前倒计数值
} while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0;//关闭计数器
SysTick->VAL=0;//清空计数器}参考程序代码5.3LED流水灯控制5.3LED流水灯控制第四步:在systick.h文件中输入如下源程序,其中条件编译格式不变,只要更改一下预定义变量名称即可,需要将我们刚定义的两个延时函数的声明加到头文件当中。项目实施参考代码如下:#ifndef_SYSTICK_H#define_SYSTICK_H#include"stm32f10x.h"voiddelay_us(u32i);voiddelay_ms(u32i);#endif第五步:在LED流水灯头文件LED.H中包含systick.h,其源程序如下:参考代码如下:#ifndef_LED_H#define_LED_H#include"stm32f10x.h"#include"systick.h"voiddelay(u32i); voidLEDInit(void);voidLEDdisplay(void);#endif5.3LED流水灯控制项目实施第六步:修改LED流水灯源文件LED.C中的延时函数,将原来的“delay(6000000);”修改为“delay_ms(1000);”#include"LED.h"voidLEDInit(){
GPIO_InitTypeDefGPIO_InitStructure; SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; G
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省淄博市张店区2025-2026学年四年级上学期期末语文试题(文字版含答案)
- 2026年烟草工会内勤干事烟草公司招聘考试笔试试题(含答案)
- 2026 年大咯血患者急救护理个案分享
- 2026年秋季开学第一课:健康体魄终身运动
- 校园礼品定制采购合同书模板
- 2026煤矿采煤机操作考试题库(附答案)
- 2026年山西省保密知识教育考试题(含答案)
- 中小学登革热应急演练脚本
- 综合体项目幕墙石材板块干挂施工方案
- 2026年全国卫生监督竞赛试题含答案
- 银行网点装修工程施工组织设计
- 施工现场临时排水施工方案
- 2026年公共交通安全问题案例分享
- ISO9000-2026 质量管理基础与术语(中文版)
- 福建省百校2026届高三5月联考语文试卷(含答案)
- 2026年军队考核笔押题宝典考试题库及参考答案详解(综合卷)
- 2026安徽师范大学工作人员招聘29人笔试备考题库及答案解析
- 《铁路客运票务代理合同协议》合同三篇
- 防范钓鱼网站链接诈骗:从识别到防御的全面指南
- 安装工程项目成本管控字典
- 仓库员工考试试题及答案
评论
0/150
提交评论