嵌入式系统原理及应用项目化教程 课件全套 (陈群英)项目1-8 点亮一个LED灯-显示屏控制设计与实现_第1页
嵌入式系统原理及应用项目化教程 课件全套 (陈群英)项目1-8 点亮一个LED灯-显示屏控制设计与实现_第2页
嵌入式系统原理及应用项目化教程 课件全套 (陈群英)项目1-8 点亮一个LED灯-显示屏控制设计与实现_第3页
嵌入式系统原理及应用项目化教程 课件全套 (陈群英)项目1-8 点亮一个LED灯-显示屏控制设计与实现_第4页
嵌入式系统原理及应用项目化教程 课件全套 (陈群英)项目1-8 点亮一个LED灯-显示屏控制设计与实现_第5页
已阅读5页,还剩305页未读, 继续免费阅读

下载本文档

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

文档简介

嵌入式系统原理及应用

项目化教程项目1

点亮一个LED灯目录1.1嵌入式ARM处理器STM321.2任务1开发环境搭建1.3任务2使用寄存器点亮一个LED灯1.1嵌入式ARM处理器STM32嵌入式系统概述

嵌入式系统是以应用为中心,嵌入到应用对象当中的专用计算机系统。由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向具体应用等特点,目前已经广泛地应用于军事国防、消费电子、信息家电、网络通信、工业控制等各个领域,可以说我们生活在一个充满嵌入式的世界当中。1.1嵌入式ARM处理器STM32ARM处理器1.1嵌入式ARM处理器STM32Cortex-M3概览1.1嵌入式ARM处理器STM32基于CM3的微控制器1.1嵌入式ARM处理器STM32初识STM32CORTEXM3CPU

72MHz6kB-64kBSRAMARMPeripheralBus(max72MHz)2x12-bitADC

16channels/1Msps1/2xI2C0/1xSPI1/2/4xUSART/LIN

Smartcard/IrDa

ModemControl32/49/80*I/OsUpto16Ext.ITsFlashI/F32kB-512kB

FlashMemoryTempSensor1xUSB2.0FS1xbxCAN2.0B6x16-bitPWM

SynchronizedACTimer2xWatchdog

(independent&window)2/3/5x16-bitTimerExternalMemoryInterface**JTAG/SWDebugXTALoscillators

32KHz+4~16MHzPowerSupply

Reg1.8V

POR/PDR/PVDDMA

3to11*ChannelsNestedvectITCtrl2xSPI/I2S**2xDAC**1xSDIO**ImageSensor**1xUSART/LIN

Smartcard/IrDa

Modem-Ctrl1xSPIBridgeBridge1xSysticTimerARMLiteHi-SpeedBus

Matrix/Arbiter(max72MHz)Int.RCoscillators

32KHz+8MHzPLLClockControlRTC/AWUARMPeripheralBus(max36MHz)20BBackupRegs1.1嵌入式ARM处理器STM32初识STM321.1嵌入式ARM处理器STM32初识STM321.1嵌入式ARM处理器STM32初识STM321.1嵌入式ARM处理器STM32STM32命名规则1.2任务1开发环境搭建MDK安装1.2任务1开发环境搭建MDK安装1.2任务1开发环境搭建MDK安装1.2任务1开发环境搭建USB转串口驱动的安装1.2任务1开发环境搭建开发板的资源描述1.2任务1开发环境搭建串口烧录程序1.2任务1开发环境搭建串口烧录程序1.2任务1开发环境搭建串口烧录程序1.2任务1开发环境搭建串口烧录程序1.2任务2使用寄存器点亮一个LED灯硬件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计#include"stm32f10x.h"

(1)voidSystemInit()

(2){}intmain(){RCC_APB2ENR|=1<<3;

(3)GPIOB_CRL&=~(0x0F<<(4*0));GPIOB_CRL|=(3<<4*0);

(4)GPIOB_BSRR=(1<<(16+0));

(5)while(1){}}1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计1.2任务2使用寄存器点亮一个LED灯软件设计#include"stm32f10x.h"voidSystemInit(){}voiddelay(unsignedinti){while(i--);}intmain(){RCC_APB2ENR|=1<<3;GPIOB_CRL&=~(0x0F<<(4*0));GPIOB_CRL|=(3<<4*0);GPIOB_BSRR=(1<<(16+0));while(1){GPIOB_BSRR=(1<<(16+0));delay(0xFFFFF);GPIOB_BSRR=(1<<(0));delay(0xFFFFF);}}1.2任务2使用寄存器点亮一个LED灯工程编译与调试1.2任务2使用寄存器点亮一个LED灯测试结果

下载成功后可以看到开发板上LED0指示灯闪烁举一反三(1)控制LED3发光二极管闪烁。(2)点亮LED0、LED1、LED2、LED3指示灯。(3)实现LED0、LED1、LED2、LED3指示灯交替亮灭,类似流水灯效果。嵌入式系统原理及应用

项目化教程项目2流水灯控制设计与实现目录2.1STM32存储器映射2.2认识STM32固件库2.3任务3使用库函数点亮流水灯2.1STM32存储器映射存储器分块序号用途地址范围Block0SRAM(FLASH)0x00000000-0x1FFFFFFF(512MB)Block1SRAM0x20000000-0x3FFFFFFF(512MB)Block2片上外设0x40000000-0x5FFFFFFF(512MB)Block3FSMC的bank1-bank20x60000000-0x7FFFFFFF(512MB)Block4FSMC的bank3-bank40x80000000-0x9FFFFFFF(512MB)Block5FSMCregister0xA0000000-0xBFFFFFFF(512MB)Block6Notused0xC0000000-0xDFFFFFFF(512MB)Block7Cortex-M3内部外设0xE0000000-0xFFFFFFFF(512MB)2.1STM32存储器映射总线基地址总线名称总线基地址相对外设基地址的偏移APB10x400000000x0APB20x400100000x00010000AHB0x400180000x000180002.1STM32存储器映射GPIO外设基地址外设名称外设基地址相对APB2总线的地址偏移GPIOA0x400108000x00000800GPIOB0x40010C000x00000C00GPIOC0x400110000x00001000GPIOD0x400114000x00001400GPIOE0x400118000x00001800GPIOF0x40011C000x00001C00GPIOG0x400120000x000020002.1STM32存储器映射GPIOB寄存器地址寄存器名称寄存器地址相对GPIOB基址的偏移GPIOB_CRL0x40010C000x00GPIOB_CRH0x40010C040x04GPIOB_IDR0x40010C080x08GPIOB_ODR0x40010C0C0x0CGPIOB_BSRR0x40010C100x10GPIOB_BRR0x40010C140x14GPIOB_LCKR0x40010C180x182.2认识STM32固件库STM32内部有数百个寄存器,为了方便用户编程,提高程序的移植性,解决不同厂商的芯片软件兼容的问题,ST公司推出了一套CMSIS(CortexMicroControllerSoftwareInterfaceStandard)标准固件库。(1)_htmresc文件夹:存放ST公司的LOGO图标。(2)Libraries文件夹:在这个文件夹内有两个子目录,CMSIS文件夹用于存放符合CMSIS标准的文件,包括STM32启动文件、ARMCortex内核文件、stm32f10x.h、system_stm32f10x.h和system_stm32f10x.c文件。启动文件有多种,需根据使用的STM32芯片来选择,因为开发板上使用的是大容量的STM32F1芯片,所以选择startup_stm32f10x_hd.s。core_cm3.h属于CMSIS的核心文件,由ARM提供,对于所有CM3内核的芯片来说这个文件都是相同的。system_stm32f10x.h主要是申明系统及总线时钟相关的函数,其中就有SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置整个系统和总线时钟。stm32f10x.h是STM32F10x的头文件,内部封装了STM32的总线、内存和外设寄存器等,同时还包含一些时钟相关的定义和中断相关定义等。STM32F10x_StdPeriph_Driver文件夹用于存放STM32外设驱动文件,inc目录用于存放外设的头文件,src目录用于存放外设的源文件。从这些文件的命名就可以知道对应文件的功能。(3)Project文件夹:此文件夹下有2个子目录,STM32F10x_StdPeriph_Examples文件夹存放的是ST公司提供的外设驱动例程,在开发过程中可以借鉴这些例程快速构建自己的外设驱动。STM32F10x_StdPeriph_Template文件夹存放的是官方的固件库工程模板,我们后面创建自己工程模板的时候就需要复制此文件夹内的几个文件。(4)Utilities文件夹:此文件夹是ST官方评估板的一些源文件。(5)stm32f10x_stdperiph_lib_um是固件库的帮助文档2.3任务3使用库函数点亮流水灯创建库函数工程模板2.3任务3使用库函数点亮流水灯配置魔法棒2.3任务3使用库函数点亮流水灯配置宏信息2.3任务3使用库函数点亮流水灯配置头文件路径2.3任务3使用库函数点亮流水灯编译模板工程2.3任务3使用库函数点亮流水灯STM32GPIO结构2.3任务3使用库函数点亮流水灯输入工作模式1—输入浮空模式2.3任务3使用库函数点亮流水灯输入工作模式2—输入上拉模式2.3任务3使用库函数点亮流水灯输入工作模式3—输入下拉模式2.3任务3使用库函数点亮流水灯输入工作模式4—模拟模式2.3任务3使用库函数点亮流水灯输出工作模式1—开漏输出模式2.3任务3使用库函数点亮流水灯输出工作模式2—开漏复用输出模式2.3任务3使用库函数点亮流水灯输出工作模式3—推挽输出模式2.3任务3使用库函数点亮流水灯输出工作模式4—推挽复用输出模式2.3任务3使用库函数点亮流水灯GPIO工作方式上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态推挽输出:可以输出强高低电平,连接数字器件

开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)2.3任务3使用库函数点亮流水灯GPIO相关配置寄存器每组GPIO端口的寄存器包括:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR),一个32位锁定寄存器(GPIOx_LCKR)。每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。2.3任务3使用库函数点亮流水灯GPIO相关配置寄存器-GPIOx_CRL:端口配置低寄存器-GPIOx_CRH:端口配置高寄存器

-GPIOx_IDR:端口输入寄存器-GPIOx_ODR:端口输出寄存器

-GPIOx_BSRR:端口位设置/清除寄存器

-GPIOx_BRR:端口位清除寄存器-GPIOx_LCKR:端口配置锁存寄存器是每组IO口含下面7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。2.3任务3使用库函数点亮流水灯端口配置低寄存器(GPIOx_CRL)2.3任务3使用库函数点亮流水灯端口配置低寄存器(GPIOx_CRL)2.3任务3使用库函数点亮流水灯端口配置高寄存器(GPIOx_CRH)2.3任务3使用库函数点亮流水灯端口输入数据寄存器(GPIOx_IDR)2.3任务3使用库函数点亮流水灯端口输出数据寄存器(GPIOx_ODR)2.3任务3使用库函数点亮流水灯端口输出数据寄存器(GPIOx_ODR)2.3任务3使用库函数点亮流水灯端口位设置/清除寄存器(GPIOx_BSRR)2.3任务3使用库函数点亮流水灯端口位清除寄存器(GPIOx_BRR)2.3任务3使用库函数点亮流水灯使用GPIO库函数点亮流水灯2.3任务3使用库函数点亮流水灯LEDGPIO初始化voidLED_Init(){GPIO_InitTypeDefGPIO_InitStructure;//定义结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB外设时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//选择要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率GPIO_Init(GPIOB,&GPIO_InitStructure);/*初始化GPIOB*/GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//将LED端口设置为高电平,熄灭所有LED}2.3任务3使用库函数点亮流水灯流水灯功能实现#include"stm32f10x.h"#include"led.h"voiddelay(unsignedinti){while(i--);}intmain(){LED_Init();while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_0);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_2);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_2);GPIO_ResetBits(GPIOB,GPIO_Pin_3);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_3);}}2.3任务3使用库函数点亮流水灯实现效果举一反三(1)快速查找几个函数:GPIO_Init、GPIO_SetBits、GPIO_RestBits,获取函数的功能及使用方法。(2)创建一个自己的库函数模板。(3)点亮LED2指示灯。(4)实现LED3闪烁。(5)实现LED花样流水灯效果嵌入式系统原理及应用

项目化教程项目3

数码管控制设计与实现学习目标1.掌握STM32的时钟系统;2.掌握STM32位带操作;3.掌握SysTick定时器实现精确延时;4.了解数码管的结构、工作原理和显示方式;5.掌握数码管静态和动态显示设计。目录3.1STM32的时钟系统3.2STM32位带操作3.3任务4使用位操作点亮流水灯3.4SysTick定时器3.5任务5数码管显示控制3.1STM32的时钟系统STM32时钟树3.1STM32的时钟系统STM32时钟树3.1STM32的时钟系统1.STM32有5个时钟源:HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时

钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

2.系统时钟SYSCLK可来源于三个时钟源:

①、HSI振荡器时钟

②、HSE振荡器时钟

③、PLL时钟3.STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL

输出的2分频、HSI、HSE、或者系统时钟。4.任何一个外设在使用之前,必须首先使能其相应的时钟。3.1STM32的时钟系统RCC相关配置寄存器typedefstruct{__IOuint32_tCR;//HSI,HSE,CSS,PLL等的使能和就绪标志位__IOuint32_tCFGR;//PLL等的时钟源选择,分频系数设定__IOuint32_tCIR;//

清除/使能时钟就绪中断__IOuint32_tAPB2RSTR;//APB2线上外设复位寄存器__IOuint32_tAPB1RSTR;//APB1线上外设复位寄存器__IOuint32_tAHBENR;//DMA,SDIO等时钟使能__IOuint32_tAPB2ENR;//APB2线上外设时钟使能__IOuint32_tAPB1ENR;//APB1线上外设时钟使能__IOuint32_tBDCR;//备份域控制寄存器__IOuint32_tCSR;//控制状态寄存器}RCC_TypeDef;3.1STM32的时钟系统RCC相关头文件和固件库源文件头文件:stm32f10x_rcc.h源文件:stm32f10x_rcc.c时钟使能配置:

RCC_LSEConfig()、RCC_HSEConfig()、

RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()……时钟源相关配置:

RCC_PLLConfig

()、

RCC_SYSCLKConfig()、

RCC_RTCCLKConfig()…分频系数选择配置:

RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()…外设时钟使能:RCC_APB1PeriphClockCmd()://APB1线上外设时钟使能

RCC_APB2PeriphClockCmd();//APB2线上外设时钟使能

RCC_AHBPeriphClockCmd();//AHB线上外设时钟使能5.其他外设时钟配置:

RCC_ADCCLKConfig();RCC_RTCCLKConfig();状态参数获取参数:

RCC_GetClocksFreq();

RCC_GetSYSCLKSource();

RCC_GetFlagStatus()RCC中断相关函数:

RCC_ITConfig()、

RCC_GetITStatus()、

RCC_ClearITPendingBit()…3.2STM32位带操作位操作原理

把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。3.2STM32位带操作哪些区域支持位操作:其中一个是SRAM区的最低1MB范围,0x20000000‐0x200FFFFF(SRAM区中的最低1MB)第二个则是片内外设区的最低1MB范围,

0x40000000‐0x400FFFFF(片上外设区中最低1MB)3.2STM32位带操作3.2STM32位带操作3.2STM32位带操作位带操作优越性3.3任务4使用位操作点亮流水灯system.h里面对GPIO输入输出部分功能实现了位带操作:#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))//IO口地址映射#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOF_ODR_Addr(GPIOF_BASE+12)//0x40011A0C#defineGPIOG_ODR_Addr(GPIOG_BASE+12)//0x40011E0C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08//IO口操作,只对单一的IO口!//确保n的值小于16!#definePAout(n)BIT_ADDR(GPIOA_ODR_Addr,n)//输出#definePAin(n)BIT_ADDR(GPIOA_IDR_Addr,n)//输入#definePBout(n)BIT_ADDR(GPIOB_ODR_Addr,n)//输出#definePBin(n)BIT_ADDR(GPIOB_IDR_Addr,n)//输入…#definePFout(n)BIT_ADDR(GPIOF_ODR_Addr,n)//输出#definePFin(n)BIT_ADDR(GPIOF_IDR_Addr,n)//输入#definePGout(n)BIT_ADDR(GPIOG_ODR_Addr,n)//输出#definePGin(n)BIT_ADDR(GPIOG_IDR_Addr,n)//输入3.3任务4使用位操作点亮流水灯PB0LED闪烁#defineled0PBout(0)//PB0引脚连接LED0#defineled1PBout(1)//PB1引脚连接LED1#defineled2PCout(2)//PB2引脚连接LED2#defineled3PCout(3)//PB3引脚连接LED3#include"system.h"#include"led.h"voiddelay(u32i){while(i--);}intmain(){LED_Init();while(1){led0=!led0;delay(6000000);}}3.3任务4使用位操作点亮流水灯LED流水灯led0=1;led1=0;led2=1;led3=1;delay(6000000);led0=1;led1=1;led2=0;led3=1;delay(6000000);led0=1;led1=1;led2=1;led3=0;delay(6000000);}}#include"system.h"#include"led.h"voiddelay(u32i){while(i--);}intmain(){LED_Init();while(1){led0=0;led1=1;led2=1;led3=1;delay(6000000);3.3任务4使用位操作点亮流水灯测试效果3.4SysTick定时器Systick定时器是什么?Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。3.4SysTick定时器Systick定时器就是系统滴答定时器,一个24

位的倒计数定时器,计到0

时,将从RELOAD

寄存器中自动重装载定时初值。只要不把它在SysTick

控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。Systick中断的优先级也可以设置。3.4SysTick定时器Systick相关寄存器SysTick

控制和状态寄存器-CTRL

对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8

内核时钟是HCLK时钟

配置函数:SysTick_CLKSourceConfig();3.4SysTick定时器Systick相关寄存器SysTick

重装载数值寄存器-LOADSysTick

当前值寄存器-VAL3.4SysTick定时器Systick库函数

固件库中的Systick相关函数:SysTick_CLKSourceConfig()//Systick时钟源选择misc.c文件中SysTick_Config(uint32_tticks)//初始化systick,时钟为HCLK,并开启中断

//core_cm3.h/core_cm4.h文件中Systick中断服务函数:voidSysTick_Handler(void);3.4SysTick定时器Systick库函数

SysTick_CLKSourceConfig函数:voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource){/*Checktheparameters*/assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if(SysTick_CLKSource==SysTick_CLKSource_HCLK){SysTick->CTRL|=SysTick_CLKSource_HCLK;}else{SysTick->CTRL&=SysTick_CLKSource_HCLK_Div8;}}3.4SysTick定时器Systick库函数

SysTick_CLKSourceConfig函数:static__INLINEuint32_tSysTick_Config(uint32_tticks){if(ticks>SysTick_LOAD_RELOAD_Msk)return(1);/*Reloadvalueimpossible*/

/*setreloadregister*/SysTick->LOAD=(ticks&SysTick_LOAD_RELOAD_Msk)-1;/*setPriorityforCortex-M0SystemInterrupts*/NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);SysTick->VAL=0;/*LoadtheSysTickCounterValue*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;/*EnableSysTickIRQandSysTickTimer*/return(0);/*Functionsuccessful*/}3.4SysTick定时器delay延时static__IOuint32_tTimingDelay;voidDelay(__IOuint32_tnTime){TimingDelay=nTime;while(TimingDelay!=0);}voidSysTick_Handler(void){if(TimingDelay!=0x00){TimingDelay--;}}intmain(void){…if(SysTick_Config(SystemCoreClock/1000))//systick时钟为HCLK,中断时间间隔1ms{while(1);}while(1){Delay(200);//2ms…}}用中断的方式实现delay延时3.4SysTick定时器使用SysTick定时器实现流水灯#include"system.h"#include"SysTick.h"#include"led.h"intmain(){SysTick_Init(72);LED_Init();while(1){led1=0;led2=1;delay_ms(500);//精确延时500msled1=1;led2=0;delay_ms(500);}}3.5任务5数码管显示控制LED数码管内部引脚图3.5任务5数码管显示控制8段LED段码显示字符共阴极段码共阳极段码显示字符共阴极段码共阳极段码03FHC0HC39HC6H106HF9Hd5EHA1H25BHA4HE79H86H34FHB0HF71H8EH466H99HH76H89H56DH92HL38HC7H67DH82Hn37HC8H707HF8Ho5CHA3H87FH80HP73H8CH96FH90HU3EHC1HA77H88H灭00HFFHb7CH83H

3.5任务5数码管显示控制N位LED数码管结构3.5任务5数码管显示控制4位LED动态显示电路3.5任务5数码管显示控制数码管模块电路图3.5任务5数码管显示控制初始化数码管IOvoidSMG_Init(){GPIO_InitTypeDefGPIO_InitStructure;//声明一个结构体变量,用来初始化GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIO时钟/*配置GPIO的模式和IO口*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//选择要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);/*初始化GPIO*/}3.5任务5数码管显示控制静态显示核心代码#include"system.h"#include"SysTick.h"#include"led.h"#include"smg.h"u8smgduan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F数码管段选数据intmain(){u8i=0;SysTick_Init(72);LED_Init();SMG_Init();while(1){led0=1;for(i=0;i<16;i++){GPIO_Write(GPIOB,(u16)(~smgduan[i]));delay_ms(1000);}}}3.5任务5数码管显示控制静态显示效果3.5任务5数码管显示控制数码管动态显示#include"system.h"#include"SysTick.h"#include"led.h"#include"smg.h"u8smgduan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F数码管段选数据intmain(){u8i=0;SysTick_Init(72);LED_Init();SMG_Init();while(1){led0=1;led1=0;led2=0;led3=0;GPIO_Write(GPIOB,(u16)(~0x3F));delay_ms(1000);led0=0;led1=1;led2=0;led3=0;GPIO_Write(GPIOB,(u16)(~0x06));delay_ms(1000);led0=0;led1=0;led2=1;led3=0;GPIO_Write(GPIOB,(u16)(~0x5B));delay_ms(1000);led0=0;led1=0;led2=0;led3=1;GPIO_Write(GPIOB,(u16)(~0x4F));delay_ms(1000);}}3.5任务5数码管显示控制数码管动态显示效果举一反三(1)通过修改delay_ms函数内的延时时间,观察LED流水灯效果(注意延时函数内的参数最大范围,不能超过最大值,否则延时不准确);(2)通过修改系统时钟调节LED闪烁速度;(3)使用位操作实现D2指示灯闪烁;(4)使用位操作实现LED流水灯效果;(5)设计一个9秒钟倒计时器。嵌入式系统原理及应用

项目化教程项目4蜂鸣器控制设计与实现学习目标1.掌握STM32中断系统及其软件配置;2.掌握按键控制程序设计;3.掌握蜂鸣器控制程序设计;4.利用外中断实现按键控制蜂鸣器发声。目录4.1中断介绍4.2任务6按键控制4.3任务7蜂鸣器控制4.4任务8外部中断控制4.1中断介绍中断概念

在嵌入式系统应用中,当内部、外部随机事件发生时,能及时响应并实时处理都是利用中断技术实现的。中断的发生是由内部或外部因素随机决定的,程序中无法事先安排调用指令,所以响应中断服务程序的过程是由硬件自动完成的。中断系统的应用大大提高了CPU的工作效率。程序在执行过程中由于内部或外界的随机事件而被中间打断的情况称为“中断”。引发中断的称为中断源。4.1中断介绍中断嵌套(1)若是同级中断源申请中断,CPU将不予理睬;

(2)若是高级中断源申请中断,CPU将转去响应高级中断请求,待高级中断服务程序执行完毕,CPU再转回低级中断服务程序断点处接着执行。

有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。当CPU正在执行中断服务程序时,又有其他中断源发出中断申请,CPU要分析判断,决定是否响应该中断。判决规则如下:4.1中断介绍NVIC英文全称是NestedVectoredInterruptController,意思是嵌套向量中断控制器,它属于CM3内核的一个外设,控制着芯片的中断相关功能。4.1中断介绍中断管理方法首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置:组AIRCR[10:8]IPbit[7:4]分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级40114:04位抢占优先级,0位响应优先级4.1中断介绍抢占优先级&响应优先级区别:高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;4.1中断介绍中断优先级分组函数:voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup){assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;}NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);4.1中断介绍中断设置相关寄存器__IOuint8_tIP[240];//中断优先级控制的寄存器组__IOuint32_tISER[8];//中断使能寄存器组__IOuint32_tICER[8];//中断失能寄存器组__IOuint32_tISPR[8];//中断挂起寄存器组__IOuint32_tICPR[8];//中断解挂寄存器组__IOuint32_tIABR[8];//中断激活标志位寄存器组4.1中断介绍MDK中NVIC寄存器结构体typedefstruct{__IOuint32_tISER[8];uint32_tRESERVED0[24];

__IOuint32_tICER[8];uint32_tRSERVED1[24];

__IOuint32_tISPR[8];uint32_tRESERVED2[24];

__IOuint32_tICPR[8];uint32_tRESERVED3[24];__IOuint32_tIABR[8];uint32_tRESERVED4[56];__IOuint8_tIP[240];uint32_tRESERVED5[644];__Ouint32_tSTIR;}NVIC_Type;4.1中断介绍中断优先级设置步骤系统运行后先设置中断优先级分组。调用函数:voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);

整个系统执行过程中,只设置一次中断分组。②针对每个中断,设置对应的抢占优先级和响应优先级:voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);③如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。4.2任务6按键控制

按键是一种电子开关,使用时按下开关按钮就可使开关接通,释放时,开关断开。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后才稳定下来。键按下时的抖动被称为前沿抖动,释放时的抖动被称为后沿抖动,抖动时间的长短与开关的机械特性有关,持续时间一般为5~10ms4.2任务6按键控制硬件设计从原理图可以知道,按键KEY0连接在芯片的PC1引脚上,按键KEY1连接在芯片的PC13引脚上。按键另一端是连接在GND上,采用独立式按键接法,按下时输入到芯片管脚即为低电平。4.2任务6按键控制软件设计voidKEY_Init(void){GPIO_InitTypeDefGPIO_InitStructure;//定义结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_13;//选择要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率GPIO_Init(GPIOC,&GPIO_InitStructure);}KEY_Init()函数用来初始化按键的端口及时钟。要知道按键是否按下,就需要读取按键所对应的IO口电平状态,因此需要把GPIO配置为输入模式,因为按键一端是接地的,当按下后管脚即为低电平,所以需要将管脚配置为上拉输入模式,这样管脚的默认电平就为高电平,如果读取到管脚的电平为低电平时,就说明按键按下。4.2任务6按键控制按键检测函数u8KEY_Scan(u8mode){staticu8key=1;if(key==1&&(KEY0==0||KEY1==0))//任意键按下{delay_ms(10);//消抖key=0;if(KEY0==0){returnKEY0;}elseif(KEY1==0){returnKEY1;}}elseif(KEY0==1&&KEY1==1)//无按键按下{key=1;}if(mode==1)//连续按键按下{key=1;}return0;}#ifndef_key_H#define_key_H#include"system.h"//使用位操作定义#defineKEY0PCin(1)#defineKEY1PCin(13)4.2任务6按键控制主函数#include"system.h"#include"SysTick.h"#include"led.h"#include"key.h"intmain(){u8key;SysTick_Init(72);LED_Init();KEY_Init();while(1){key=KEY_Scan(0);//扫描按键switch(key){caseKEY0:led2=0;break;//按下KEY0按键,LED2指示灯亮caseKEY1:led2=1;break;//按下KEY1按键,LED2指示灯灭}}}4.2任务6按键控制测试效果当按下KEY0键,LED2指示灯点亮;当按下KEY1键,LED2指示灯熄灭4.3任务7蜂鸣器控制

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式和电磁式两种类型。

有源蜂鸣器与无源蜂鸣器的区别:这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫,必须用2~5KHz的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。无源蜂鸣器的优点是便宜、声音频率可控,可以做出“哆瑞咪发嗦啦西”的效果;有源蜂鸣器的优点是程序控制方便。4.3任务7蜂鸣器控制硬件设计4.3任务7蜂鸣器控制蜂鸣器初始化函数voidBEEP_Init()//端口初始化{GPIO_InitTypeDefGPIO_InitStructure;//声明一个结构体变量,用来初始化GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*开启GPIO时钟*//*配置GPIO的模式和IO口*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//选择要设置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化GPIO*/}4.3任务7蜂鸣器控制主函数#include"system.h"#include"SysTick.h"#include"beep.h"intmain(){u16i=0;SysTick_Init(72);LED_Init();BEEP_Init();while(1){i++;if(i%20==0){beep=!beep;}delay_us(10);}}4.3任务7蜂鸣器控制测试效果将工程程序编译下载到开发板内,可以听到蜂鸣器发声4.4任务8外部中断控制EXTI结构框图4.4任务8外部中断控制STM32的每个IO都可以作为外部中断输入。STM32的中断控制器支持19个外部中断/事件请求:线0~15:对应外部IO口的输入中断。线16:连接到PVD输出。线17:连接到RTC闹钟事件。线18:连接到USB唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),STM32F103RCT6(51),那么中断线怎么跟io口对应呢?4.4任务8外部中断控制GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1…GPIOx.15映射到EXTI154.4任务8外部中断控制IO口外部中断在中断向量表中只分配了7个中断向量,也就是

只能使用7个中断服务函数从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数外部中断线10~15分配一个中断向量,共用一个中断服务函数。4.4任务8外部中断控制EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler中断服务函数列表:4.4任务8外部中断控制外部中断常用库函数①voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);//设置IO口与中断线的映射关系exp:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);②voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);//初始化中断线:触发方式等③ITStatusEXTI_GetITStatus(uint32_tEXTI_Line);//判断中断线中断状态,是否发生④voidEXTI_ClearITPendingBit(uint32_tEXTI_Line);//清除中断线上的中断标志位4.4任务8外部中断控制EXTI_Init函数voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);typedef

struct{uint32_tEXTI_Line;//指定要配置的中断线

EXTIMode_TypeDef

EXTI_Mode;//模式:事件OR中断

EXTITrigger_TypeDef

EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发

FunctionalState

EXTI_LineCmd;//使能OR失能}EXTI_InitTypeDef;

EXTI_InitStructure.EXTI_Line=EXTI_Line2;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure); 4.4任务8外部中断控制初始化IO口为输入。

GPIO_Init();②

开启IO口复用时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);设置IO口与中断线的映射关系。

voidGPIO_EXTILineConfig();初始化线上中断,设置触发条件等。

EXTI_Init();配置中断分组(NVIC),并使能中断。

NVIC_Init();⑥编写中断服务函数。

EXTIx_IRQHandler();清除中断标志位

EXTI_ClearITPendingBit();外部中断的一般配置步骤:4.4任务8外部中断控制EXTI初始化函数voidMy_EXTI_Init(void){NVIC_InitTypeDefNVIC_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);//选择PC1管脚作为外部中断线路//EXTI1NVIC配置NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//EXTI1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化NVIC寄存器

EXTI_InitStructure.EXTI_Line=EXTI_Line1;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}4.4任务8外部中断控制EXTI中断函数voidEXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)==1){delay_ms(10);if(KEY0==1){BEEP=0;}}EXTI_ClearITPendingBit(EXTI_Line1);}4.4任务8外部中断控制主函数intmain(){u8i;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组,分2组BEEP_Init();KEY_Init();My_EXTI_Init();//外部中断初始化while(1){i++;if(i%20==0){BEEP=!BEEP;}delay_ms(10); }}4.4任务8外部中断控制测试效果将工程程序编译后下载到开发板内,当按下按键,蜂鸣器发声举一反三(1)打开之前编写好的库函数程序,查看misc.c、misc.h、core_cm3.h及startup_stm32f10x_hd.s文件内容,对照本章提到的函数及结构体等加深印象。(2)使用连续扫描模式调节蜂鸣器声音和音调。(温馨提示:如果连续扫描返回键值太快,可以进行一定处理,间隔一段时间让其按键键值返回)。(3)改变蜂鸣器发声音调和声音大小(温馨提示:改变音调即修改管脚输出频率,改变声音大小即修改占空比)。(4)使用外部中断方式来调节蜂鸣器的音调和声音。(温馨提示:方法和按键实验章节类似,只不过这里采用外部中断来处理)。嵌入式系统原理及应用

项目化教程项目5呼吸灯控制设计与实现学习目标1.掌握STM32通用定时器的原理及软件配置;2.掌握STM32通用定时器中断及软件配置;3.掌握STM32PWM的原理;4.利用定时器实现PWM呼吸灯。目录5.1定时器介绍5.2任务9使用定时器实现PWM控制5.1定时器介绍通用定时器的内部结构框图5.1定时器介绍5.1定时器介绍5.1定时器介绍5.1定时器介绍5.1定时器介绍5.1定时器介绍5.1定时器介绍定时器中断实验APB1时钟X1/X2F(CK_PSC)

÷NCK_CNT内部时钟选择5.1定时器介绍定时器中断实验时钟计算方法:5.1定时器介绍定时器中断实验通用定时器可以向上计数、向下计数、向上向下双向计数模式。①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。计数器模式5.1定时器介绍向下计数模式(时钟分频因子=1)5.1定时器介绍向上计数模式(时钟分频因子=1)5.1定时器介绍中央对齐计数模式(时钟分频因子=1ARR=6)5.1定时器介绍计数器当前值寄存器CNT5.1定时器介绍预分频寄存器TIMx_PSC5.1定时器介绍自动重装载寄存器(TIMx_ARR)5.1定时器介绍控制寄存器1(TIMx_CR1)5.1定时器介绍DMA中断使能寄存器(TIMx_DIER)5.1定时器介绍常用库函数voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);定时器参数初始化:voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState)定时器使能函数:定时器中断使能函数:voidTIM_ITConfig(TIM_TypeDef*TIMx,uint16_tTIM_IT,FunctionalStateNewState);5.1定时器介绍状态标志位获取和清除FlagStatusTIM_GetFlagStatus(TIM_TypeDef*TIMx,uint16_tTIM_FLAG);voidTIM_ClearFlag(TIM_TypeDef*TIMx,uint16_tTIM_FLAG);ITStatusTIM_GetITStatus(TIM_TypeDef*TIMx,uint16_tTIM_IT);voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,uint16_tTIM_IT);5.1定时器介绍定时器中断实现步骤能定时器时钟。

温馨提示

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

评论

0/150

提交评论