版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
掌握I/O位带操作·实现流水灯控制·培养工程思维位带操作流水灯控制绿色设计STM32EMBEDDEDTECHNOLOGYSTM32嵌入式技术及应用项目二
可控LED流水灯的设计与实现任务2-3可控LED流水灯的设计与实现目录CONTENTS01任务目标掌握I/O位带操作原理,设计可控LED流水灯系统,实现周期动态变化的流水灯效果02知识储备I/O位带操作的基本概念、寄存器地址计算、位带别名地址宏定义、C代码实现03任务实施硬件电路设计、仿真电路搭建、程序设计、工程创建、编译与调试04任务总结与评价核心知识点总结、技能提升、提升训练、任务评价标准建议课时:4学时难度等级:中级任务目标核心技能掌握I/O位带操作的基本原理及其在嵌入式系统中的应用系统设计设计并实现一个可控LED流水灯系统绿色设计通过优化LED控制逻辑,减少无效闪烁和空闲等待时间,提高系统能效比系统功能要求1初始状态2个LED灯以2s为周期交替闪烁(亮1s,灭1s)2周期变化逐渐缩短周期,每次递减0.1s3极限状态直到周期变为0.2s后4循环恢复再恢复到2s,并循环反复学习成果掌握位带操作,实现流水灯控制工具使用Proteus仿真+Keil开发环境设计理念低功耗设计+代码优化01知识储备I/O位带操作原理与C代码实现位带操作基本概念与原理地址计算寄存器地址映射宏定义简化位带操作I/O位带操作的基本概念位带区Bit-bandRegion是内存中一段特殊的区域,包含了所有外设寄存器的位镜像。这些位镜像允许开发者以位为单位进行访问和操作,而无需进行繁琐的位运算。由于处理器架构限制,通常无法直接访问位带区位带别名区Bit-bandAliasRegion中的每个地址都与位带区中的某个特定位相对应,这种对应关系是固定的。通过访问位带别名区中的地址,可以间接地访问和操作位带区中的特定位。这是STM32解决位带访问困难的关键机制核心优势高效访问直接对特定寄存器位进行读写,无需复杂位运算快速控制实现对GPIO引脚的快速控制,提高系统响应速度节能减排减少不必要操作和资源浪费,降低系统能耗地址映射关系位带别名区基地址:0x22000000(外设寄存器)和0x20000000(SRAM)位带操作的寄存器地址计算地址计算公式位带别名区地址=(寄存器地址-外设寄存器基地址)×32+0x22000000+(位偏移×4)1寄存器地址:外设寄存器的实际地址2外设寄存器基地址:外设寄存器的起始地址3位偏移:目标位在寄存器中的位置(乘以4转换为32位地址偏移)位带操作示例代码//将GPIOA的第5脚(PA5)设置为高电平*(volatileuint32_t*)0x220001E0=1<<5;volatile关键字:告诉编译器变量的值可能在程序控制之外被改变,确保每次访问都直接从硬件读取数据计算实例:GPIOAODR第5位步骤1:确定寄存器地址GPIOA的输出数据寄存器(ODR)地址=0x40010814步骤2:确定外设寄存器基地址GPIOA基地址=0x40010800步骤3:计算位偏移访问ODR寄存器第5位,字节偏移量=0(第0个字节的第5位)步骤4:应用公式计算位带别名区地址=(0x40010814-0x40010800)×32+0x22000000+(0×4)=0x00000014×32+0x22000000+0=0x000001E0+0x22000000=0x220001E0步骤5:操作位带别名区地址通过解引用指向该地址的volatileuint32_t指针来访问和操作该地址位带别名地址宏定义1BITBAND宏将"位带地址+位序号"转换成位带别名地址#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))addr:位带区开始地址,如0x40000000addr&0xF0000000:保留地址最高4位(区域选择位)+0x2000000:映射到位带别名区基地址<<5:左移5位(乘以32)bitnum<<2:位号左移2位(乘以4)2MEM_ADDR宏将位带别名地址转换为指向volatileunsignedlong类型的指针#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))使用volatile确保每次都能如实进行读写3BIT_ADDR宏结合BITBAND和MEM_ADDR,实现对单个位的读写#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))GPIO端口输入输出宏定义示例//GPIOA端口输出宏定义#definePAout(n)BIT_ADDR(GPIOA_ODR_Addr,n)//GPIOA端口输入宏定义#definePAin(n)BIT_ADDR(GPIOA_IDR_Addr,n)//使用示例A0_State=PAin(10);//读取PA10引脚输入值PDout(5)=1;//从PD5引脚输出高电平I/O口位带操作C代码实现sys.h头文件//防止重复包含#ifndef__SYS_H#define__SYS_H//包含STM32F103设备头文件#include"stm32f10x.h"//IO口操作宏定义#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口地址映射-GPIOA~GPIOG#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08//...GPIOC~GPIOF类似定义#defineGPIOG_ODR_Addr(GPIOG_BASE+12)//0x40011E0C#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08//IO口操作宏,只对单一IO口!#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)//输入//...PC~PG类似定义#definePGout(n)BIT_ADDR(GPIOG_ODR_Addr,n)//输出#definePGin(n)BIT_ADDR(GPIOG_IDR_Addr,n)//输入#endif绿色电子设计理念优化位带操作宏定义,减少不必要的循环和条件判断提高代码执行效率,降低CPU工作负载间接促进系统节能减排sys.c源文件//包含sys.h头文件#include"sys.h"//sys.c文件目前只有一行代码//后续会添加系统时钟配置、I/O配置、中断配置等文件位置:工程目录/SYSTEM/sys/核心优势高效性直接定位目标位,避免繁琐位运算简洁性代码简洁易读,便于维护可移植性宏定义封装,易于移植到其他项目02任务实施可控LED流水灯的设计、仿真与调试电路设计最小系统+LED电路程序设计初始化+延时+控制仿真调试Proteus+Keil联调工程创建编译+调试+验证任务实现要求与硬件电路设计硬件电路设计1使用STM32F103R6单片机2设计最小系统电路(时钟、复位)3LED连接到GPIOA的Pin1和Pin24通过限流电阻连接到电源程序设计1编写LED初始化代码2配置推挽输出模式3编写延时函数实现精确控制4实现周期动态变化的流水灯仿真与调试1在Proteus中搭建仿真电路2加载编译生成的HEX文件3运行仿真验证电路和程序4调整延时参数确保正确闪烁LED流水灯系统功能要求初始周期2s亮1s,灭1s交替闪烁周期递减0.1s每次减少0.1秒最小周期0.2s达到极限后恢复循环模式∞恢复到2s后循环仿真电路设计最小系统电路复位引脚NRST接高电平,设置上电复位后正常工作启动方式BOOT0连接地,设置用户FLASH启动电源配置VBAT、VDDA连接VDD,VSS连接地Proteus提示:复位电路和晶振电路在不连接时,软件会默认已接好LED电路1两个LED(D1和D2)的负极连接到GPIOA的Pin1和Pin22LED的正极通过限流电阻R1、R2连接到正电源VDD3电阻值通常为100Ω~1kΩ,限制LED电流防止损坏仿真电路图STM32F103R6LED灯限流电阻电路设计检查清单STM32芯片正确放置NRST接高电平BOOT0接地电源配置正确LED极性正确限流电阻合适程序设计-LED初始化与延时函数led.h头文件//防止重复包含#ifndef__LED_H#define__LED_H//包含sys.h头文件#include"sys.h"//两个LED相关引脚的宏定义#defineLED0PAout(1)#defineLED1PAout(2)//函数声明voidLED_Init(void);voidLED_Flow(uint16_tnms);voiddelay_ms(uint16_tms);#endif延时函数//优化延时函数,减少CPU空闲等待时间voiddelay_ms(uint16_tms){uint16_ti;for(;ms>0;ms--)for(i=1000;i>0;i--);}绿色设计:优化延时算法,降低系统整体能耗LED初始化函数//LED初始化函数voidLED_Init(void){GPIO_InitTypeDefGPIO_InitStructure;/*开启GPIOA时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*GPIO初始化*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*设置默认电平*/GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);}LED流水灯控制函数//LED流水灯控制函数voidLED_Flow(uint16_tnms){LED0=0;//PA1输出低电平,LED0亮LED1=1;//PA2输出高电平,LED1灭delay_ms(nms);//延时LED0=1;//PA1输出高电平,LED0灭LED1=0;//PA2输出低电平,LED1亮delay_ms(nms);//延时}注意:LED0和LED1交替亮灭,形成流水灯效果程序设计-主程序实现main.c主程序//包含STM32F103设备头文件#include"stm32f10x.h"//包含LED控制头文件#include"LED.h"//包含系统头文件#include"sys.h"//定义LED周期变量staticuint16_tled_ms=0;//主函数intmain(void){/*模块初始化*/LED_Init();//LED初始化led_ms=1000;//初始周期1秒while(1){if(led_ms==0)led_ms=1000;//周期减到0,恢复1秒LED_Flow(led_ms);//执行LED流水灯控制led_ms-=50;//周期每次减少0.1秒}}程序执行流程1系统初始化调用LED_Init()初始化GPIOA2设置初始周期led_ms=1000(1秒)3进入主循环while(1)无限循环4执行流水灯调用LED_Flow(led_ms)5递减周期led_ms-=50(减0.1秒)6循环恢复周期为0时恢复1秒周期变化规律初始1000ms第1次950ms递减-50ms极限100ms创建工程、编译与调试1建立工程目录创建"任务2-3可控LED流水灯控制"目录复制任务2-1工程到该目录2修改工程名修改目录名为"任务2-3可控LED流水灯控制"工程名改为"可控LED流水灯控制.uvproj"3调整目录结构删除key文件夹保留led文件夹4添加System目录新建System目录及子目录sys复制sys.c和sys.h到sys子目录5修改main.c在User子目录下修改main.c代码按照任务要求编写流水灯控制程序6Keil5工程配置打开Keil5打开修改后的工程文件添加Hardware组添加led.c到工程添加System组添加sys.c到工程配置完成准备编译工程编译工程单击Rebuild按钮编译工程生成"LED_Flow.hex"文件若编译错误,分析检查直到编译正确仿真验证加载LED_Flow.hex到Proteus运行仿真验证结果与任务要求是否一致若存在问题,结合电路和程序分析检查任务总结I/O位带操作原理与应用深入理解位带区和位带别名区的概念掌握寄存器地址计算方法高效访问和操作STM32的GPIO引脚LED流水灯控制逻辑设计控制逻辑,实现LED以不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年氢燃料电池系统测试流程优化报告
- 2025 八年级地理上册中国季风气候的异常变化对能源市场供需的影响课件
- 中国基础哲学 5
- 2026年社会保障卡知识竞赛题库及答案(含各题型)
- 2026年四川邮电职业技术学院单招职业技能测试题库及一套完整答案详解
- 2026年天津商务职业学院单招职业适应性测试题库带答案详解(典型题)
- 2026年天津电子信息职业技术学院单招职业适应性考试题库及答案详解一套
- 2026年天津职业大学单招职业技能考试题库含答案详解(达标题)
- 2026年四平职业大学单招职业技能测试题库含答案详解(模拟题)
- 2026年宁波卫生职业技术学院单招职业倾向性考试题库附参考答案详解(基础题)
- 2026银行间市场数据报告库(上海)股份有限公司招聘30人笔试备考题库及答案解析
- 2025~2026学年度第二学期统编版语文三年级教学计划
- 2025年湖南水利水电职业技术学院单招综合素质考试试题及答案解析
- 2026年哈尔滨科学技术职业学院单招职业技能考试题库附答案
- 雨课堂学堂云在线《高级医学英语(首都医大 )》单元测试考核答案
- 2023年初中数学教师高级职称考试试题含解析
- 生产经营单位从业人员安全培训教材
- 儿科学总论医学知识讲座培训课件
- 工程概算表【模板】
- 音乐教案《我是中国人》
- 健康心理学总结
评论
0/150
提交评论