gpio控制led实验报告(19篇)gpio控制led实验报告 3.实验环境WindouwslOKeiluVision5 课程实验报告 学院:___________________专业:___下面是小编为大家整理的gpio控制led实验报告(19篇),供大家参考。
篇一:gpio控制led实验报告
3.实验环境WindouwslOKeiluVision5
课程实验报告
学院:___________________专业:______________2018年10月18日
姓名
学号
班级
指导老师
课程名称嵌入式系统原理与应用实验
成
实验名称GPIO输出-流水灯
绩
1.实验目的
通过一个经典的跑马灯程序,了解STM32F1的10口作为输出使用的方法。
通过代码控制开发板上的4个LED灯交替闪烁,实现类似跑马灯的效果。
2.实验内容
工程文件建立、程序的调试,编译、jlink驱动的安装与配置、程序下载、实验结果验证。
4.实验方法和步骤(含设计)
上。
(1)实验硬件连接图
四个led灯如图连接到GPIO的6~9引脚
(2)软件分析
使用到的GPIO端口需配置为输出模式,推挽(PP)模式输出,I0口速度为50MHz(3)实验步骤
①建立工程文件:导入程序运行需要的库,加入主程序,调试运行环境,使程序可以成功被编译和运行且没有错误和警告。②安装JLINK驱动程序,点击下载按钮将程序烧写进开发板中。③检查led灯是否逐一顺序点亮,能够通过调整程序使点亮顺序改变。
(4)原函数
1itinclude"led.h"
2B/*
3
(1)紺始牝GFIOC的
口
4(2)定义延时蓟数
s—
6voidLEDInit(void)
70(
8
GPIOInitTypeDefGPIOInitStructurp;
9
RCC_APB2PeriphC1ockCmd(RCC_APB2Periph_GPIOC,EWWLEJi使隘P匚正时禅
IS
GPI0_ln1tStrutturt.GFI0_Pin-GPI0_Pin_&\GPI0_Pin_7^GPI0_Pin_fl[GP10_Pin_9;"PC飞濟口配匡
11
GPIOIni
稚冃辎出
12
GPZ0Initstrueture.GPIC^Speed-GPIO_Speed_56*Xz;//IO□谨复为50rKz
13
GPIOInittGPIOCj&GFIO_InitStructure),/7*訂始比GPIOC.6
14
5PIO_SetBits(6PIOC,6PIO_Pin_5|6PIO_Pir_7|5PIO_Pin_a[GPIO_Pin_9)J//PC,6騒岀高
15|}
16=
17voidDelay(u32count)
18El{
19
u32i-0;
29^or(;i<count;!++);
21?22|
6.实验分析与体会
如果4个LED灯是与A口的PA1、PA2、PA3、PA4相连,将led.c文件中的GPIOC”
2intnain(void){LED_Init()j
(GPIO_ReietBiti(GPIOCJGPIO_Pirt„&)>GPlOSeteitstQPtOC^GPlOPin7|GPIOFin8|GF10_Pin9)^
GPZ0_Fle5etBit5(GPLCC,GPIO_Pin_7),
GPIOSetBitstGPlOC^GPICPin_6|GPlGPinS|GPIOPin
(5PIO_ResetBits(GPIOC,6PIO_Pin_a};
GPIOSetBitsfGPIOC,GPIO_Pin_5|GPI0_Pin_7|GPI0_Pin_9),Delay(IDCtW);&PIO_Ft«etBlts(GPIOC,GPIQ_Pir_9);
GPIO_SetBits(5PItX,GPIO_Pir_51GPXC_Pin_7|GPIOPin_8),Delay{
改为GPIOA:并将Pin_X改为对应的1~4脚。
5.程序及测试结果
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO」nitStructure.GPIO_Pin二GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9
BuildOutput
ProgramSize:Code-156^RO-date™336RW*deta-^2Zl-data-lSSSFroirELF:creating
hexfile,,.
"*AOBJ\LED*axfH-0Error(a)f0Warning(s).
3uildTir,eElapsed:
00:00:04
J
GPIO」nit(GPIOC,&GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO」nitStructure.GPIO_Pin二GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4
J
GPIO_lnit(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
成绩评定
实验日期:2018年10月18日
教师签名:
WelcomeToDownload!!!
欢迎您的下载,资料仅供参考!
篇二:gpio控制led实验报告
将计算机并口与easyjtagh仿真器相连然后再将easyjtagh仿真器的jtag接口连接到easyarm2103目标板上打开hjtag检测到芯片内核信息后选择autodownload选项此时会自动启动hflasher软件选择目标芯片的型号将当前的配置信息保存起来建议将配置信息保存到安装路径下的hconfig文件夹内
实验一LED灯显示实验一.实验目的
1.熟悉arm开发板基本组成电路,并通过配套教材熟悉arm芯片特性。了解ADS1.2软件使用,并会用该软件编译调试开发板。
2.了解H—JTAG软件原理,利用教材中提供的LED测试程序,完成实验。二.实验器材
PC机一台,周立功开发板一块
注意:对LPC2103管脚的寄存器进行配置时,应该对照芯片说明手册,按照索引,找到相关寄存器,对其进行配置。
三.实验原理EasyARM2103开发板提供了4个绿色发光二极管用作显示,电路如图1.1所
示。显示电路采用了灌电流的方式来驱动发光二极管,由于微控制器LPC2103I/O口提供的灌电流大于其拉电流,采用此驱动方式可以保证二极管发光的亮度。
1.1Led电路原理四.实验内容及步骤
1.下面以GPIO的测试程序为例,熟悉EasyJTAG-H软件的使用方法,程序功能设计为控制单路LED闪烁,硬件电路如图1.1所示。
2.打开示例工程。示例工程路径:配套光盘内容->光盘内容v1.00->3.EasyARM2103安装手册->GPIOTest,将此文件夹复制到其它目录下打开,要求存放目录必须无中文路径,如图5.13所示。打开文件夹后,
建议用户先删掉“GPIO_Test_Data”文件夹,然后双击打开“GPIOTest.mcp”文件,即打开示例工程。
3.点击“user”文件夹,打开main.c文件,见到示例代码4.选择低速GPIO,控制LED灯闪烁,示例程序如程序清单所示。此示例操
作需要短接JP4的P0.17,输出控制LED1。5.编译连接工程。项目目标栏处选择DebugInFlash模式,然后编译连接工程。如图所示为工程窗口中的DebugRelSettings…工程设置,如地址设置、输出文件设置、编译选项等,SynchronizeModificatinte同步修改日期,检查工程中每个文件的修改日期,若(如使用其辑源文件),则在h栏标记“√”
Linker生成的Image一般包括三个区域:代码段、数据段和BSS段。需要通
过Linker设置这三个段的基址。通常BSS段是紧接着数据段(RW)之后,因此
只要设置代码段(RO)和数据段(RW)的基址就可以了。根据芯片资
料中提
供的器件映射地址来填写。
6.仿真调试。将计算机并口与EasyJTAG-H仿真器相连,然后再将EasyJTAG-H仿真器的JTAG接口连接到EasyARM2103目标板上,打开H-JTAG,检测到芯片内核信息后,选择AutoDownload选项,此时会自动启动H-Flasher软件,选择目标芯片的型号,将当前的配置信息保存起来,建议将配置信息保存到安装路径下的Hconfig文件夹内。
7.Make(快捷键为F7);启动AXD进行调试Run启动AXD进行调试,并直接利用ProjectInspector工程检查,查看和配置工程中源文件的,发现有更新它编辑器编Touch;编译连接
7.设置完成后,关闭H-JTAGServer和H-Flasher(注意:不能使用Exit项关
闭)。启动AXD,打开【Options】->【ConfigureTarget...】,弹出ChooseTarget窗口,点击“ADD”添加仿真器的驱动程序,在添加文件
窗口选择如D:\ProgramFiles\H-JTAG目录下的H-JTAG.dll,点击“打开”即可。8.在AXD环境点击运行,即可看到led亮。
AXD运行调试工具条如图3.14所示,调试观察窗口工具条如图3.15所示,文件操作工具条如图所示。
运行调试工具条提高部分:改变led显示位置,重新编译链接,使led灯亮。
源代码如下:#include"config.h"
#defineLED11<<17
/*P0.17控制LED1
*/
/**************************************************************
*******************************************
**Functionname:
DelayNS
**Descriptions:
延时函数
**inputparameters:uiDly值越大,延时时间越长
**outputparameters:无
**Returnedvalue:
无
**************************************************************
*******************************************/
voidDelayNS(uint32uiDly)
{
uint32i;
for(;uiDly>0;uiDly--){for(i=0;i<50000;i++);
}}
/**************************************************************
*******************************************
**Functionname:
main
**Descriptions:
跳线JP4短接,LED1闪烁
**inputparameters:无
**outputparameters:无
**Returnedvalue:
无
**************************************************************
*******************************************/
intmain(void)
{
PINSEL1=PINSEL1&(~(0x03<<2));
/*将P0.17设置为GPIO
*/
IO0DIR=LED1;
/*设置LED控制口为输出
*/
IO0SET=LED1;
/*LED1熄灭
*/
while(1){
IO0SET=LED1;
/*LED1熄灭
*/
DelayNS(50);
/*延时
*/
IO0CLR=LED1;
/*LED1点亮
*/
DelayNS(50);
/*延时
*/
}
return0;
}
/**************************************************************
*******************************************
**
EndOfFile
**************************************************************
********************************************/
附加:编写程序实现四个LED灯循环闪烁的功能。
篇三:gpio控制led实验报告
入实验
实验四GPIO输
欧阳光明(2021.03.07)实验目的1、能够使用GPIO的输入模式读取幵关信号。2、掌握GPIO相关寄存器的用法和设置。3、掌握用C语言编写程序控制GPIOo二.实验环境PC机一台
ADS1.2集成开发环境一套EasyARM2131教学实验平台一套三.实验内容1•实验通过跳线JP8连接KEY1与P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。(调通实验后,改为KEY3键进行输入)。2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键没有输入。(键输入改为键KEY4,发光管改为LED6)o
3.结合实验三,当按下按键Keyl时,启动跑马灯程序并控制蜂鸣器
响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键再次按下。四.实验原理
当P0□用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图参见图4.2。
进行GPIO输入实验时,先要设置IODIR使接□线成为输入方式,然后读取IOPIN的值即可。
图4.2按键电路原理图实验通过跳线JP8连接KEY1.P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松幵后停止蜂鸣。在这个实验中,需要将按键KEY1输入口P0.16设为输入□而蜂鸣器控制口P0.7设置为输出口。蜂鸣器电路如图4.3所示,当跳线JP6连接蜂鸣器时,P0.7控制蜂鸣器,低电平时蜂鸣器鸣叫。LED灯电路如图4.4所示,低电平时灯亮。
图4.3蜂鸣器控制电路图4.4LED控制电路程序首先设置管脚连接寄存器PINSEL0和PINSEL1,设置P0.16为输入设置P0.7,P1.21为输出。然后检测端口卩0.16的电平,对P0.7,P1.21进行相应的控制,流程图如图4.5所示,实现程序见程序清单4.1。
图4.5按键输入实验流程图五、实验步骤.源代码及调试结果
内容1实验步骤
①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_keyo
②在user组里编写主程序代码main.c。③选用DebuglnFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所加:⑦单击ContextVariable图标按钮(或者选择Processor
Views->Variables)打开变量观察窗口,通过此窗□可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。通过变量窗□可以观察变量BEEP、KEY1等的值和ARM7微控制
器的片内外寄存器窗口。如下图所示:⑧可以单步运行程序,先按下Keyl,观察IOOPIN寄存器的值,
然后断开Keyl,观察IOOPIN寄存器的值。可以设置/取消断点;或者
*欧阳光明*创编
全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制
是否正确。如下图所示:
图4.6未按下Keyl时IOOPIN的值的值
图4.7按下Keyl时IOOPIN
由上两图可知,当按下Keyl时,IOOPIN寄存器的第16位由1变为0(F变为E),keyl与P0.16相连,按下Keyl时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是正确的。现象描述:按下KEY1,蜂鸣器鸣叫,松幵后停止蜂鸣。
源代码:
#include"config.h"constuint32BEEP=1«7;//P0.7控制蜂鸣器
constuint32KEY1=1«16;//P0」6连接KEY1(改为KEY3时,只需“constuint32KEY1=1«16”改为“const
uint32KEY3=1«18w,其余不变。)
/
■士■士
%•丄■■士
■士
%J”•士■士
■丄"■士
J.■士■士
•土
f
彳・
彳、哼.
■士■土
*1*
•土%L*
*1*
#7^#1%#T*
#Tv
#Tv
**函数名称:main()
糾函数功能:GPIO输入实验测试。
糾检测按键KEY1OKEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。糾跳线说明:把JP8的KEY1跳线短接,JP11连接蜂鸣器。
•士
•["■士■士■士•士■]"%■士■士
■["%•士•士■]"%■士■士
叫・
■]"■丄.•["■士■土
#r^彳.彳.
■]"•士
#Tv
■[“■]“•土•土%f>%■士■”•士■士
■”■士
#r%#r%
■]“•”•士■士!
V#v^>
intmain(void)
{PINSEL0=0x00000000;//所有管脚连接GPIOPINSEL1=0x00000000;IOODIR=BEEP;//蜂鸣器控制□输出,其余输入while(1){if((IOOPIN&KEY1)==0)IOOCLR=BEEP;//如果KEY1按下,蜂鸣器鸣叫elseIOOSET=BEEP;//松幵则停止蜂鸣
篇四:gpio控制led实验报告
课程实验报告
学院:姓名班级
专业:学号指导老师
2018年10月18日
课程名称嵌入式系统原理与应用实验
成
实验名称GPIO输出-流水灯
绩
1.实验目的
通过一个经典的跑马灯程序,了解STM32F1的IO口作为输出使用的方
法。通过代码控制开发板上的4个LED灯交替闪烁,实现类似跑马灯的效果。
2.实验内容
工程文件建立、程序的调试,编译、jlink驱动的安装与配置、程序下载、实验结果验证。
4.实验方法和步骤(含设计)(1)实验硬件连接图
四个led灯如图连接到GPIO的6~9引脚上。
(2)软件分析使用到的GPIO端口需配置为输出模式,使用推挽(PP)模式输出,IO口
速度为50MHz。(3)实验步骤
①建立工程文件:导入程序运行需要的库,加入主程序,调试运行环境,使程序可以成功被编译和运行且没有错误和警告。
②安装JLINK驱动程序,点击下载按钮将程序烧写进开发板中。③检查led灯是否逐一顺序点亮,能够通过调整程序使点亮顺序改变。(4)原函数
3.实验环境Windouws10KeiluVision5
5.程序及测试结果
6.实验分析与体会
如果4个LED灯是与A口的PA1、PA2、PA3、PA4相连,将led.c文件中的“GPIOC”改为“GPIOA”,并将Pin_X改为对应的1~4脚。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
成绩评定
实验日期:2018年10月18日
教师签名:年月日
篇五:gpio控制led实验报告
实验四:GPIO输出控制实验
一、实验目的1.掌握LPC21XX专用工程模板的使用;2.掌握EasyJTAG仿真器的安装和使用;3.能够在EasyARM21XX开发板上运行第一个程序(无操作系统);4.熟悉LPC2000系列ARM7微控制器的GPIO控制。二、实验设备硬件:PC机一台、EasyARM2103开发板一套软件:Windows98/XP/2000系统,ADS1.2集成开发环境三、实验内容
控制EasyARM2103开发板上的LED闪烁形成流水灯效果。四、实验预习要求
仔细阅读《EasyARM2103》手册第4章的内容,熟悉GIPO的设置。仔细阅读《EasyARM2103》第2章的内容,了解EasyARM2103开发板的硬件结构,注意LED灯的相关控制电路。仔细阅读《EasyARM2103》第3章的内容,了解ADS1.2集成开发环境、LPC2200专用工程模板、EasyJTAG仿真器的应用。五、实验原理如何在EasyARM2103上运行第一个程序。安装ADS1.2(PC)了解ADS1.2(PC)连接EasyJTAG仿真器和EasyARM2103开发板(硬件)安装EasyJTAG驱动程序(PC)添加工程模板(PC)用工程模板建立第一个工程(PC)仿真调试第一个工程(PC+硬件)说明:(PC)----------------属于在PC机上操作,即软件的操作(硬件)--------------属于开发板硬件操作(PC+硬件)--------属于在PC机上进行软件操作,硬件上要连接或跳线操作六、实验步骤1.连接EasyJTAG仿真器和EasyARM2103开发板,然后安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略)。2.为ADS1.2增加LPC2103专用工程模板(若已增加过,此步省略)。3.启动ADS1.2,使用ARMExecutableImageforlpc2103工程模板建立一个工程BeepCon_C。4.建立C源文件BeepCon.c,编写实验程序,然后添加到工程的user组中。5.选用DebugInRAM生成目标,如图3.9所示,然后编译连接工程。
图3.9选择生成目标
6.将EasyARM2103开发板上的JP4跳线短接。
7.选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
8.全速运行程序,程序将会在beepcon.c的主函数中停止(因为main函数起始处默认设置
有断点)。
9.单击ContextVariable图标按钮(或者选择【ProcessorViews】->【Variables】)打开变量观
察窗口,通过此窗口可以观察局部变量和全局变量。选择【SystemViews】->【Debugger
Internals】即可打开LPC2100系列ARM7微控制器的片内外设寄存器窗口。
10.可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,观察变量
的值,判断LED控制是否正确。
11.实验结束后,在AXD中设置仿真器为片外RAM调试方式的设置,以便于后面实
验的正确操作。、
12.更改程序实现流水等的功能,一秒亮一盏灯,从左向右,一直循环。
七、实验参考程序
选择低速GPIO,控制LED灯闪烁,示例程序如程序清单4.1所示。此示例操作需要短接
JP4的P0.17,输出控制LED1。
程序清单4.1GPIO控制LED闪烁
#include"config.h"#defineLED11<<17
/*P0.17控制LED1
*/
/****************************************************************************
**函数名称:DelayNS
**功能描述:延时函数
**入口参数:uiDly值越大,延时时间越长
**出口参数:无
****************************************************************************/
voidDelayNS(uint32uiDly)
{
uint32i;
for(;uiDly>0;uiDly--){
for(i=0;i<50000;i++);
}
/***************************************************************************/
**函数名称:main
**功能描述:跳线JP4短接,LED1闪烁
**入口参数:无
**出口参数:无
****************************************************************************/
intmain(void)
{
PINSEL1=PINSEL1&(~(0x03<<2));
/*将P0.17设置为GPIO*/
IO0DIR=LED1;
/*设置LED控制口为输出*/
IO0SET=LED1;
/*LED1熄灭
*/
while(1){
IO0SET=LED1;
/*LED1熄灭
*/
DelayNS(50);
/*延时
*/
IO0CLR=LED1;
/*LED1点亮
*/
DelayNS(50);
/*延时
*/
}
return0;
}
3.4.8思考
为什么这个实验的工程不需要设置连接地址?(提示:LPC2200专用工程模板已集成了起
动代码、编译选项和连接地址设置等等)
在实验参考程序中,如何控制蜂鸣器报警的速度?
在LPC2000系列ARM7微控制器中,有哪两个管脚作GPIO输出时需要外接上拉电阻?
篇六:gpio控制led实验报告
DSP实验应用GPIO控制
实验一gpio控制一、实验1程序功能的基本原理:通过对gpio的设置来实现对实验板上led(3d0)的亮灭的控制具体可分为对dpll和gpio的控制.(1)时钟电路a)c5509的时钟电路由一个DPLL和一个时钟模式寄存器clkmd组成b)在clkmd的控制下,dpll对外部输入时钟进行分频、倍频和锁相,为cpu及外设提供工作时钟clkinpindpllclkoutpinclkmdclkmdpin(2)时钟模式寄存器clkmd相关控制词的含义:iai:退出省电状态后如何进行跟踪,是继续省电状态之前的设定还是重新进行整个跟踪锁定IOB:失锁时时钟电路的动作,是继续输出时钟信号还是切换到旁路模式pllmult:锁定模式下的倍频次数plldiv:锁定模式下的分频次数(3)Gpio-c5509由八个独立的可编程Gpio引脚(IO0~io7)组成——每个Gpio引脚的方向控制(输入或输出)由方向寄存器IOIR设置-各个gpio管脚上的输入/输出电平由寄存器iodata控制2.芯片支持库(1)DSP芯片上外围设备的类型和应用越来越复杂(2)提供一组标准的方法(apis:函数、数据类型、宏)用于配置、控制和管理dsp片上外设(3)用户无需编写配置和控制芯片外围设备所需的定义和代码。(4)大多数CSL库函数都是用C语言编写的,代码的大小和速度都得到了优化(5)csl库是可裁剪的:即只有被使用的csl模块才会包含进应用程序中(6)CSL库是可扩展的:每个片上外围设备的API彼此独立。添加新的API对其他片上外围设备没有影响二.实验所用到的硬件资源和在片外围电路硬件资源
CPU、led、蜂鸣器、电阻器、电容器等片上外围电路时钟发生器、通用输入/输出口等三.参数设置CPU时钟:pllmultiplyvalue=24;plldividevalue=1;clkout=pllmult/(plldiv+1)*clkin=24/2*12m=144mhz小灯亮或灭的时间:n*13*16*65536/(144*10^6)=1.1s(n为指令周期)四.实验流程图五、项目#包括#包括#includevoiddelay();/*锁相环的设置*/pll_uu配置MyConfig={
0,//iai:theplllocksusingthesameprocessthatwasunderway//beforetheidlemodewasentered1,//iob:ifthepllindicatesabreakinthephaselock,
//其开关关闭旁路模式并启动锁相//sequence24,//pllmultiplyvalue;24倍1//divideby2plldividevalue;itcanbeeitherplldividevalue//(当PLILISEnabled)或YPassModeDivideValue//(PLLINBYPASSMode,如果PLLmultiplyValuesSetTo1)};main(){/*初始化csl库*/csl_uinit();/*设置系统的运行速度为144mhz*/pll_uuConfig(&myconfig);/*将方向确定为输出*//ioportunsignedint*iodir//iodir=(unsignedint*)0x3400;//ioportunsignedint*iodata;//iodata=(unsignedint*)0x3401;//*clkmd=0x21f3;//晶振12hz,9hz=0x21f3;//144mhz=0x2613gpio_rset(iodir,0xff);while(1){gpio_rset(iodata,0x0c0);延迟();gpio_rset(iodata,0x000);delay();
}}voiddelay(){uint32j=0,k=0;对于(j=0;j<0xc0;j++){for(k=0;k<0xffff;k++)}}{}
篇七:gpio控制led实验报告
选项新建四个组分别命名为startupuserfwlibcmsis和docstartup从名字就可以看得出我们是用它来放我们的启动代码的user用来存放用户自定义的应用程序fwlib用来存放库文件cmsis用来存放m3系列单片机通用的文件doc用来存放程序的相关说明文档
实验一、使用stm32f10x单片机点亮核心板上的led
电路原理
电路的基本原理:使用核心板上的PB口6-9引脚分别点亮L1~L4四个发光二极管。
实验需要解决的关键问题:
1、使用KeilMDK软件设计的模板问题;2、STM32处理器GPIO(通用输入/输出接口)的配置问题;3、系统及片上外设的时钟配置问题。
解决第一个问题:使用KeilMDK软件设计的模板问题;
在新建工程模板之前,首先需要获取到st库的源码,源码可从st的官方网站下载到。在STM32-Template文件夹下,我们新建六个文件夹,分别为Libraries、CMSIS、Output、Listing、Doc和Project。USER用来存放工程文件和用户代码,包括主函数main.c,用户文件及其头文件(*.H)。Libraries中包含两个folder,oneisFWlibandtheotherisCMSIS.FWlib用来存放STM32库里面的inc和src这两个文件,这两个文件包含了芯片上的所有驱动。CMSIS用来存放库为我们自带的启动文件和一些M3系列通用的文件。CMSIS里面存放的文件适合任何M3内核的单片机。CMSIS的缩写为:CortexMicrocontrollerSoftwareInterfaceStandard,是ARMCortex微控制器软件接口标准,是ARM公司为芯片厂商提供的一套通用的且独立于芯片厂商的处理器软件接口。Output用来保存软件编译后输出的文件,Listing用来存放一些编译过程中产生的文件,具体可不用
1
了解。Project用来存放MDK工程文件。Doc用来保存该文件的说明文档。FWlib:\3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver的inc
跟src这两个文件夹拷贝到STM32-Template\FWlib文件夹中。USER:\3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的
main.c(主函数或测试函数)、stm32f10x_conf.h、stm32f10x_it.h、stm32f10x_it.c、system_stm32f10x.c拷贝到STM32-Template\USER目录下。stm32f10x_it.h、和stm32f10x_it.c这两个文件里面是中断函数,里面为空,并没有写任何的中断服务程序。stm32f10x_conf.h是用户需要配置的头文件,当我们需要用到芯片中的某部分外设的驱动时,我们只需要在该文件下将该驱动的头文件包含进来即可,片上外设的驱动在src文件夹中,inc文件夹里面是它们的头文件。这三个文件是用户在编程时需要修改的文件,其他库文件一般不需要修改。system_stm32f10x.c:ARM提供的符合CMSIS标准的库文件,主要用来设置系统时钟和总线时钟。系统时钟设置还需要用到锁相环PLL,这就要用到操作寄存器,而寄存器都是以存储器映射的方式访问,所以在system_stm32f10x.c文件中应包含stm32f10x.h文件。
\3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm的全部文件拷贝到STM32-Template\CMSIS\startup(需先在CMSIS新建好startup文件夹)文件夹下。这些是用汇编写的启动文件。
\3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport的core_cm3.c和core_cm3.h也拷贝到STM32-Template\CMSIS文件夹下。
\3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h拷贝到STM32-Template\CMSIS文件夹下。
此时我们新进的工程目录如下所示
在STM32-DEMO(或工程名)上右键选中AddGroup…选项,新建四个组,分别命名为STARTUP、
2
USER、FWlib、CMSIS和DOC。STARTUP从名字就可以看得出我们是用它来放我们的启动代码的,USER用来存放用户自定义的应用程序,FWlib用来存放库文件,CMSIS用来存放M3系列单片机通用的文件,DOC用来存放程序的相关说明文档。
接下来我们往我们这些新建的组中添加文件,双击哪个组就可以往哪个组里面添加文件。我们在STARTUP里面添加startup_stm32f10x_hd.s,在USER组里面添加main.c和stm32f10x_it.c这两个文件,在FWlib组里面添加src里面的全部驱动文件,当然,src里面的驱动文件也可以需要哪个就添加哪个。这里将它们全部添加进去是为了后续开发的方便,况且我们可以通过配置stm32f10x_conf.h这个头文件来选择性添加,只有在stm32f10x_conf.h文件中配置的文件才会被编译。在CMSIS里面添加core_cm3.c和system_stm32f10x.c文件。注意,这些组里面添加的都是汇编文件跟C文件,头文件是不需要添加的。最终效果如下图:
3
解决第二个问题:STM32处理器GPIO(通用输入/输出接口)的配置问题;
作为大家的第一个STM32例程,很有必要进行足够深入的分析,才能从根本上扫清对使用库函数的困惑。而且,只要利用这个LED例程,真正领会了库开发的流程以及原理,再进行其它外设的开发就变得简单一些了。
所以,本部分的任务是:从STM32库的实现原理上解答:库到底是什么?、为什么要用库?、用库与直接配置寄存器的
区别等问题。让我们具体了解利用库的开发流程,熟悉库函数的结构,达到举一反三的效果。
2.1STM32的GPIO
想要控制LED灯,当然是通过控制STM32芯片的I/O引脚电平的高低来实现。在STM32芯片上,I/O引脚可以被软件设置成各种不同的功能(具体说明见下节Polling按键,这节课),如输入或输出,
所以被称为GPIO(General-purposeI/O)。而GPIO引脚又被分为GPIOA、GPIOB,…,GPIOG不同的组,
每组端口分为0~15,共16个不同的引脚,对于不同型号的芯片,端口的组和引脚的数量不同,具体请参考相应芯片型号的datasheet。
于是,控制LED的步骤就自然整理出来了:1.GPIO端口引脚多-->就要选定需要控制的特定引脚;2.GPIO功能如此丰富-->配置需要的特定功能;3.控制LED的亮和灭-->设置GPIO输出电平的高低。继续思考,要控制GPIO端口,就要涉及到控制相关的寄存器。这时我们就要查一查与GPIO相关的寄存器了,可以通过《STM32F103XXX参考手册》来查看,见下图
图中的7个寄存器,相应的功能在文档上有详细的说明。可以分为以下4类,其功能简要概括如下:1.配置寄存器:选定GPIO的特定功能,最基本的如:选择作为输入还是输出端口。2.数据寄存器:保存了GPIO的输入电平或将要输出的电平。
4
3.位控制寄存器:设置某引脚的数据为1或0,控制输出的电平。4.锁定寄存器:设置某锁定引脚后,就不能修改其配置。注:要想知道其功能严谨、详细的描述,请养成习惯在正式使用时,以官方的datasheet为准,在这里只是简单地概括其功能进行说明。关于寄存器名称上标号x的意义,如:GPIOx_CRL、GPIOx_CRH,这个x的取值可以为图中括号内的值(A,…,G),表示这些寄存器也跟GPIO一样,也是分组的。也就是说,对于端口GPIOA和GPIOB,它们都有互不相干的一组寄存器,如控制GPIOA的寄存器名为GPIOA_CRL、GPIOA_CRH等,而控制GPIOB的则是不同的、被命名为GPIOB_CRL、GPIOB_CRH等寄存器。
从这个图我们可以知道STM32的功能,实际上也是通过配置寄存器来实现的(但又和直接配置寄存器有区别,一个是直接访问,一个为使用库函数访问)。
2.2STM32的地址映射
温故而知新——stm32f10x.h文件。首先请大家回顾一下在51单片机上点亮LED是怎样实现的。这太简单了,几行代码就搞定。###########################################1.#include<reg52.h>2.intmain(void)3.{4.P0=0;5.while(1);6.}#########################################以上代码就可以点亮P0端口与LED阴极相连的LED灯了,当然,这里省略了启动代码。为什么
5
这个P0=0;句子就能控制P0端口为低电平?很多刚入门51单片机的同学还真解释不来,关键之处在于这个代码所包含的头文件<reg52.h>。
在这个文件下有以下的定义:
这些定义被称为地址映射。所谓地址映射,就是将芯片上的存储器甚至I/O等资源与地址建立一一对应的关系。如果某地址对应着某寄存器,我们就可以运用C语言的指针来寻址并修改这个地址上的内容,从而实现修改该寄存器的内容。正是因为<reg52.h>头文件中有了对于各种寄存器和I/O端口的地址映射,我们才可以在51单片机程序中方便地使用P0=0xFF;TMOD=0xFF等赋值句子对寄存器进行配置,从而控制单片机。Cortex-M3的地址映射也是类似的。Cortex-M3有32根地址线,所以它的寻址空间大小为2^32bit=4GB。ARM公司设计时,预先把这4GB的寻址空间大致地分配好了。它把地址从0x40000000至0x5FFFFFFF(512MB)的地址分配给片上外设。通过把片上外设的寄存器映射到这个地址区,就可以简单地以访问内存的方式,访问这些外设的寄存器,从而控制外设的工作。结果,片上外设可以使用C语言来操作。M3存储器映射见下图。stm32f10x.h这个文件中重要的内容就是把STM32的所有寄存器进行地址映射。如同51单片机的<reg52.h>头文件一样,stm32f10x.h像一个大表格,我们在使用的时候就是通过宏定义进行类似查表的操作,大家想象一下没有这个文件的话,我们要怎样访问STM32的寄存器?有什么缺点?不进行这些宏定义的缺点有:1、地址容易写错;2、我们需要查大量的手册来确定哪个地址对应哪个寄存器;3、看起来还不好看,且容易造成编程的错误,效率低,影响开发进度。当然,这些工作都是由ST的固件工程师来完成的,只有设计M3的人才是最了解M3的,才能写出完美的库。
6
在这里我们以外接了LED灯的外设GPIOB为例,在这个文件中有这样的一系列宏定义:
#############################################
#defineGPIOB_BASE
(APB2PERIPH_BASE+0x0C00)
#defineGPIOC_BASE
(APB2PERIPH_BASE+0x1000)
#defineAPB1PERIPH_BASE#defineAPB2PERIPH_BASE#defineAHBPERIPH_BASE
PERIPH_BASE(PERIPH_BASE+0x10000)(PERIPH_BASE+0x20000)
#defineFLASH_BASE
((uint32_t)0x08000000)/*!<FLASHbaseaddressinthealiasregion*/
#defineSRAM_BASE
((uint32_t)0x20000000)/*!<SRAMbaseaddressinthealiasregion*/
#definePERIPH_BASE
((uint32_t)0x40000000)/*!<Peripheralbaseaddressinthealiasregion
*/
############################################################
这几个宏定义是从文件中的几个部分抽离出来的,具体的读者可参考stm32f10x.h源码。
外设基地址
首先看到PERIPH_BASE这个宏,宏展开为0x40000000,并把它强制转换为uint32_t的32
位类型数据,这是因为地STM32的地址是32位的,是不是觉得0x40000000这个地址很熟?是的,
这个是Cortex-M3核分配给片上外设的从0x40000000至0x5FFFFFFF的512MB寻址空间中的第一个
地址,我们把0x40000000称为外设基地址。
总线基地址
7
接下来是宏APB2PERIPH_BASE,宏展开为PERIPH_BASE(外设基地址)加上偏移地址0x10000,即指向的地址为0x40010000。这个APB2PERIPH_BASE宏是什么地址呢?STM32不同的外设是挂载在不同的总线上的,见图5-8。有AHB总线、APB2总线、APB1总线,挂载在这些总线上的外设有特定的地址范围。
其中像GPIO、串口1、ADC及部分定时器是挂载这个被称为APB2的总线上,挂载到APB2总线上的外设地址空间是从0x40010000至地址0x40013FFF。这里的第一个地址,也就是0x40010000,被称为APB2PERIPH_BASE(APB2总线外设的基地址)。
而APB2总线基地址相对于外设基地址的偏移量为0x10000个地址,即为APB2相对外设基地址的偏移地址。见表。
地址范围
总线总线基地址总线基地址相对外设基地址(0x4000000)的偏移量
0x40018000-0x5003FFFFAHB0x400180000x180000x40010000-0x40017FFFAPB20x400100000x100000x40000000-0x4000FFFFAPB10x400000000x00000
由这个表我们可以知道,stm32f10x.h这个文件中必然还有以下的宏:
###########################
#defineAPB1PERIPH_BASE
PERIPH_BASE
因为偏移量为零,所以APB1的地址直接就等于外设基地址。
8
寄存器组基地址
最后到了宏GPIOC_BASE,宏展开为APB2PERIPH_BASE(APB2总线外设的基地址)加上相对APB2总线基地址的偏移量0x1000得到了GPIOC端口的寄存器组的基地址。这个所谓的寄存器组又是什么呢?它包括什么寄存器?
细看stm32f10x.h文件,我们还可以发现以下类似的宏:
#######################################
#defineGPIOA_BASE
(APB2PERIPH_BASE+0x0800)
#defineGPIOB_BASE
(APB2PERIPH_BASE+0x0C00)
#defineGPIOC_BASE
(APB2PERIPH_BASE+0x1000)
#defineGPIOD_BASE
(APB2PERIPH_BASE+0x1400)
#defineGPIOE_BASE
(APB2PERIPH_BASE+0x1800)
#defineGPIOF_BASE
(APB2PERIPH_BASE+0x1C00)
#defineGPIOG_BASE
(APB2PERIPH_BASE+0x2000)
#######################################
2.3STM32库对寄存器的封装
一个陌生的类型GPIO_TypeDef,追踪它的定义,可以在stm32f10x.h文件中找到如下代码:typedefstruct{
__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;
其中__IO也是一个ST库定义的宏,宏定义如下:1.#define__Ovolatile/*!<defines'writeonly'permissions*/2.#define__IOvolatile/*!<defines'read/write'permissions*/volatitle是C语言的一个关键字,有关volatitle的用法可查阅相关的C语言书籍。回到GPIO_TypeDef这段代码,这个代码用typedef关键字声明了名为GPIO_TypeDef的结构体类型,结构体内又定义了7个__IOuint32_t类型的变量。这些变量每个都为32位,也就是每个变量占内存空间4个字节。在c语言中,结构体内变量的存储空间是连续的,也就是说假如我们定义
9
了一个GPIO_TypeDef,这个结构体的首地址(变量CRL的地址)若为0x40011000,那么结构体中第二个变量(CRH)的地址即为0x40011000+0x04,加上的这个0x04,正是代表4个字节地址的偏移量。
细心的读者会发现,这个0x04偏移量,正是GPIOx_CRH寄存器相对于所在寄存器组的偏移地址,见图5-9。同理,GPIO_TypeDef结构体内其它变量的偏移量,也和相应的寄存器偏移地址相符。于是,只要我们匹配了结构体的首地址,就可以确定各寄存器的具体地址了。
有了这些准备,就可以分析本小节的第一段代码了:4.#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)5.#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)6.#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)GPIOA_BASE在上一小节已解析,是一个代表GPIOA组寄存器的基地址。(GPIO_TypeDef*)在这里的作用则是把GPIOA_BASE地址转换为GPIO_TypeDef结构体指针类型。有了这样的宏,以后我们写代码的时候,如果要修改GPIO的寄存器,就可以用以下的方式来实现。代码分析见注释。1.GPIO_TypeDef*GPIOx;//定义一个GPIO_TypeDef型结构体指针GPIOx2.GPIOx=GPIOA;//把指针地址设置为宏GPIOA地址3.GPIOx->CRL=0xffffffff;//通过指针访问并修改GPIOA_CRL寄存器通过类似的方式,我们就可以给具体的寄存器写上适当的参数,控制STM32了。是不是觉得很巧妙?但这只是库开发的皮毛,而且实际上我们并不是这样使用库的,库为我们提供了更简单的开发方式。
10
M3的库可谓尽情绽放了c的魅力,如果你是单片机初学者,c语言初学者,那么请你不要放弃与M3库邂逅的机会。是否选择库,就差你一个闪亮的回眸。
解决第三个问题:系统及片上外设的时钟配置问题;STM32的时钟系统
STM32芯片为了实现低功耗,设计了一个功能完善但却非常复杂的时钟系统。普通的MCU,一般只要配置好GPIO的寄存器,就可以使用了,但STM32还有一个步骤,就是开启外设时钟。
为了正确配置STM32芯片的时钟,首先,从整体上了解STM32的时钟系统(时钟树)
图1时钟树GPIO外设是挂载在APB2总线上的,APB2的时钟是APB2预分频器的输出,而APB2预分频器的
11
时钟来源是AHB预分频器。因此,把APB2预分频器设置为不分频,那么我们就可以得到GPIO外设的时钟也等于HCLK,为72MHz了。
配置系统时钟(目的是为了开启外设时钟为GPIO提供时钟信号)
调用了GPIO_Init()函数之后,对GPIO的初始化也就基本完成了,那还缺少什么呢?就是在前面强调过的必须要开启外设时钟,在开启外设时钟之前,我们首先要配置好系统时钟SYSCLK,0小节提到,为配置SYSCLK,要设置一系列的时钟来源、倍频、分频等控制参数。这些工作由SystemInit()库函数完成。
启动文件及SystemInit()函数分析
在startup_stm32f10x_hd.s启动文件中,有如下一段启动代码:
************************************
Reset_HandlerPROCEXPORTReset_Handler
[WEAK]
IMPORT__main
IMPORTSystemInit
LDRR0,=SystemInit
BLXR0
LDRR0,=__main
BX
R0
ENDP
************************************
当芯片被复位(包括上电复位)的时候,将开始运行这一段代码,运行过程为先调用了SystemInit()
函数,再进入c语言中的main函数执行。
进入main函数之前调用了一个名为SystemInit()的函数。这个函数的定义在
system_stm32f10x.c文件之中。它的作用是设置系统时钟SYSCLK。函数的执行流程是先将与配置
时钟相关的寄存器都复位为默认值,复位寄存器后,调用了另外一个函数SetSysClock()。
******************************************************voidSystemInit(void)
{
/*ResettheRCCclockconfigurationtothedefaultresetstate(fordebugpurpose)*/
/*SetHSIONbit*/
RCC->CR|=(uint32_t)0x00000001;…………
SetSysClock();…………
}******************************************************
12
SetSysClock()代码如下:
********************************************staticvoidSetSysClock(void){#ifdefSYSCLK_FREQ_HSE
SetSysClockToHSE();#elifdefinedSYSCLK_FREQ_24MHz
SetSysClockTo24();#elifdefinedSYSCLK_FREQ_36MHz
SetSysClockTo36();#elifdefinedSYSCLK_FREQ_48MHz
SetSysClockTo48();#elifdefinedSYSCLK_FREQ_56MHz
SetSysClockTo56();
#elifdefinedSYSCLK_FREQ_72MHzSetSysClockTo72();
#endif
/*Ifnoneofthedefineaboveisenabled,theHSIisusedasSystemclocksource(defaultafterreset)*/
}********************************************
从SetSysClock()代码可以知道,它是根据我们设置的条件编译宏来进行不同的时钟配置的。
在system_stm32f10x.c文件的开头,已经默认有了如下的条件编译定义:1.#ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)2./*#defineSYSCLK_FREQ_HSEHSE_VALUE*/3.#defineSYSCLK_FREQ_24MHz240000004.#else5./*#defineSYSCLK_FREQ_HSEHSE_VALUE*/6./*#defineSYSCLK_FREQ_24MHz24000000*/7./*#defineSYSCLK_FREQ_36MHz36000000*/8./*#defineSYSCLK_FREQ_48MHz48000000*/9./*#defineSYSCLK_FREQ_56MHz56000000*/10.#defineSYSCLK_FREQ_72MHz7200000011.#endif
在第10行定义了SYSCLK_FREQ_72MHz条件编译的标识符,所以在SetSysClock()函数中将调用SetSysClockTo72()函数把芯片的系统时钟SYSCLK设置为72MHz当然,前提是输入的外部时钟源HSE的振荡频率要为8MHz。
13
其中的SetSysClockTo72()函数就是最底层的库函数了,那些跟寄存器打交道的活都是由它来完成的,如果大家想知道我们的系统时钟是如何配置成72M的话,可以研究这个函数的源码。但大可不必这样,我们应该抛开传统的直接跟寄存器打交道来学单片机的方法,而是直接用ST的库给我们提供的上层接口,这样会简化我们很多的工作,还能提高我们开发产品的效率,何乐而不为呢?
为了能更清楚系统的时钟设定,第一次我们还是很有必要对其进行研究!!!
***********************************************************************staticvoidSetSysClockTo72(void){
__IOuint32_tStartUpCounter=0,HSEStatus=0;
/*SYSCLK,HCLK,PCLK2andPCLK1configuration---------------------------*//*EnableHSE*/RCC->CR|=((uint32_t)RCC_CR_HSEON);
/*WaittillHSEisreadyandifTimeoutisreachedexit*/do{
HSEStatus=RCC->CR&RCC_CR_HSERDY;StartUpCounter++;}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));
if((RCC->CR&RCC_CR_HSERDY)!=RESET){
HSEStatus=(uint32_t)0x01;}else{
HSEStatus=(uint32_t)0x00;}
if(HSEStatus==(uint32_t)0x01){
/*EnablePrefetchBuffer*/FLASH->ACR|=FLASH_ACR_PRFTBE;
/*Flash2waitstate*/FLASH->ACR&=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_2;
/*HCLK=SYSCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_HPRE_DIV1;
/*PCLK2=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1;
14
/*PCLK1=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV2;
#ifdefSTM32F10X_CL/*ConfigurePLLs------------------------------------------------------*//*PLL2configuration:PLL2CLK=(HSE/5)*8=40MHz*//*PREDIV1configuration:PREDIV1CLK=PLL2/5=8MHz*/
RCC->CFGR2&=(uint32_t)~(RCC_CFGR2_PREDIV2|RCC_CFGR2_PLL2MUL|RCC_CFGR2_PREDIV1|RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2|=(uint32_t)(RCC_CFGR2_PREDIV2_DIV5|RCC_CFGR2_PLL2MUL8|RCC_CFGR2_PREDIV1SRC_PLL2|RCC_CFGR2_PREDIV1_DIV5);
/*EnablePLL2*/RCC->CR|=RCC_CR_PLL2ON;/*WaittillPLL2isready*/while((RCC->CR&RCC_CR_PLL2RDY)==0){}
/*PLLconfiguration:PLLCLK=PREDIV1*9=72MHz*/RCC->CFGR&=(uint32_t)~(RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLSRC|RCC_CFGR_PLLMULL);RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1|RCC_CFGR_PLLSRC_PREDIV1|
RCC_CFGR_PLLMULL9);#else
/*PLLconfiguration:PLLCLK=HSE*9=72MHz*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|
RCC_CFGR_PLLMULL));RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLSRC_HSE|RCC_CFGR_PLLMULL9);/*这条语句将系统的时钟设定为72兆HZ*/#endif/*STM32F10X_CL*/
/*EnablePLL*/RCC->CR|=RCC_CR_PLLON;
/*WaittillPLLisready*/while((RCC->CR&RCC_CR_PLLRDY)==0){}
/*SelectPLLassystemclocksource*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR|=(uint32_t)RCC_CFGR_SW_PLL;
/*WaittillPLLisusedassystemclocksource*/
15
while((RCC->CFGR&(uint32_t)RCC_CFGR_SWS)!=(uint32_t)0x08){}}else{/*IfHSEfailstostart-up,theapplicationwillhavewrongclock
configuration.Usercanaddheresomecodetodealwiththiserror*/}}*********************************************************************
注:有些符号如:RCC_CFGR_PLLSRC、RCC_CFGR_PLLMULL9、RCC_CFGR_HPRE_DIV1等初学可能看不懂,没关系,这些宏定义都包含在stm32f10x.h中,只要学会查找,多试、多看几次,估计也就差不多了!
开启外设时钟
SYSCLK由SystemInit()配置好了,而GPIO所用的时钟PCLK2我们采用默认值,也为72MHz。我们采用默认值可以不修改分频器,但外设时钟默认是处在关闭状态的。所以外设时钟一般会在初始化外设的时候设置为开启(根据设计的产品功耗要求,也可以在使用的时候才打开)。开启和关闭外设时钟也有封装好的库函数RCC_APB2PeriphClockCmd()。
调用的时候需要向它输入两个参数,一个参数为将要控制的,挂载在APB2总线上的外设时钟,第二个参数为选择要开启还是关闭该时钟。
led.c文件中对它的调用:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);就表示将要ENABLE(使能)GPIOC外设时钟。
具体代码实现
有了以上对STM32存储器映像,时钟系统,以及基本的库函数知识,我们就可以分析LED例程的代码了。
实验描述及工程文件清单
实验描述硬件连接
该实验讲解了如何运用ST的库来操作I/O口,使I/O口产生置位(1)和复位(0)信号,从而来控制LED的亮灭。
PB6–LED1、PB7–LED2、PB8–LED3、PB9–LED4
16
用到的库文件用户编写的文件
startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.c
USER/stm32f10x_it.cUSER/led.cUSER/led.hUser/main.c
配置工程环境
LED实验中用到了GPIO和RCC(用于设置外设时钟)这两个片上外设,所以在操作I/O之前我们需要把关于这两个外设的库文件添加到工程模板之中。它们分别为stm32f10x_gpio.c和stm32f10x_rcc.c文件。其中stm32f10x_gpio.c用于操作I/O,而stm32f10x_rcc.c用于配置系统时钟和外设时钟,由于每个外设都要配置时钟,所以它是每个外设都需要用到的库文件。
在添加完这两个库文件之后立即编译的话会出错,因为每个外设库对应于一个stm32f10x_xxx.c文件的同时还对应着一个stm32f10x_xxx.h头文件,头文件包含了相应外设的c语言函数实现的声明,只有我们把相应的头文件也包含进工程才能够使用这些外设库。在库中有一个专门的文件stm32f10x_conf.h来管理所有库的头文件,stm32f10x_conf.h源码如下:
编写用户文件
前期工程环境设置完毕,接下来我们就可以专心编写自己的应用程序了。我们把应用程序放在USER这个文件夹下,这个文件夹下至少包含了main.c、stm32f10x_it.c、xxx.c这三个源文件。其中main函数就位于main.c这个c文件中,main函数只是用来测试我们的应用程序。stm32f10x_it.c为我们提供了M3所有中断函数的入口,默认情况下这些中断服务程序都为空,等到用到的时候需要用户自己编写。所以现在我们把stm32f10x_it.c包含到USER这个目录可以了。
而xxx.c就是由用户编写的文件,xxx是应用程序的名字,用户可自由命名。我们把应用程序的具体实现放在了这个文件之中,程序的实现和应用分开在不同的文件中,这样就实现了很好的封装性。本书的例程都严格遵从这个规则,每个外设的用户文件都由独立的源文件与头文件构成,这样可以更方便地实现代码重用了。
于是,我们在工程中新建两个文件,分别为led.c和led.h,保存在USER目录下,并把led.c添加到工程之中。led.c文件中输入代码如下:
17
篇八:gpio控制led实验报告
一.试验目标
试验四【1】GPIO输入试验
1.可以或许应用GPIO的输入模式读取开关旌旗灯号.
2.控制GPIO相干存放器的用法和设置.
3.控制用C说话编写程序控制GPIO.
二.试验情况
PC机一台
ADS1.2集成开辟情况
一套
EasyARM2131教授教养试验平台一套
三.试验内容
1.试验经由过程跳线JP8衔接,程序检测按键KEY1的状况,控制蜂鸣器BEEP的鸣叫.按下KEY1,蜂鸣器鸣叫,松开后停滞蜂鸣.(调通试验后,改为KEY3键进行输入).
2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关失落发光管并停滞蜂鸣,然后轮回这一进程直到检测按键没有输入.(键输入改为键KEY4,发光管改为LED6).
3.联合试验三,当按下按键Key1时,启动赛马灯程序并控制蜂鸣器响,软件延时后关失落发光管并停滞蜂鸣,然后轮回这一进程直到检测按键再次按下.
四.试验道理
第1页,共19页
当P0口用于GPIO输入时(如按键输入),内部无上拉电阻,须要加上拉电阻,电路图拜见图4.2.
进行GPIO输入试验时,先要设置IODIR使接口线成为输入方法,然后读取IOPIN的值即可.
图4.2按键电路道理图试验经由过程跳线JP8衔接,程序检测按键KEY1的状况,控制蜂鸣器BEEP的鸣叫.按下KEY1,蜂鸣器鸣叫,松开后停滞蜂鸣.在这个试验中,须要将按键KEY1输进口P0.16设为输进口而蜂鸣器控制口P0.7设置为输出口.蜂鸣器电路如图4.3所示,当跳线JP6衔接蜂鸣器时,P0.7控制蜂鸣器,低电日常平凡蜂鸣器鸣叫.LED灯电路如图4.4所示,低电日常平凡灯亮.
第2页,共19页
图4.3蜂鸣器控制电路
图4.4LED控制电路程序起首设置管脚衔接存放器PINSEL0和PINSEL1,设置P0.16为输入,设置为输出.然后检测端口P0.16的电平,对进行响应的控制,流程图如图4.5所示,实现程序见程序清单4.1.
第3页,共19页
图4.5按键输入试验流程图
五、试验步调.源代码及调试成果内容1
试验步调①启动ADS1.2IDE集成开辟情况,选择ARMExecutableImageforlpc2131工程模板树立一个工程BEEP_key.②在user组里编写主程序代码main.c.③选用DebugInFLASH生成目标,然后编译链接工程.④将EasyARM教授教养试验开辟平台上的响应管脚跳线短接.⑤选择Project->Debug,启动AXD进行JLINK仿真调试.
第4页,共19页
⑥全速运行程序,程序将会在main.c的主函数中停滞.如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量不雅察窗口,经由过程此窗口可以不雅察局部变量和全局变量.选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片表里存放器窗口.
经由过程变量窗口可以不雅察变量BEEP.KEY1等的值和ARM7微控制器的片表里存放器窗口.如下图所示:
第5页,共19页
⑧可以单步运行程序,先按下Key1,不雅察IO0PIN存放器的值,然后断开Key1,不雅察IO0PIN存放器的值.可以设置/撤消断点;或者全速运行程序,停滞程序运行,不雅察变量的值,断定蜂鸣器控制是否准确.如下图所示:
图
4.6
未按下Key1时IO0PIN的值
图
4.7按下Key1时IO0PIN的值
第6页,共19页
由上两图可知,当按下Key1时,IO0PIN存放器的第16位由1变成0(F变成E),key1与P,按下Key1时,1变成0,存放器值变更,蜂鸣器响,解释控制是准确的.
现象描写:按下KEY1,蜂鸣器鸣叫,松开后停滞蜂鸣.
源代码:
#include"config.h"constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY1=1<<16;//P0.16衔接KEY1(改为KEY3时,只需“constuint32KEY1=1<<16”改为“constuint32KEY3=1<<18”,其余不变.)/*********************************************************************************************函数名称:main()**函数功效:GPIO输入试验测试.**检测按键KEY1.KEY1按下,蜂鸣器蜂鸣,松开后停滞蜂鸣.**跳线解释:把JP8的KEY1跳线短接,JP11衔接蜂鸣器.*******************************************************************************************/intmain(void){PINSEL0=0x00000000;//所有管脚衔接GPIOPINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出,其余输入while(1){if((IO0PIN&KEY1)==0)IO0CLR=BEEP;//假如KEY1按下,蜂鸣器鸣叫elseIO0SET=BEEP;//松开则停滞蜂鸣
第7页,共19页
}return0;}
内容二
试验步调①启动ADS1.2IDE集成开辟情况,选择ARMExecutableImageforlpc2131工程模板树立一个工程BEEP_key.②在user组里编写主程序代码main.c.③选用DebugInFLASH生成目标,然后编译链接工程.④将EasyARM教授教养试验开辟平台上的响应管脚跳线短接.⑤选择Project->Debug,启动AXD进行JLINK仿真调试.
篇九:gpio控制led实验报告
下面是要用的一些内容填到相应位置projdirsrc要搜索的头文件路径projdirincgpio案例源程序中用的宏和具体工程内容有关vecttabramram运行projdirlnkarmramxcllnkarmramxcl文件的路径toolkitdirlib连接时库的路径选择cccompiler选preprocessor选项卡如下图设置这里的路径和工程在硬盘上的文件夹结构有关总之是使编译器能够搜索到相应的文件
实验一GPIO控制LED(一)实验目的:
学习使用ARM开发实验箱STM32的LED部分电路,掌握GPIO的配置编程方法,以及熟悉IAR软件开发环境。(二)实验内容:通过对CPUGPIO的配置,实现对LED灯的控制。(三)实验预备知识:1)IAR软件的编程调试方法。2)LED部分外围电路的学习。(四)实验设备及工具:硬件:ARM嵌入式开发平台STM32实验箱,JTAG仿真器、PC机。软件:PC机、IAR集成开发环境。(五)实验分析:1)资源分配:LED灯电路图如下图所示:PC6----PC9分别连到4个LED,因此,控制PC6----PC9各管脚
输出电平的高低,就可以控制LED的亮与灭。2)软件配置过程:
IAR的EWARM环境下新建工程的过程:打开IAR软件
2.1.新建空工程
在Project菜单里点
:
建立空工程,点OK然后选择保存工程的路径(专门建立文件夹),并输入工程名称,比如Project1,然后点一下保存。在此路径下拷贝一些工程要用的文件(在ledtest文件夹下):
图中的文件是工程必须的文件,从其他现成的EWARM工程中拷贝过来。STM32f10x_vector.c文件是向量表的C语言文件。这里以GPIO案例的源文件为例。SRC文件夹里是GPIO案例的源文件,LIB是用到库源文件,包括对应头文件。
2.2.设置工程属性
首先对工程进行设置。在EWARM里,有两个默认的配置,一个是DEBUG,一个是RELEASE,前者用于调试,后者用于发行。二者的设置不同,并需要分别设置。
可以选中其中一个进行设置。在工程上点右键,菜单里点Options。弹出对话框:
首先如图选择Device,然后点,在列表里选择ST,再选STM32F10X如果不做特别说明,DEBUG和RELEASE的设置相同。下面是要用的一些内容,填到相应位置
$PROJ_DIR$\SRC
要搜索的头文件路径
$PROJ_DIR$\inc
GPIO案例源程序中用的宏,和具体工程内容有关
VECT_TAB_RAM
RAM运行
$PROJ_DIR$\lnkARM_ram.xcl
lnkARM_ram.xcl文件的路径
$TOOLKIT_DIR$\LIB\
连接时,库的路径
选择C/C++Compiler,选Preprocessor选项卡,如下图设置
这里的路径和工程在硬盘上的文件夹结构有关,总之是使编译器能够搜索到相应的文件。
选择Linker里的Config选项卡,如下图设置。这是DEBUG配置的。
选择Debugger选项,在setup选项卡中的driver下选择ST-link
在download选项里,选中userflashloader,下载到目标板的flash中
2.3.为工程添加需要的文件
在工程上点右键菜单,点Add,AddGroup,添加组,一般和硬盘上文件夹结构相同。添加组需要手动输入组的名称。
在新建好的组上点右键,点Add,点AddFiles可以为该组添加文件,在打开对话框中选择工程目录下的文件即可,可以多选。这里也可以为组建立子组,和文
件夹类似。一般按硬盘目录建立组,再把目录下的文件加入对应的组里。最后加好的文件如下:其中main文件,也到ledtest中拷贝至当前工程文件夹
下。
(3)实验步骤:1.连接电源,连接st-link到实验箱的jtag口,并打开电源。2.打开MAIN.C中的内容,点击debuggeranddownload:
3.用IAR编译程序,然后用仿真器下载到开发板。4.运行程序,观察现象。5.进入DEBUG调试环境,单步调试,深入分析程序实现的方法。(七)作业:试着实现LED灯不同点亮顺序,分析实验程序,完成实验报告
篇十:gpio控制led实验报告
当ledgpio的实平实高实led实实的作用就是通实实置实实gpioarm芯片内的gpio口都是用的即它可以被配置实多实同的功能本实实是使用它的普通的口的实出功能故需要实每个gpio口实行配置
word专业资料-可复制编辑-欢迎下载
实验五基于ARM的模块方式驱动程序实验
【实验目的】1.掌握Linux系统下设备驱动程序的作用与编写技巧2.掌握Linux驱动程序模块加载和卸载的方法3.了解Linux内核中的makefile和kconfig文件
【实验内容】1.基于s3c2440开发板编写led驱动程序。2.将编写好的led驱动加入linux内核中,修改makefile和kconfig文件,配置和编译内核。3.编写关于led的测试程序,交叉编译后运行,控制led灯的亮灭。
【预备知识】1.了解ARM9处理器结构和Linux系统结构2.熟练掌握C语言。
【实验设备和工具】硬件:ARM嵌入式开发平台,PC机Pentium100以上。软件:PC机Linux操作系统+MINICOM+AMRLINUX开发环境
【实验原理】linux设备驱动程序驱动的模块式加载和卸载编译模块装载和卸载模块led驱动的原理在本开发板上有八个led指示灯,从下往上分别为LED0-LED7。这八个led灯都是接的芯片
上的gpio口(通用功能输入输出口)。在本实验的开发板硬件设计中,当led灯对应的gpio的电平为低时,led灯被点亮;当led灯对应的gpio的电平为高时,led灯灭。本驱动的作用就是通过设置对应gpio口的电平来控制led的亮灭。
因为ARM芯片内的GPIO口都是复用的,即它可以被配置为多种不同的功能,本实验是使用它的普通的I/O口的输出功能,故需要对每个GPIO口进行配置。在内核中已经定义了对GPIO口进行配置的函数,我们只需要调用这些函数就可以完成对GPIO口的配置。
【实验步骤】实验程序运行效果:
word专业资料-可复制编辑-欢迎下载
程序会提示:“pleaseentertheledstatus”输入与希望显示的led状态对应的ledstatus值(输入十进制值即可),观察led的显示情况。
例如:输入数字“3”,对应的二进制数字为00000011故点亮LED2~LED7输入数字“4”,对应的二进制数字为00000100故点亮LED0,LED1,LED3~LED7
【实验结果和程序】C语言程序:
#include<linux/config.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/devfs_fs_kernel.h>#include<linux/fs.h>#include<linux/init.h>#include<linux/device.h>#include<linux/cdev.h>#include<asm/hardware.h>#include<asm/delay.h>#include<asm/uaccess.h>#include<asm/arch/regs-gpio.h>#include<asm/arch/hardware.h>
#defineDEVICE_NAME"s3c2440-led"staticintLedMajor=231;staticintLedMinor=0;staticcharledstatus=0xff;staticstructclass*s3c2440_class;staticstructcdev*s3c2440_led_cdev;
/********************************************************************************************************
word专业资料-可复制编辑-欢迎下载
**Functionname:Update_led()**Descriptions:updatetheledstatus**Input:NONE**Output:NONE********************************************************************************************************/staticvoidUpdate_led(void){
if(ledstatus&0x01)s3c2410_gpio_setpin(S3C2410_GPC7,1);//LED0灭
elses3c2410_gpio_setpin(S3C2410_GPC7,0);//LED0亮
if(ledstatus&0x02)s3c2410_gpio_setpin(S3C2410_GPC5,1);//LED1灭
elses3c2410_gpio_setpin(S3C2410_GPC5,0);//LED1亮
if(ledstatus&0x04)s3c2410_gpio_setpin(S3C2410_GPH9,1);//LED2灭
elses3c2410_gpio_setpin(S3C2410_GPH9,0);//LED2亮
if(ledstatus&0x08)s3c2410_gpio_setpin(S3C2410_GPB4,1);//LED3灭
elses3c2410_gpio_setpin(S3C2410_GPB4,0);//LED3亮
if(ledstatus&0x10)s3c2410_gpio_setpin(S3C2410_GPG5,1);//LED4灭
elses3c2410_gpio_setpin(S3C2410_GPG5,0);//LED4亮
if(ledstatus&0x20)s3c2410_gpio_setpin(S3C2410_GPG6,1);//LED5灭
elses3c2410_gpio_setpin(S3C2410_GPG6,0);//LED5亮
if(ledstatus&0x40)
word专业资料-可复制编辑-欢迎下载
s3c2410_gpio_setpin(S3C2410_GPG7,1);//LED6灭else
s3c2410_gpio_setpin(S3C2410_GPG7,0);//LED6亮if(ledstatus&0x80)
s3c2410_gpio_setpin(S3C2410_GPG8,1);//LED7灭else
s3c2410_gpio_setpin(S3C2410_GPG8,0);//LED7亮
}staticssize_ts3c2440_Led_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));Update_led();printk("write:led=0x%x,count=%d\n",ledstatus,count);returnsizeof(ledstatus);}staticints3c2440_Led_open(structinode*inode,structfile*filp){printk("leddeviceopen\n");return0;}staticints3c2440_Led_release(structinode*inode,structfile*filp){printk("leddevicerelease\n");return0;}staticstructfile_operationss3c2440_fops={.owner=THIS_MODULE,.open=s3c2440_Led_open,.write=s3c2440_Led_write,.release=s3c2440_Led_release,};
staticintinits3c2440_Led_init(void){
word专业资料-可复制编辑-欢迎下载
intret;dev_ts3c2440_leds_devno;/*configurethegpioforleds*/s3c2410_gpio_cfgpin(S3C2410_GPG5,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPG7,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPG8,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPC7,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPC5,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_OUTPUT);s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT);
Update_led();/*registerthedevnumber*/s3c2440_leds_devno=MKDEV(LedMajor,LedMinor);ret=register_chrdev_region(s3c2440_leds_devno,1,DEVICE_NAME);/*registerthechardevice*/s3c2440_led_cdev=cdev_alloc();if(s3c2440_led_cdev!=NULL){
cdev_init(s3c2440_led_cdev,&s3c2440_fops);s3c2440_led_cdev->owner=THIS_MODULE;if(cdev_add(s3c2440_led_cdev,s3c2440_leds_devno,1))
printk(KERN_NOTICE"Somethingwrongwhenaddings3c2440_led_cdev!\n");else
printk("Successaddings3c2440_led_cdev!\n");}/*createthedevicenodein/dev*/s3c2440_class=class_create(THIS_MODULE,"led_class");class_device_create(s3c2440_class,NULL,s3c2440_leds_devno,NULL,DEVICE_NAME);
printk(DEVICE_NAME"initialized\n");return0;
}staticvoidexits3c2440_Led_exit(void)
word专业资料-可复制编辑-欢迎下载
{cdev_del(s3c2440_led_cdev);class_device_destroy(s3c2440_class,MKDEV(LedMajor,LedMinor));
class_destroy(s3c2440_class);printk(DEVICE_NAME"removed\n");
}module_init(s3c2440_Led_init);module_exit(s3c2440_Led_exit);
【思考题】1.设备驱动程序的功能是什么?答:设备驱动的功能就是将系统提供的调用映射到作用于实际硬件的和设备相关的操作上。2.模块化的最大优点是什么?答:可以在系统正在运行着的时候给内核增加模块提供的功能(也可以移除功能)。3.如果在驱动模块中删除module_exit(s3c2440_Led_exit);后会有什么影响?答:这个模块将不能被移除。4.驱动代码中调用的宏MKDEV的作用是什么?答:获取设备在设备表中的位置。输入主设备号,从设备号,返回位置号。
【实验结论】本实验实现了linux环境下的led灯驱动的添加。
篇十一:gpio控制led实验报告
P> 院专年学姓系:计算机科学学院业:级:号:名:自动化11级11064029杨胜提刘科
指导教师:
2013年
5月
8日
1
年级专业题目名称实验设计要求
11级自动化
班级
11级自动化一班
学号姓名
11064029杨胜提
实验一、GPIO实验
控制EduKit-M3实验平台的发光二极管LED1、LED2、LED3、LED4,使它们有规律的点亮,具体顺序如下:LED1亮->LED2亮->LED3亮->LED4亮,如此反复,当按下EduKit-M3实验平台上的Key按钮时,灯全部熄灭,2秒钟后发光二极管全部点亮,再过一秒钟后返回被中断前的状态,有规律的依次点亮。
1、硬件电路设计
在EduKit-M3实验平台上,LED1、LED2、LED3、LED4分别与PC6、PC7、PC8、PC9相连,按键Key与PB9相连。
2、软件程序设计
(1)配置PB口第9个引脚作为外部中断,下降延触发;(2)读取端口数据输出寄存器GPIOC_ODR[15:0]的值,因为C口[9:6]位和四个LED灯连通。(3)初始化时,LED依次点亮,当按下Key键时产生中断;(4)中断服务子程序内容:灯全部熄灭,2秒钟后发光二极管全部点亮,再过1秒钟后中断返回。整个工程包含3个源文件:STM32F10x.s、stm32f10x_it.c和main.c,其中STM32F10x.s为启动代码,所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main.c中。
实验设计思路
2
实验步骤与结果分析
运行过程(1)使用KeiluVision3通过ULINK2仿真器连接EduKit-M3实验平台,打开实验例程目录GPIO_TEST子目录下的GPIO.Uv2例程,编译链接工程;(2)选择软件调试模式,点击MDK的Debug菜单,选择Start/StopDebugSession项或Ctrl+F5键,在逻辑分析仪中添加GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9,点击Run按钮即可在逻辑分析仪中看到如图7-11;(3)选择硬件调试模式,选择Start/StopDebugSession项或Ctrl+F5键,下载程序并运行,观察LED灯的变化情况;当程序运行在while循环体内时,按Key键,程序进入中断服务子程序EXTI9_5_IRQHandler(),单步运行,观察LED的变化情况。(4)退出Debug模式,打开Flash菜单>Download,将程序下载到EduKit-M3实验平台的Flash中,按RESET键复位,观察LED灯的情况,正常情况应如下。LED灯状态1LED1LED2亮灭灭亮灭灭灭灭灭灭亮亮LED灯状态2LED1LED2亮灭亮亮亮亮亮亮灭灭亮亮说LED3灭灭亮灭灭亮LED4灭灭灭亮灭亮明
程序正常运行,发光二极管依次点亮
外部信号输入,发生中断,执行中断处理程序
说LED3灭灭亮亮灭亮LED4灭灭灭亮灭亮
明
程序正常运行,发光二极管依次点亮
外部信号输入,发生中断,执行中断处理程序
3
软件程序设计
1、配置PB口第9个引脚作为外部中断,下降延触发;/*ConfigurePB9asinputfloating(EXTILine9)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//引脚选择GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//输入模式选择GPIO_Init(GPIOB,&GPIO_InitStructure);2、读取端口数据输出寄存器GPIOC_ODR[15:0]的值,因为C口[9:6]位和四个LED灯连通。方法一:/*ConfigurePC.asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//与LED灯连通的引脚选择GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置输出引脚的速度GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置输出引脚的模式为推挽输出模式GPIO_Init(GPIOC,&GPIO_InitStructure);方法二:利用端口配置低寄存器(GPIOx-CRL)(x=A..E)和端口配置高寄存器(GPIOx-CRH)(x=A..E)GPIOC_CRL=0xcc444444;GPIOC_CRH=0x444444cc;
主要程序代码分析
3、初始化时,LED依次点亮,当按下Key键时产生中断;/*ConfigureEXTILine9togenerateaninterruptonfallingedge*/EXTI_InitStructure.EXTI_Line=EXTI_Line9;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
4
EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);4、LED依次点亮的子程序for(;;){GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);GPIO_SetBits(GPIOC,GPIO_Pin_6);算法1
GPIOC->ODR&=0xfffffc4f;置底
//1
高16位保留,全为F,底16位相应置高或
/*Delay(800);GPIOC->ODR&=0xfffffc0f;GPIOC->ODR|=0x00000cc0;//2Delay(800);GPIOC->ODR&=0xfffffc0f;GPIOC->ODR|=0x00000dc0;//3Delay(800);GPIOC->ODR&=0xfffffc0f;GPIOC->ODR|=0x00000fc0;//4Delay(800);算法2GPIO_ResetBits(GPIOC,GPIO_Pin_6);//使Pin_6置低Delay(800);GPIO_SetBits(GPIOC,GPIO_Pin_6);//使Pin_6置高Delay(100);GPIO_ResetBits(GPIOC,GPIO_Pin_7);Delay(800);GPIO_SetBits(GPIOC,GPIO_Pin_7);Delay(100);GPIO_ResetBits(GPIOC,GPIO_Pin_8);Delay(800);GPIO_SetBits(GPIOC,GPIO_Pin_8);Delay(100);GPIO_ResetBits(GPIOC,GPIO_Pin_9);Delay(800);
5
GPIO_SetBits(GPIOC,GPIO_Pin_9);Delay(100);}//
使用这两个函数对引脚进行配置。
(写不完时,可调整表结构。)
6
(这部分内容要手写)心得体会
成绩评定
教师签名:年月日
7
篇十二:gpio控制led实验报告
P> gpio口被用作第二功能时的配置情况即并非作为通用io口使用比如像片上外设的的iic模块对应的数据线和时钟线使用时候要外接上拉电阻GPIO实验报告
齐鲁理工学院实验报告课程名称:微型计算机控制技术时间:20XX年.10.22地点:D203班级:20XX年级机制3班姓名:杨帆学号:*****4实验项目名称:GPIO端口实验实验指导教师:赵保华实验成绩评定:一、实验目的ü通过实验掌握ARM芯片使用GPIO端口。ü掌握GPIO端口控制LED显示。ü掌握系统时钟的配置。ü掌握库开发原理及方法。二、实验设备ü通过实验掌握ARM芯片使用GPIO端口。ü掌握GPIO端口控制LED显示。ü掌握系统时钟的配置。ü掌握库开发原理及方法。三、实验内容控制信盈达Cotex-M3实验平台的发光二极
1/6
管LED1、LED2、LED3、LED4,使它们有规律的点亮,具体顺序如下:LED1亮-LED2亮-LED3亮-LED4亮,如此反复。
四、实验原理如图所示,LED1-4分别与PB5PE5PA5PA6相连,通过PB5PE5PA5PA6引脚的高低电平来控制发光二极管的亮与灭。当这几个管脚输出高电平的时候发光二极管熄灭,反之,发光二极管点亮。
GPIO管脚的每个位可以由软件配置成如下几种模式:1.输入浮空:浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。做按键,是要读取电平状态,这种配置抗干扰性差,但是是处理信号方面一般是配置这个功能。如测试一个波形,这时候可以配置这个功能。2.输入上拉:经过电阻连接到VCC,能让IO口在没有连接信号时候有一个确定的高电平,并且也能从VCC处获得比较大的驱动电流。3.输入下拉:经过电阻连接到GND,能让IO口在没有连接信号时候有一个确定的低电平。4.模拟输入:芯片内部外设专用功能(ADC,DAC对应的IO口功能)5.开漏输出:IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。6.推挽式输出:IO输出0接GND,IO输出1接VCC,
2/6
拥有比较强的驱动能力,如接led,或三极管。7.推挽式复用功能:GPIO口被用作第二功能时的配置情况
(即并非作为通用IO口使用),比如像片上外设的的UART,SPI模块对应的输出数据线。UART发送线就是复用功能,并且是输出方向。
8.开漏复用功能:GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用),比如像片上外设的的IIC模块对应的数据线和时钟线,使用时候要外接上拉电阻。如IIC总线的数据线和时钟线就要配置这种模式。
我们使用IO口输出一个电压值来控制LED灯亮灭,因此选择推挽输出工作模式。
五、软件程序设计1)配置系统时钟RCC,打开PB、PE、PA端时钟。
2)配置GPIO口PB5、PE5、PA5、PA6为推挽输出工作模式。3)IO口输出低电平控制灯亮,输出高电平控制灯灭。参考程序:main.c参考程序:#include“stm32f10x.h“//芯片寄存器映射头文件#include“led.h“//自己写的led头文件staticvoidDelay(u32i);//延时函数的声明/*主函数*/intmain(void){GPIO_LED_Init();//LED灯初
3/6
始化while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_5);//PB5管脚置
0,LED1亮Delay(*****);//延时GPIO_SetBits(GPIOB,GPIO_Pin_5);
//PB5管脚置1,LED1灭Delay(*****);//延时
GPIO_ResetBits(GPIOE,GPIO_Pin_5);//PE5管脚置0,LED2亮
Delay(*****);//延时GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5管脚
置1,LED2灭Delay(*****);GPIO_ResetBits(GPIOA,GPIO_Pin_5);
Delay(*****);GPIO_SetBits(GPIOA,GPIO_Pin_5);Delay(*****);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
Delay(*****);
GPIO_SetBits(GPIOA,GPIO_Pin_6);Delay(*****);}}/*延时函数*/
staticvoidDelay(u32i){for(;ii--);}led.c参考程序:
/****************************************************函数名:
GPIO_LED_Init形参:无返回值:无函数功能:对4个LED灯
进行初始化,并且关闭所有的led灯
****************************************************/#include
“stm32f10x_gpio.h“voidGPIO_LED_Init(void){GPIO_InitTypeDef
GPIO_InitStructure;//对GPIOB口的时钟打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2P
eriph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//把IO口配置为
输出模式,输出速度50MhzGPIO_InitStructure.GPIO_Mode=
GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=
4/6
GPIO_Speed_50MHz;//设置管脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_Init(GPIOB,GPIO_InitStructure);//根据以上配置初始化PB5GPIO_Init(GPIOE,GPIO_InitStructure);//根据以上配置初始化PE5GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;GPIO_Init(GPIOA,GPIO_InitStructure);//根据以上配置初始化PA5和PA6//关闭四个led灯GPIO_SetBits(GPIOB,GPIO_Pin_5);//PB5管脚置1,LED1灭GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5管脚置1,LED2灭GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_SetBits(GPIOA,GPIO_Pin_6);}led.h参考程序:
#ifndef_LED_H_#define_LED_H_voidGPIO_LED_Init(void);//声明LED灯初始化函数#endif六、实验操作步骤1.准备实验环境使用STlink仿真器连接信盈达STM32实验平台的主板JTAG接口;
使用实验平台附带的USB数据线,连接实验平台主板和PC。2.打开开发环境,新建工程1)新建工程,步骤参照附录1。2)新建两个文件led.c(写函数的定义)和led.h(写函数的声明),保存到工程目录user/API,并且把led.c添加到工程3)完成程序编写,编译链接工程。打开Flash菜单Download,将程序下载到开发板的Flash
5/6
中,按RESET键复位,观察LED的情况。七、实验结果:八、心得体会通过本次实验,我学到了很多知识,通过实
验掌握ARM芯片使用GPIO端口。掌握GPIO端口控制LED显示,掌握系统时钟的配置,掌握库开发原理及方法,感谢老师的指导和同学的帮助
6/6
篇十三:gpio控制led实验报告
P> GPIO实验报告齐鲁理工学院实验报告课程名称:微型计算机控制技术时间:20XX年.10.22地点:D203班级:20XX年级机制3班姓名:杨帆学号:*****4实验项目名称:GPIO端口实验实验指导教师:赵保华实验成绩评定:一、实验目的ü通过实验掌握ARM芯片使用GPIO端口。ü掌握GPIO端口控制LED显示。ü掌握系统时钟的配置。ü掌握库开发原理及方法。二、实验设备ü通过实验掌握ARM芯片使用GPIO端口。ü掌握GPIO端口控制LED显示。ü掌握系统时钟的配置。ü掌握库开发原理及方法。三、实验内容控制信盈达Cotex-M3实验平台的发光二极
1/6
管LED1、LED2、LED3、LED4,使它们有规律的点亮,具体顺序如下:LED1亮-LED2亮-LED3亮-LED4亮,如此反复。
四、实验原理如图所示,LED1-4分别与PB5PE5PA5PA6相连,通过PB5PE5PA5PA6引脚的高低电平来控制发光二极管的亮与灭。当这几个管脚输出高电平的时候发光二极管熄灭,反之,发光二极管点亮。
GPIO管脚的每个位可以由软件配置成如下几种模式:1.输入浮空:浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。做按键,是要读取电平状态,这种配置抗干扰性差,但是是处理信号方面一般是配置这个功能。如测试一个波形,这时候可以配置这个功能。2.输入上拉:经过电阻连接到VCC,能让IO口在没有连接信号时候有一个确定的高电平,并且也能从VCC处获得比较大的驱动电流。3.输入下拉:经过电阻连接到GND,能让IO口在没有连接信号时候有一个确定的低电平。4.模拟输入:芯片内部外设专用功能(ADC,DAC对应的IO口功能)5.开漏输出:IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。6.推挽式输出:IO输出0接GND,IO输出1接VCC,
2/6
拥有比较强的驱动能力,如接led,或三极管。7.推挽式复用功能:GPIO口被用作第二功能时的配置情况
(即并非作为通用IO口使用),比如像片上外设的的UART,SPI模块对应的输出数据线。UART发送线就是复用功能,并且是输出方向。
8.开漏复用功能:GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用),比如像片上外设的的IIC模块对应的数据线和时钟线,使用时候要外接上拉电阻。如IIC总线的数据线和时钟线就要配置这种模式。
我们使用IO口输出一个电压值来控制LED灯亮灭,因此选择推挽输出工作模式。
五、软件程序设计1)配置系统时钟RCC,打开PB、PE、PA端时钟。
2)配置GPIO口PB5、PE5、PA5、PA6为推挽输出工作模式。3)IO口输出低电平控制灯亮,输出高电平控制灯灭。参考程序:main.c参考程序:#include“stm32f10x.h“//芯片寄存器映射头文件#include“led.h“//自己写的led头文件staticvoidDelay(u32i);//延时函数的声明/*主函数*/intmain(void){GPIO_LED_Init();//LED灯初
3/6
始化while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_5);//PB5管脚置
0,LED1亮Delay(*****);//延时GPIO_SetBits(GPIOB,GPIO_Pin_5);
//PB5管脚置1,LED1灭Delay(*****);//延时
GPIO_ResetBits(GPIOE,GPIO_Pin_5);//PE5管脚置0,LED2亮
Delay(*****);//延时GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5管脚
置1,LED2灭Delay(*****);GPIO_ResetBits(GPIOA,GPIO_Pin_5);
Delay(*****);GPIO_SetBits(GPIOA,GPIO_Pin_5);Delay(*****);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
Delay(*****);
GPIO_SetBits(GPIOA,GPIO_Pin_6);Delay(*****);}}/*延时函数*/
staticvoidDelay(u32i){for(;ii--);}led.c参考程序:
/****************************************************函数名:
GPIO_LED_Init形参:无返回值:无函数功能:对4个LED灯
进行初始化,并且关闭所有的led灯
****************************************************/#include
“stm32f10x_gpio.h“voidGPIO_LED_Init(void){GPIO_InitTypeDef
GPIO_InitStructure;//对GPIOB口的时钟打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2P
eriph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//把IO口配置为
输出模式,输出速度50MhzGPIO_InitStructure.GPIO_Mode=
篇十四:gpio控制led实验报告
P> 《嵌入式系统原理与应用》实验报告实验序号:01学号XXX姓实验项目名称:GPIO输入输出控制实验1名XXXXX专业、班实验时间
11计算机科学与技术2013-3-22
实验地点
实验楼1#416指导教师
一、实验目的1.掌握LPC2200专用工程模板的使用;2.掌握Proteus仿真软件的安装和使用;3.熟悉LPC2000系列ARM7微控制器的GPIO控制。二、实验设备(环境)及要求硬件:PC机;软件:PC机操作系统windowsXP,ADS1.2集成开发环境,Proteus软件。三、实验内容与步骤实验内容:编写程序配置LPC2138的P0.2,P0.5为GPIO功能,并P0.2驱动LED灯,P0.5外接按键,实现按下按键,使LED灯闪烁的效果。四、实验结果与数据处理1.实验效果图
1
2.关键代码展示
#include"config.h"intmain(void){//addusersourcecodeuint32i;PINSEL0&=0xFFFFFFCF;//setpin0.2tobeGPIOPINSEL0&=0xFFFFF3FF;//setpin0.5tobeGPIOIO0DIR|=0x00000004;while(1){if((IO0PIN&0x00000020)==0)IO0SET=0x00000004;elseIO0CLR=0x00000004;for(i=0;i<10000;i++);}return0;}
3.关键代码的说明
程序开始
2
设置P0.2和P0.5为GPIO功能
将P0.2设置为输出
判断按钮(P0.5)是否按下
否
是
led灯亮led灯不亮
程序结束
五、分析与讨论第一次接触这个画图,一不小心老师出现连线问题,只好重头来做,细心是很重要的。还有重要的一点就是要‘与’或者‘或’的时候没搞好。六、教师评语
成绩
签名:日期:
3
篇十五:gpio控制led实验报告
P> 实验四GPIO输入实验一、实验目的
1、能够使用GPIO的输入模式读取开关信号。2、掌握GPIO相关寄存器的用法和设置。3、掌握用C语言编写程序控制GPIO。
二、实验环境
PC机
一台
ADS1.2集成开发环境
一套
EasyARM2131教学实验平台
一套
三、实验内容
1.实验通过跳线JP8连接KEY1与P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。(调通实验后,改为KEY3键进行输入)。
2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键没有输入。(键输入改为键KEY4,发光管改为LED6)。
3.结合实验三,当按下按键Key1时,启动跑马灯程序并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键再次按下。
四、实验原理
当P0口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图参见图4.2。
进行GPIO输入实验时,先要设置IODIR使接口线成为输入方式,然后读取IOPIN的值即可。
图4.2按键电路原理图实验通过跳线JP8连接KEY1_P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。在这个实验中,需要将按键KEY1输入口P0.16设为输入口而蜂鸣器控制口P0.7设置为输出口。蜂鸣器电路如图4.3所示,当跳线JP6连接蜂鸣器时,P0.7控制蜂鸣器,低电平时蜂鸣器鸣叫。LED灯电路如图4.4所示,低电平时灯亮。
图4.3蜂鸣器控制电路
图4.4LED控制电路程序首先设置管脚连接寄存器PINSEL0和PINSEL1,设置P0.16为输入,设置P0.7,P1.21为输出。然后检测端口P0.16的电平,对P0.7,P1.21进行相应的控制,流程图如图4.5所示,实现程序见程序清单4.1。
图4.5按键输入实验流程图
五、实验步骤、源代码及调试结果内容1
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:
⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
图4.6未按下Key1时IO0PIN的值
图4.7按下Key1时IO0PIN的值
由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是正确的。
现象描述:按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。
源代码:
#include"config.h"constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY1=1<<16;//P0.16连接KEY1
(改为KEY3时,只需“constuint32KEY1=1<<16”改为“constuint32KEY3=1<<18”,其余不变。)/*********************************************************************************************函数名称:main()**函数功能:GPIO输入实验测试。**检测按键KEY1。KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。**跳线说明:把JP8的KEY1跳线短接,JP11连接蜂鸣器。*******************************************************************************************/intmain(void){PINSEL0=0x00000000;//所有管脚连接GPIO
PINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出,其余输入while(1){if((IO0PIN&KEY1)==0)IO0CLR=BEEP;//如果KEY1按下,蜂鸣器鸣叫elseIO0SET=BEEP;//松开则停止蜂鸣}return0;}
内容二
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。
⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等全局变量、i等本地变量和ARM7微控制器的片内外寄存器窗口。如下图所示:
左图所示为ARM7微控制器的片内寄存器窗口。
图4.9本地变量
图4.8全局变量⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
.
图4.10未按下KEY1时IO0PIN的值
图4.11按下KEY1后IO0PIN的值
对比图4.10和4.11,发现按下KEY1后,IO0PIN寄存器的第16位由1变为0;而KEY1对应管脚P0.16,当按下时输入低电平,这说明KEY1的控制是正确的。
上图所示为运行“IO0CLR=BEEP”后IO0PIN寄存器的值,与图4.10对比,发现第8位由1变为0,BEEP对应P0.7管脚,这说明BEEP的控制是对的。
现象描述:当按下KEY1时,蜂鸣器鸣响,LED4亮;当松开KEY1后,蜂鸣器静音,LED4灭。
源代码如下:
#include"config.h"constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY1=1<<16;//P0.16连接KEY1(改为KEY4按键时,只需把上句代码改为“constuint32KEY4=1<<19”,其余不变)constuint32LEDS4=1<<21;//P1[21]控制LED4,低电平点亮(改为LED6时,只需把上句代码改为“constuint32LED6=1<<23”,其余不变。)/*****************************************************************************函数名称:main()**函数功能:GPIO输入实验测试。**检测按键KEY1。KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。**跳线说明:把JP8的KEY1跳线短接,JP11连接蜂鸣器。
**********************************************************************************
*********/
intmain(void)
{
Uint32i;PINSEL0=0x00000000;//所有管脚连接GPIOPINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出0IO1DIR=LEDS4;//设置LED4灯亮while(1)
{if((IO0PIN&KEY1)==0)
for(i=0;i<1000;i++);
//软件延时
{
IO0CLR=BEEP;//如果KEY1按下,蜂鸣器鸣叫
IO1DCLR=LEDS4;//设置LED4灯亮
}
else
{
IO0SET=BEEP;//松开则停止蜂鸣
IO1SET=LEDS4;//设置LED4灯灭
}
for(i=0;i<1000;i++);
//软件延时
}
return0;
}
内容三
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:
⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
图4.12未按下Key1时IO0PIN的值
图4.13按下Key1时IO0PIN的值
由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,流水灯亮,说明控制是正确的。
现象描述:当按下按键KEY1时,蜂鸣器鸣响,流水灯亮;松开后,蜂鸣器静音,流水灯灭。
源代码如下:#include"config.h"
constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY=1<<16;//P0.16连接KEY1constuint32LEDS8=0xFF<<18;//P1[25:18]控制LED8~LED1,低电平点亮
voidDelayNS(uint32dly){uint32i;
for(;dly>0;dly--){
for(i=0;i<50000;i++);}}
/*********************************************************************************************函数名称:liushuideng()**函数功能:流水灯显示实验。**调试说明:连接跳线JP12至LED8~LED1。*******************************************************************************************//*流水灯花样,低电平点亮,注意调用时候用了取反操作*/constuint32LED_TBL[]={
0x00,0xFF,//全部熄灭后,再全部点亮0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81//从两边叠加后递减};intliushuideng(void){uint8i;PINSEL1=0x00000000;//设置管脚连接GPIOIO1DIR=LEDS8;//设置LED控制口为输出while(1){for(i=0;i<42;i++){/*流水灯花样显示*/IO1SET=~((LED_TBL[i])<<18);DelayNS(20);IO1CLR=((LED_TBL[i])<<18);DelayNS(20);}}return0;}
//主函数
intmain(void){uint32i;PINSEL0=0x00000000;//所有管脚连接GPIOPINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出0
while(1)
{if((IO0PIN&KEY)==0)
{for(i=0;i<1000;i++);
//软件延时
{
IO0CLR=BEEP;//如果KEY按下,蜂鸣器鸣叫
liushuideng();
}
}
else
{
IO0SET=BEEP;//松开则停止蜂鸣
IO1SET=LEDS8;
}
for(i=0;i<100;i++);
//软件延时
}
return0;
}
六、思考题1、如果将P0.30设置为GPIO输入模式,且管脚悬空,那么读取P0.30
得到的值是0还是1?或者是不确定?当管脚悬空时,该管脚有可能是高电平也有可能是低电平。读取
IO0PIN的值并不能确定管教的值。有时管脚是高电平,读取到的不一定是高电平。2、如果需要读取当前P0.7的输出值(不是管脚上的电平),如何实现?
将该管脚与一个LED连接,若LED亮,则输出值为0,否则为1.
篇十六:gpio控制led实验报告
P> 实验二一、实验目的:
1.正确安装keil软件
IO口实现LED灯闪烁
2.正确安装调试驱动,熟悉实验板的用法3.学习IO口的使用方法。
二、实验设备:
单片机开发板、学生自带笔记本电脑
三、实验内容:
利用单片机IO口做输出,接发光二极管,编写程序,使发光二极管按照要求点亮。
四、实验原理:
1.LPC1114一共有42个GPIO,分为4个端口,P0、P1、P2口都是12位的宽度,引脚从Px.0~Px.11,P3口是6位的宽度,引脚从P3.0~P3.5。引脚的内部构造如图所示。其中Rpu为上拉电阻、Rpd为下拉电阻。
2.为了节省芯片的空间和引脚的数目,LPC1100系列微处理器的大多数引脚都采用功能复用方式,用户在使用某个外设的时候,要先设置引脚。控制引脚设置的寄存器
称之为IO配置寄存器,每个端口管脚PIOn_m都分配一个了一个IO配置寄存器IOCON_PIOn_m,以控制管脚功能和电气特性。3.IOCON_PIOn_m寄存器其位域定义如表所列。
位域符号描述
选择管脚功能000:选择功能1001:选择功能2(如果未定义功能2,则保留)2:0FUNC010:选择功能3(如果未定义功能3,则保留)011:选择功能4(如果未定义功能4,则保留)100~111:保留
选择功能模式(片内上拉/下拉电阻控制)00:无效模式(无上拉和下拉电阻被允许)4:3MODE01:允许下拉电阻10:允许上拉电阻11:中继模式
滞后模式5HYS1:禁止0:允许
6
-
保留,复位值为1
选择模拟/数字模式(无AD功能,则保留,复位值为1)7ADMODE0:模拟输入模式1:数字功能模式
选择为I2C模式9:8I2CMODE00:标准I2C模式/快速I2C模式(默认)01:标准I/O功能
10:FM+I2C模式11:保留
31:8
-
保留,复位值为0
4.各引脚IOCON寄存器的位[2:0]配置不同的值所相应功能。
5.GPIO寄存器GPIO数据寄存器用于读取输入管脚的状态数据,或配置输出管脚的输出状态,表5-5对GPIOnDATA寄存器位进行描述。
位11:031:12
符号DATA-
访问R/W-
描述管脚PIOn_0~PIOn_11输入数据(读)或输出数据(写)保留
GPIO的数据方向的设置是通过对GPIOnDIR寄存器的位进行与或操作实现的,LPC1100微处理器和8051单片机的GPIO不同,在使用前一定要先设置数据方向才能使用,
位符号访问值011:0IOR/W131:12引脚PIOn_0~PIOn_11配置为输出保留描述引脚PIOn_0~PIOn_11配置为输入
6.发光二级管的工作电压和工作电流如何?_______________________________________________________________________________________________________________________________________________________________________________________________________________________________。7.发光二极管的限流电阻如何计算?__________________________________________________________________________。
五、实验原理图:
六、实验步骤:
一、基本要求1、默写发光二极管闪烁程序。二、扩展要求1.查找关于呼吸灯的资料,弄懂呼吸灯工作原理。2.自行编写呼吸灯代码,在实验板子上面验证。
七、程序框图:八、供参考程序:
/*************************************************************************/#include"LPC11XX.H"//头文件#defineLED1_ON()(LPC_GPIO1->DATA&=~(1<<0))//点亮连接到P1.0的LED#defineLED1_OFF()(LPC_GPIO1->DATA|=(1<<0))//熄灭连接到P1.0的LED#defineLED2_ON()(LPC_GPIO1->DATA&=~(1<<1))//点亮连接到P1.1的LED#defineLED2_OFF()(LPC_GPIO1->DATA|=(1<<1))//熄灭连接到P1.1的LED/***************************************************************************FunctionName:Delay()*Description:延时函数*EntryParameter:None*ReturnValue:None**************************************************************************/voidDelay()
{uint16_ti,j;for(i=0;i<5000;i++)for(j=0;j<200;j++);}/***************************************************************************FunctionName:LedInit()*Description:初始化LED引脚*EntryParameter:None*ReturnValue:None**************************************************************************/voidLedInit(void){LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCON时钟LPC_IOCON->R_PIO1_0&=~0x07;LPC_IOCON->R_PIO1_0|=0x01;//把P1.0脚设置为GPIOLPC_IOCON->R_PIO1_1&=~0x07;LPC_IOCON->R_PIO1_1|=0x01;//把P1.1脚设置为GPIOLPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON时钟LPC_GPIO1->DIR|=(1<<0);//把P1.0设置为输出引脚LPC_GPIO1->DATA|=(1<<0);//把P1.0设置为高电平LPC_GPIO1->DIR|=(1<<1);//把P1.1设置为输出引脚LPC_GPIO1->DATA|=(1<<1);//把P1.1设置为高电平}/***************************************************************************FunctionName:main()*Description:主函数*EntryParameter:None*ReturnValue:None**********************************************************************/intmain(void){LedInit();while(1){Delay();LED1_ON();LED2_OFF();Delay();LED1_OFF();LED2_ON();}}
篇十七:gpio控制led实验报告
P> 嵌入式系统实验报告嵌入式系统实验gpio输入输出实验嵌入式系统设计师嵌入式系统设计嵌入式系统嵌入式操作系统什么是嵌入式系统嵌入式系统概述嵌入式系统导论试题GPIO输出控制实验1
1、实验目的掌握LPC2200专用工程模块的使用LPC2200(1)掌握LPC2200专用工程模块的使用掌握EASYJTAGEASYJTAG仿真器的安装与使用(2)掌握EASYJTAG仿真器的安装与使用(3)在开发平台上运行第一个程序熟悉ARMARM7GPIO控制(4)熟悉ARM7的GPIO控制2、实验设备硬件:硬件:PC机MAGICARM2200-S教学实验开发平台2200-SMAGICARM2200-S教学实验开发平台软件:系统,软件:Windows98/XP/2000系统,ADS1.2集成开发环境3、实验内容控制开发平台的蜂鸣器报警。控制开发平台的蜂鸣器报警。原理图:4、原理图:
一台一套
5、源代码:/*****************************************************************************文件名:main.c*功能:蜂鸣器控制。对蜂鸣器B1进行控制,采用软件延时方法。*使用I/O口直接控制,采用灌电流方式。*说明:短接蜂鸣器跳线JP7。断开CF卡跳线JP13、GPIO接口J17。****************************************************************************/#include"config.h"#defineBEEPCON0x00000080//P0.7引脚控制B1,低电平蜂鸣/****************************************************************************
*名称:DelayNS()*功能:长软件延时。*入口参数:dly延时参数,值越大,延时越久*出口参数:无****************************************************************************/voidDelayNS(uint32dly){uint32i;for(;dly>0;dly--){for(i=0;i<5000;i++);}}/*****************************************************************************名称:main()*功能:控制蜂鸣器蜂鸣。****************************************************************************/intmain(void){PINSEL0=0x00000000;//设置管脚连接GPIOIO0DIR=BEEPCON;//设置I/O为输入输出模式//设置P0.7为输出while(1){IO0SET=BEEPCON;DelayNS(15);IO0CLR=BEEPCON;DelayNS(15);}return(0);}/******************************************************************************
//BEEPCON=1//BEEPCON=0
GPIO输出控制实验2
1、实验目的熟悉ARM的GPIO控制
2、实验设备硬件:硬件:PC机MAGICARM2200-S教学实验开发平台2200-SMAGICARM2200-S教学实验开发平台软件:系统,软件:Windows98/XP/2000系统,ADS1.2集成开发环境3、实验内容控制LED显示4、原理图
一台一套
5、源代码:/*****************************************************************************文件名:main.c*功能:LED显示控制。*通过GPIO直接控制8个LED产生流水灯效果*说明:短接LED跳线JP5。*这个警告可忽略,C2892E:signedconstantoverflow****************************************************************************/#include"config.h"#defineLED11<<16//P1.16#defineLED21<<17//P1.17#defineLED31<<18//P1.18#defineLED41<<19//P1.19#defineLED51<<20//P1.20#defineLED61<<21//P1.21#defineLED71<<22//P1.22#defineLED81<<23//P1.23#defineLEDCON0x00ff0000constuint32DISP_TAB[8]={0xff01ffff,0xff02ffff,0xff04ffff,0xff08ffff,0xff10ffff,0xff20ffff,0xff40ffff,0xff80ffff};
/*****************************************************************************名称:DelayNS()*功能:长软件延时*入口参数:dly延时参数,值越大,延时越久*出口参数:无****************************************************************************/voidDelayNS(uint32dly){uint32i;for(;dly>0;dly--){for(i=0;i<5000;i++);}}/*****************************************************************************名称:main()*功能:根据表DISP_TAB来控制LED显示。****************************************************************************/intmain(void){uint8i;PINSEL1=0x00000000;IO1DIR=LEDCON;while(1){for(i=0;i<8;i++){IO1CLR=DISP_TAB[i];DelayNS(10);IO1SET=0xffffffff;}}return(0);//端口配置为GPIO//配置LED控制I/O方向为输出
//输出LED显示数据//延时//全部输出高电平
}/******************************************************************************
篇十八:gpio控制led实验报告
P> GPIO控制实验实验报告三、实验效果分析(包括仪器设备等使用效果)一、实验效果分析1、在进行实验时要严格按照实验步骤进行实验,否则试验程序出错则实验效果会发生偏差。
2、由于本实验属于硬件实验的范畴,所以实验起初时要先设定实验属于硬件实验,而不是直接进行。
3、经过一系列的调制修改,实验达到了要求的效果,实验成功。教师评语指导老师年月日江西师范大学物理与通信电子学院教学实验报告通信工程专业2013
年11月26日实验名称GPIO控制实验指导老师姓名年级11级学号成绩一、预习部分1、实验目的2、实验基本原理3、主要仪器设备(含必要的元器件、工具)一、实验目的:1、了解GPIO片上外设2、掌握延时程序应用3、用GPIO口实现LED指示灯控制。二、实验基本原理:通用目的输入输出片内外设提供了专用的通用目的引脚,可以配置位输入或输出。当配置为一个输出时,用户可以写一个内部寄存器以控制输出引脚上驱动的状态。当配置为输入引脚时,用户可以通过内部寄存器的状态检测到输入的状态。另外,GPIO片内外设可以用不同的中断/事件产生CPU中断和EDMA事件。一旦在GPIO使能寄存器被使能,GPIO引脚可以用作通用目的输入/输出。用户可以使用GPIO方向寄存器独立配置每条GPIO引脚为输入或输出。当配置为输出(GPXDIR位=1),GPIO值寄存器(GPVAL)的GPXVAL位的值就被送到相应的GPn引脚。当配置为输入(GPXDIR位=0)时,输入状态可以从相应的GPXVAL读取TMS320VC5502有1-位通用输出引脚XF和8-位通用I/O引脚GPIO[7:0],其中GPIO3、GPIO5与McBSP2复用引脚。SEED-DEC5502模板上这些引脚的使用情况如下:XF用于点亮LED指示灯D1。XF=1,点亮;XF=0,熄灭。GPIO[2:0]:经电平转换后连至外设扩展总线的备用引脚。GPIO3:与McBSP2的CLKX2复用引脚,当配置为GPIO3时,用作COM1的。GPIO4:经电平转换后连至外设扩展总线的备用引脚。GPIO5:与McBSP2的FSX2复用引脚,当配置为GPIO5时,用作COM1的。GPIO6:经电平转换后连至外设扩展总线的备用引脚。GPIO7:用于点亮LED指示灯D5。XF=1,点亮;XF=0,熄灭。通过本实验,要求掌握GPIO口的应用;熟悉延时程序的应用。1、5502_GPIO.c:这是实验的主程序包含系统初始化,GPIO引脚点亮程序等;2、vectors.s55:
快乐分享知识无限!
包含5502的中断向量表;3、SEED_DEC5502.cmd:声明了系统的存储器配置与程序各段的连接关系。三、主要仪器设备计算机、ccs软件二、实验操作部分1、实验数据、表格及数据处理2、实验操作过程(可用图表示)3、结论一、实验操作过程1.打开CCS,进入CCS的操作环境。2.装入DEC5502_GPIO.pjt工程文件,添加SEED_DEC5502.gel文件。3.装载程序DEC5502_GPIO.out,进行调试。4.在5502_LED.c程序的第69行delay();处,第72行delay();处,第75行delay();处,第78行delay();处设置断点。5.运行程序,程序会停在第一个断点处,关闭指示灯D1;6.继续运行程序,程序每次都会停在第二个断点处,点亮指示灯D1;7.继续运行程序,程序每次都会停在第三个断点处,点亮指示灯D5;8.继续运行程序,程序每次都会停在第四个断点处,关闭指示灯D5;9.也可直接执行程序,观察指示灯D1,D5的闪烁情况。二、实验截图
快乐分享知识无限!
篇十九:gpio控制led实验报告
P> GPIO实验------10903070313_某某
一、实验目的:
⑴:熟悉ARM开发板基本组成电路,并通过配套教材熟悉ARM芯片特性。了解ADS1.2软件使用,并会用该软件编译调试开发板。⑵:了解H—JTAG软件原理,利用教材中提供的LED测试程序,完成实验。⑶:进一步掌握ADS1.2集成开发环境的使用方法。⑷:掌握LPC2000专用工程模板的添加和使用。⑸:能够在EasyARM2100教学实验开发平台上运行第一个程序(无操作系统)。⑹:熟悉LPC2000系列ARM7微控制器的GPIO控制。⑺:了解应用程序的固化方法。
二、实验内容及原理:
⑴:单LED闪烁使用P0.25的输出功能,控制一个LED闪动。采用灌电流方式驱动LED,即输出地电平时LED点亮。程序首先设置PINSEL0,PINSEL1进行管教连线,然后由IO0DIR设置P0.25口为输出模式,即可通过对IO0SET和IO0CLR寄存器进行口线设置1或置0输出控制。
⑵:单键输入GPIO是一个双向的I/O口,内部无上拉电阻,所以作于键盘输入时,要上拉电阻。进行GPIO输入时,先要设置IODIR使口线为输入方式,然后读取IOPIN的值即可。使用P0016口作按键的输入,每一次有效按键即对LED4进行取反控制。
⑶:多键多LED(选作)KEY1按下LED1取反,......,KEY4按下LED4取反,KEY5按下LED全灭,KEY6按下LED全亮。⑷:模拟SPI数码显示EasyARM2100开发实验板提供了一位静态数码管,由74HC595直接驱动。74HC595是一个串入并出的一位寄存器,三态输出口,可以通过SQH进行级连,支持100MHz时钟频率。通过3个GPIO口模拟对74HC595进行控制,驱动数字数码管显示数字0~F。⑸:LED及数码编码显示
程序驱动数码管循环显示16进制数0~F,并使用LED1~LED4指示当前数值,LED4表示高位(d3),LED1指示低位(d0),点亮为1,熄灭为0。⑹多键及显示组合(选作)KEY1按下数码显示“1”,......,KEY6按下数码显示“6”,同时LED显示数据BCD编码。
三、实验器材
PC机一台,周立功开发板一块(EasyARM2100)
四、实验预习与要求:
(1)认真复习LPC2000系列ARM7微控制器的GPIO控制机制以及LPC2100管脚连接模块等内容。
(2)了解EasyARM2100教学实验开发平台的硬件结构,注意蜂鸣器的相关控制电路。(3)了解EasyARM2100教学实验开发平台上的跳线。(4)仔细阅读附带文档《ADS集成开发环境及仿真器应用》或其它相关资料,了解GPIO
的设置、74HC595时序、逻辑控制方法、LPC2000专用工程模板。
五、程序流程图
⑴:单LED闪烁
⑵:单键输入
⑶:模拟SPI数码显示⑷:LED及数码编码显示
六、实验源程序为(C语言):
⑴:单LED闪烁#include"config.h"#defineLEDCON0x00400000
voidDelayNS(uint32dly){
uint32i;for(;dly>0;dly--)
for(i=0;i<50000;i++);
}intmain(void){
PINSEL0=0x00000000;PINSEL1=0x00000000;
IO0DIR=LEDCON;while(1){
IO0SET=LEDCON;DelayNS(30);IO0CLR=LEDCON;DelayNS(30);}return(0);}⑵:单键输入#include"config.h"#defineLEDCON0x00400000#defineKEY0x00010000
voidWaitKey(void){
uint32i;
while(1){
while((IO0PIN&KEY)!=0);
for(i=0;i<50000;i++);if((IO0PIN&KEY)==0)break;
}while((IO0PIN&KEY)==0)
;}
intmain(void){
PINSEL0=0x00000000;PINSEL1=0x00000000;
IO0DIR=LEDCON;while(1){
IO0SET=LEDCON;WaitKey();IO0CLR=LEDCON;WaitKey();}return(0);}⑶:模拟SPI数码显示#include"config.h"#defineSPI_CS0X20000100
#defineSPI_DATA0x00000040#defineSPI_CLK0x00000010#defineSPI_IOCON(SPI_CS|SPI_DATA|SPI_CLK)
voidDelayNS(uint32dly){
uint32i;for(;dly>0;dly--)
for(i=0;i<50000;i++);}voidHC595_SendDat(uint8dat){
uint8i;IO0CLR=SPI_CS;for(i=0;i<8;i++){
IO0CLR=SPI_CLK;if((dat&0x80)!=0)
IO0SET=SPI_DATA;else
IO0CLR=SPI_DATA;dat<<=1;IO0SET=SPI_CLK;}IO0SET=SPI_CS;}
intmain(void){
Constuint8DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0X99,0x82,0xF8,0x80,0x90,0x88,0x83,0x83,0xC6,0xA1,0x86,0x8E};
uint8i;PINSEL0=0x00000000;PINSEL1=0x00000000;IO0DIR=SPI_IOCON;while(1){
for(i=0;i<16;i++){
HC595_SendDat(DISP_TAB[i]);DelayNS(50);}}return(0);}⑷:LED及数码编码显示#include"config.h"
#defineSPI_CS(1<<29)#defineSPI_DATA(1<<6)#defineSPI_CLK(1<<4)#defineBEEP(1<<7)#defineSPI_IOCON(SPI_CS|SPI_DATA|SPI_CLK)#defineLED_IOCON(0x0F<<22)
voidDelayNS(uint32dly){
uint32i;for(;dly>0;dly--)for(i=0;i<50000;i++);}
voidHC595_SendDat(uint8dat){
uint8i;IO0CLR=SPI_CS;for(i=0;i<8;i++){
IO0CLR=SPI_CLK;if((dat&0x80)!=0)IO0SET=SPI_DATA;elseIO0CLR=SPI_DATA;dat<<=1;IO0SET=SPI_CLK;}IO0SET=SPI_CS;}
constuint8DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
intmain(void){
uint8i;PINSEL0=0x00000000;PINSEL0=0x00000000;
IO0DIR=SPI_IOCON|LED_IOCON|BEEP;while(1){
for(i=0;i<16;i++){
HC595_SendDat(DISP_TAB[i]);IO0SET=0x0F<<22;IO0CLR=i<<22;
IO0CLR=BEEP;DelayNS(50);IO0SET=BEEP;DelayNS(50);}}return(0);}
七、实验步骤:
㈠、找到开发板的芯片及flash
1.计算机并口与开发板JTAG口相连接打开JTAG软件H-JTAGServer在Flasher里面选择autodownload。2.然后点击左上角的放大镜看是否可以找到开发板CPU。3.如果找到CPU,软件界面会出现ARM7字样以及芯片ID号。
4.如果找到CPU,在flashselection里选择LPC2114
5.configuration里设置晶振的频率为11.0592
打开H-Flasher点击check,会出现ARM7相关字样,证明可以找到flash
㈡、编写程序代码仿真并验证结果
打开CodeWarriorforARMDevelopersuite编写相应的代码,测试没有语法错误后仿真并查看运行结果,对比是否与预期的是否相同。如果与结果存在出入,检查源程序是否存在逻辑上的错误,修改并知道实验结果正确。
八、实验结果:
单LED闪烁实验结果:实验电路板上的LED按一定周期快速闪烁。单键输入实验结果:当按下EasyARM2100实验板的第一个按钮时对应的LED灯熄灭,再次按下时又点亮,实现按键取反的效果。模拟SPI数码显示实验结果:程序驱动数字数码管显示数字0~F。LED及数码编码显示实验结果:除了数字数码管显示数字0~F,四个LED灯显示对应的以点亮/熄灭分别代表1/0二进制数,并伴随蜂鸣。经过实验,实验结果与预期结果基本吻合,表示实验成功。
九、实验结论:
通过本次试验在一定程度上,了解H—JTAG软件原理,熟悉了ARM开发板基本组成电路,并通过配套教材熟悉ARM芯片特性以及ADS1.2软件使用,并会用该软件编译调试开发板掌握了LPC2000专用工程模板的添加和使用。在老师的讲解下以及帮助下,能够在EasyARM2100教学实验开发平台上运行第一个程序。并熟悉了LPC2000系列ARM7微控制器的GPIO控制。了解了简单的应用程序的固化方法,并能根据教材提示完成实验。掌握了LPC2000系列ARM7微控制器的GPIO控制机制以及LPC2100管脚连接和模块等内容,了解了EasyARM2100教学实验开发平台的硬件结构,以及教学实验开发平台上的跳线。老师的教学态度很认真,对于实验的的改进方面的建议是,教学时可以照顾下水平低的同学,适当的降慢课程的讲解速度。实验课程,必要时使用一下软件视频教学。
推荐访问:gpio控制led实验报告 实验 控制 报告