嵌入式系统实验——【玄武F103开发板】顺序点亮4小灯和4小灯全亮两种点亮模式、并使用KEY1控制切换点亮模式
一、实验目的
顺序点亮4小灯和4小灯全亮两种点亮模式、并可以使用KEY1控制切换点亮模式
二、实验思路:
(一)示例程序分析
#include "stm32f10x.h"
typedef unsigned int u32;
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);GPIO_Write(GPIOB, 0x20);delay(0x2FFFFF);}
}
1.欲向GPIO的一个端口寄存器写入数据或读出数据的步骤:
①打开这个控制端口(GPIOx)的时钟使能寄存器(GPIO都在APB2),使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
②选中GPIO的管脚,使用GPIO_InitStructure.GPIO_Pin = GPIO_Pin_y;
③设置选中管脚的速率和工作状态
④将②``③
设置的参数使用GPIO_Init(GPIOx, &GPIO_InitStructure);
初始化GPIOx寄存器
2.GPIO_Write
一次性向所有GPIO管脚的ODR寄存器写入数据(GPIO_WriteBit
则一次只写入指定的管脚的ODR寄存器(一次只写一位))
3.控制小灯闪烁
设置GPIOB的PB5管脚工作模式为推挽输出,则GPIO的PB5(对应示例代码中的GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
)的值为1时,LED0的电平为高电平,小灯熄灭,否则LED0点亮。
while(1){//PB5的ODR为0,点亮GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);//0x20即为GPIO_Pin_5,0x20对应的二进制数为//0b100000,从右向左数,从第0位开始的第5位为1,//所以下面这行代码的意思就是设置PB5的ODR为1//所以在推挽输出下,LED0为高电平,LED0处小灯熄灭GPIO_Write(GPIOB, 0x20);delay(0x2FFFFF);}
(二)实现同时点亮4个小灯(本文控制的为PB5、PB6、PB7、PB10)
(PS:PB8为蜂鸣器,不用那个管脚)
(使用导线,将这四个管脚与小灯对应的导线相连接)
依照点亮PB5处小灯的原理,只需要将PB6、PB7、PB10对应的管脚也进行相应的参数的初始化即可,再在熄灭小灯的语句上,把这几个管脚对应的位设置为1即可。代码如下:
#include "stm32f10x.h"
typedef unsigned int u32;
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){//ps:此处由于向GPIOB所有管脚都写入0,所以只要是上面初始化//过的设置为推挽输出模式的管脚,如果下下条Write语句没有把//对应端口置1,则这样的管脚导线连接的小灯会点亮GPIO_Write(GPIOB, 0x0);delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);}
}
(三)实现4个小灯顺序点亮(走马灯)
原理同上,只需要在熄灭小灯时每次顺序留下一个小灯不熄灭即可,代码如下:
ps:每次点亮灯的时候,由于使用的GPIO_Write
方法,所以还同时熄灭了除此灯以外的其他灯(4个灯中的)
#include "stm32f10x.h"
typedef unsigned int u32;
void delay(u32 i)
{while(i--);
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){//点亮第1个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第2个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第3个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_10);delay(0x2FFFFF);//点亮第4个灯,熄灭其他三个灯GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);delay(0x2FFFFF);}
}
(四)使用KEY1控制上述两种点亮模式的切换
由于下图所示的KEY1的电路图,所以当KEY1对应的PE3如果为下拉输入,按下KEY1与否,KEY1处电平不改变,无意义。所以设置PE3为上拉输入,那么,当KEY1按下时,KEY1处电平为低电平,对应的PE3的IDR为0,反之为1,据此判断KEY1是否按下。
使用GPIO_ReadInputDataBit
方法读入PE3的IDR的数据,设置PE3的工作模式为上拉输入,因此设计满足要求的代码如下:
#include "stm32f10x.h"
#include<stdio.h>
void delay(u32 i)
{while(i--);
}
#define SYSCLK 72000000
void delay_us(unsigned int us)
{SysTick->LOAD = us * (SYSCLK / 1000000) - 1;//SysTick->VAL降为0时的时候,开始启动计时器//因此若其初值为0,则即时启动计时器SysTick->VAL = 0;SysTick->CTRL = (1 << 2) | (1 << 0);while ((SysTick->CTRL & (1 << 16)) == 0);SysTick->CTRL = 0;
}int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin = 0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOE, &GPIO_InitStructure); int mode = 0;while(1){//something maybe not that good// when clicked key1, and press it too long to program go through a if or else block. program will meet// this first if ,and even you haven't press key1 again, mode will change// 只有按钮处于按下状态时才能进入这个if语句执行mode取反if( GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0){mode = ~mode;}//四个灯顺序点亮if(mode){GPIO_Write(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_10 );delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 );delay(0x2FFFFF);} //end of second if// 四个灯同时点亮else{GPIO_ResetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10);delay(0x2FFFFF);GPIO_Write(GPIOB, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 );delay(0x2FFFFF);} //end of else } //end of while
} //end of main
嵌入式系统实验——【玄武F103开发板】顺序点亮4小灯和4小灯全亮两种点亮模式、并使用KEY1控制切换点亮模式相关推荐
- 《嵌入式系统 – 玩转ART-Pi开发板(基于RT-Thread系统)》第7章 环境监测系统(一)
原文地址 开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5.30 RT-Thread Studio版本:2.0.1 开发板MCU:STM32H750XB ...
- 《嵌入式系统 – 玩转ART-Pi开发板(基于RT-Thread系统)》第9章 基于Select/Poll实现并发服务器(二)
基于Select/Poll实现并发服务器(一) 9.3 Select/Poll概述 在LWIP中,如果要实现并发服务器,可以基于Sequentaial API来实现,这种方式需要使用多线程,也就是为每 ...
- 嵌入式系统实验——【玄武F103开发板】按key1熄灭两个LED灯、松开恢复点亮
这里写目录标题 一.任务目标 (一)分析 二.设计思路 (一)开启`KEY1`对应的`GPIOx`时钟 1.找到`KEY1(PE3)`所在的`GPIOx`端口 2.开启`GPIOE`端口时钟 3.清空 ...
- 北邮嵌入式linux开发,北邮嵌入式系统实验报告完整版
北邮嵌入式系统实验报告完整版 北京邮电大学 嵌入式系统实验 实验报告 学院:电子工程学院 专业:电子信息科学与技术 班级:班 学号: 姓名: 2013年11月13日 一.实验目的 1.基本实验 搭建P ...
- SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)
SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板) 前言 RTOS简述及开发困难所在 开发环境 详细的解决方案 SSI初加载 基础的动态操作 伪 ...
- Linux嵌入式系统开发之Led开发——应用篇(一)
与Linux嵌入式系统开发之Led开发--驱动篇(一),对于的应用篇 看看咱们的开发板,有四个led灯,对吧,这次就是向办法用程序来点亮它,请看下边的代码: #include <stdlib.h ...
- 哥哥教你学嵌入式 之 智芯科技 开发板 Z20K11x系列 教程(一)
哥哥教你学嵌入式 之 智芯科技 开发板 Z20K11x系列 教程(一) 文章日志 1.写于2022/11/25(网上这块板子的教程几乎没有,呜呜呜,只得自己写了) 文章目录 1.认识开发板 2.串口相 ...
- tiny4412安装Linux系统,FriendlyARM Tiny 4412开发板烧写Linux系统步骤
一.制做用于安装系统的SD卡 通常Tiny4412出厂时已经安装好Android4.2.2系统,之后要从新烧写系统,则须要SD卡来烧写系统,不管是经过USB烧写,仍是SD卡脱机烧写,都须要使用SD卡启 ...
- 学嵌入式,一定要买开发板吗?
经常有同学:我想学嵌入式,应该买哪个板子? 这个问题本身就是错的. 如果你去问10个买过开发板的人,至少有8个最终都吃灰了,而且他也没通过这个板子以及板子附带的所谓"教程"真的学会 ...
最新文章
- 目录:SpringBoot学习目录
- hibernate h2变mysql_懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)...
- python如何定义类_Python中类的定义、继承及使用对象实例详解
- 【Util】 时间天数增加,时间比较。
- 华为杯数学建模优秀论文_【优秀论文】2019数维杯国际大学生数学建模竞赛B题优秀论文...
- java断点续传 http_http断点续传简单实现(java)
- SAP ABAP 打印(smartforms方式)
- 副法线和正切是什么?
- 中国节能吊扇行业市场供需与战略研究报告
- 华为SecoClient报错[SVN Adapter V1.0感叹号]“接受返回码超时”
- 2019新版c智播客h马程序员H5全栈工程师培训项目实战
- 腾讯地图SDK公交路线规划Demo
- 取消Editplus的自动备份
- 统计学(网易云可汗学院公开课笔记)
- 2021年山东省职业院校技能大赛中职组“网络安全”赛项规程
- 从零开始设计RISC-V处理器——五级流水线之数据通路的设计
- 户型平面原型设计-简介
- npm install报错解决fatal: Unable to look up github.com (port 9418) npm ERR! exited with error code: 128
- welsh-powell
- 遗传算法求解TSP问题(python版)