篇一:GPIO引脚点灯实验总结
入门总结
1.1为什么要把时间花在“犹豫”上?
每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。
大家可能是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩板子(实践)。严格地说,应该是模仿实验。熟悉之后才会自己写程序代码实现某个功能。因此,如果你正在咨询STM32;如果你正对STM32心潮澎湃;如果你想入门STM32;那么,从现在开始,不要犹豫了,不要想再详细地了解STM32的前景了。做一个可能影响你一生的决定吧!不用咨询,不用兴奋,开始看书籍(文档)吧!!每个人都是这么走过来的。
1.2看资料需要计划、耐心和速度
这里所谓的“资料”包括STM32书籍、文档。因为STM32有个特点,datasheet很多都是中文的,有些同学就没有去买书籍,直接看STM32的用户手册,也是可以的。但是不管看书籍还是文档,我们是需要计划的。不是今天看3页,明天看5页。一本书看了两个月,还在磨蹭。请记住,你学的不是寂寞,是STM32!
看书或文档不是用来消遣时间的。背水一战吧,给自己规定一个底线:两周内把一定粗略地过一遍!不要求都看懂,事实上,不可能都看懂。但我们必须理解基本知识,对难度高的知识有一个印象,至少以后碰到问题的时候,我们会似曾相识,感觉在哪里见到过,于是翻资料上网找答案——带着问题的时候,效率才是超高的。
两周过去了,STM32的知识你过一遍了吗?没看完?那么,你应该考虑这些天中,你是否尽力了?是否真的想学STM32?或者还是看到STM32人气很高,也想跟下时髦?是不是碰到问题没法解决就想放弃了?现在是你做第二个决定的时候了,请决定你是否继续攻读STM32。如果是一时冲动想跟时髦,请马上放弃——你已经浪费两周时间了,你还想再浪费14天吗?如果想吃得苦中苦,方为人上人,OK,请继续往下看:)
1.3学STM32必备开发板
稍微了解一些理论知识后,现在摆在你面前,有两条路:
第一,自己画PCB制板、焊接、调试。
第二,购买一套性价比高的开发板。
笔者之前做过几次PCB设计,而且当时在实验室可以报销所有费用,就自己做了一个PCB板。建议有报销条件的同学自己设计一块板子学习。毕竟2层PCB的设计不是很难。无法报销的同学,可以选购一款开发板来学。
总之一句话,选购的开发板一定要性价比最高的,最实惠的,而不是最贵的。实际上,大多数同学选购的开发板是用来学习的,不是用来项目开发的。因此,能让你上手STM32,目的已经达到了。
1.4熟悉开发板并试图写程序
这时的你,不能再停留在理论上了。你现在的心情,应当是:看到开发板,马上就有一种说不出的兴奋!但是,心急吃不了热豆腐!请耐心把厂家配套的开发板使用手册浏览一遍,熟悉你买的开发板。按照使用手册,把开发板上的相关测试、操作步骤,都动手做一遍,你会发现,原来开发STM32是如此简单!那么就让我们开始STM32的开发之路吧!
二、STM32入门方法
2.1拿到开发板我该做什么?
国内用户有一个普遍现象:用户拿到开发板后,不知道如何下手。由于没有自己的思路,又是初学者,也没有好的突破口,因此,买来开发板后,开机,看看触摸屏,感叹“好漂亮”的屏幕显示,然后就迷茫了。开发板是不会告诉你如何使用它的。开发板的光盘?光盘里放置一大堆资料——我该先看哪个?后看哪个?总之,我如何开始STM32的入门学习??
从拿到开发板后需要了解如何安装J-Link、MDK(keil)调试软件,一直到STM32上的UCOS移植,配合专门的教程,会在学习STM32的过程中少走许多弯路,提高学习效率了。
2.2我的时间如何安排?
笔者做任何事情前,习惯写一个计划——可能是在公司的时候,每天、每周、每月必写计划和总结养成的“毛病”,呵呵。正如在上一节中提及:我们要用一个月内上手STM32!我们开始考虑,如何更好地利用好这一个月的时间呢?
我想起了第一天公司入职的情景。我的工作导师让我先领一台PC,安装必要的软件,然后告诉我近一个月的任务是什么。当时我很不屑,因为刚参加了公司组织的培训,以为自己啥都会,但是失败了。原因:盲目进行项目,没有一个计划。
没有计划的日子会很惨。就像每天早上醒来睁开眼睛,却不知道自己今天要干啥。闲话不说,我们谈一谈计划和时间安排。
笔者认为,学习STM32,实际上也是进行项目的过程。进行项目,就必须有项目进度文档,至少需要预计项目的耗时。虽然没有那么规范,但建议大家至少要给自己一个时间表:告诉自己从2012年x月y日至2012年m月n日,必须能够进行独立的项目开发。比如定为30天,把这个时间分三个阶段:
第一阶段:找感觉——谈及STM32,立即反应到调试的方法如何。
第二阶段:修改例程——按自己的意愿修改例程,让自己有点成就感。
第三阶段:主动攻击——给自己找一个小项目,把它实现出来。
每个阶段有一个目标后,再细化该目标到每天,写出每天要完成的任务。注意,每天的任务不可太多,否则时间太紧,完成不了当天的任务,反而会进入恶性循环,导致第二天、第三天,以后的任务也将无法完成。最终导致整个计划的失败。
每天的任务需要根据自己的具体情况来定。如果有充足的时间,可以安排多一些任务。如果每天只有2个小时,切记,宁可少安排任务,也不可追求加快项目进度。当然,心中有事情后,每天自然就会忙碌起来!你的学习生活会更加充实!
2.3碰到问题怎么办?
学习难免会遇到问题。在公司参加培训的时候,学员被告知:困难即机会。
所以希望大家坦然面对问题,不能逃避。一小部分同学在遇到问题的时候,总是想:能否避开走另一条路?比如调试程序,某一个程序的语法不太懂,就想用另一种表示方法来代替,或者直接注释掉。——这是很可怕的。因为你现在一旦放过一个问题,可能意味着你一辈子可能都没有机会去碰这个问题。那么你的技术无法进入最高境界。我们是为学习而来,说难听点,我们现在的付出,是想以后能有更好的回报的。
此外,碰到问题,不能马上就到处求助。
原因:
1、这个问题可能是你的疑问,但它还不具体,你无法用最好的语言让别人接受、理解,并且回答它。很多网友看到模凌两可的问题,是不会回答的。比如Linux如何移植?这个问题,如果详细说,需要用半本书来解释——没有人愿意花两三个小时告诉你如何移植。所以这时候,你要做的,是先去查资料,自己试图解决它。当碰到某一个具体的步骤,实在想不通的时候,比如Linux移植过程中,文件挂载打印卡住了。这个现象,可能对有经验的人来说,一句话就能点破。而你因为有先前研究的基础,一听即可知道哪里出问题。这样的方式,学习效率是最高的。
2、CPU是相通的,相信大部分的同学都学习过单片机,是有一定基础的。如果你碰到问题,去尝试了,自己把问题解决了,你会很有成就感!!因为这是你独立思考的结果!!当然,你应该写一个总结文档,收藏在PC中备忘。也可以把总结文档发帖到论坛上,这样的原创文档,跟帖率是最高的。慢慢地,你在这个领域,有了网络知名度。——这绝对是一笔财富。
当然,笔者在此并不是不让大家使用别的方式讨论问题。相反,我提倡大家踊跃发言讨论。刚才是就事论事,也是笔者自己的一点小经历。经历了,才发现如何做才更有效率。
三、STM32学习步骤
在第二章,我们已经谈及到学习需要计划。那么,在这章节,我们就来详细地阐述这个计划——仅供参考。
3.1关于STM32文档学习
本期教程,我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。
STM32的学习与ARM9的学习有一个很大的区别。ARM9的学习一般是需要购买书籍的。比如三星的S3C2440,官方的文档都是英文的,大部分工程师只能去看国内出版的书籍。英文好的同学,请不要以为你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处的。
STM32处理器进入国内市场时候,ST官方(或者第三方)的推广工作做的非常好。翻译了大量的英文文档,迎合了国内的很多工程师的思维。所以现在大部分STM32F103xxx的用户datasheet都有中文版。因此可以不用去购买书籍,看电子档即可。当然,有雄厚经济条件的朋友可以购买本书籍。
阅读STM32固件库使用手册,主要是为了简化编程。STM32给我们提供了一个非常好的固件函数库,我们只要去调用即可。当然,我们也可以不去碰这些固件库——传说使用它会使得代码效率变低,是有道理的。网络上也出现了很多网友自己写的代码,没有使用带固件库函数。如何取舍,在于您的选择。这里我主要强调的是,阅读《STM32固件库使用手册》的时候,前面几章也是必须阅读的。比如第一章文档和库规范中的命名规则,编码规则,这些都是需要注意的。第二章是最关键的,希望大家熟读。第二章描述了固件库的架构,我们如何去使用固件库的步骤等。有了第二章的基础,我们就可以借助固件库写出自己的代码了。第四章开始之后,就可以根据大家的需要来阅读。实际上,后续的章节,都是描述某个模块有什么什么函数,每个函数如何使用等。
关于后面的章节,建议对GPIO库函数、中断部分库函数、复位和时钟设置的库函数要比较熟悉,因为平时经常会用到。
以上提到的这两个文档,已经足够您看的了,呵呵。希望您能从中获取大量的STM32基础知识。
3.230天上手STM32计划
(1)这里所谓的“上手”,指的是能理解并掌握一些常用的STM32外设,真正想掌握一款处理器,30天根本说明不了什么问题。只能说,你已经入门了。但是,这对我们初学者来说已经足够了。
(2)这里所谓的“30天”,根据每个人的时间安排不同而不同。
如果您每天有充足的时间学习,那么可以规定自己尽快地能独立地进行简单的STM32开发。如果您每天只有业余时间来学习STM32,建议根据您的具体情况安排时间。毕竟计划时间如果安排太紧,反而收不到良好的效果,只能进入恶性循环,这是我们要避免的。
但是建议,不管您有无充足的时间,都必须给自己做一个计划!
我这里列出一个思路,仅供参考:
步骤一,安装完STM32学习的软件,比如J-Link、KeilforARM(MDK)、ISP(如果需要从串口下载的话)。这些软件安装的详细步骤,可以参考我们推出的相应教程进行。
步骤二,挑选部分例程的HEX,比如LED灯的例程HEX文件,下载到STM32开发板中,观察LED灯的闪烁情况。这部分的操作,可以参考我们推出的相应的教程进行。
实际上,以上两个步骤,是为了熟悉要使用的工具软件而已。属于找感觉的阶段。其实我们还没开始STM32的学习呢!
步骤三,准备几个常用的文档,比如STM32的用户手册,STM32固件库使用手册等文档。用于平时查阅。这些文档,在光盘中的芯片手册目录中均可找到。
步骤四,开始查看例程的编写,看看例程是如何写的,自己可否修改下例程,达到自己想要的效果呢?芯达STM32开发板的光盘中为大家提供了丰富的例程代码,可以参考。您一定可以修改出更精彩的例程!
步骤五,Ucos-II的移植,是否需要试一下?
恭喜你,至此,你已经可以自如进行独立的开发了。最后一步,给自己一个目标(项目),把它实现出来!
再次强调,以上只是一个学习STM32的思路,供大家参考。下面列出了前面关键的步骤,希望大家能尽快入门。后续的每个模块的编程,请参考我们的芯达STM32入门系列教程。
3.2.1第1步:熟悉调试软件
对初学者来说,我们至少需要安装两个软件:J-Link驱动软件、MDK(就是原来的Keil)软件。这两个软件,用《乡村爱情》里的一句话“必须的!”
如何验证自己已经熟悉调试软件的操作了呢?很简单,STM32开发板光盘里附带了很多HEX格式的文件,可以选择一些HEX文件,来观察运行结果。
比如LED灯的例程HEX文件,下载到芯达STM32开发板中,观察LED灯的闪烁情况。灯在闪烁,就说明你刚才的操作已经把HEX文件烧写到闪存中了。
该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。
3.2.2第2步:GPIO编程
这是第一次接触固件库的编程,一定要硬着头皮去了解固件库。建议大家尽量去用固件库。而不是避开固件库自己写代码——这样只能在学习中才会发生。实际的项目中,代码成百上千个,如何一个一个自己写?调用固件库中的函数来完成,才是王者之道。
GPIO本身的编程实际上很简单:
1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。
2、操作寄存器,往寄存器里置1或者清零操作——这个步骤,固件库已经提供了专门的GPIO_SetBits函数和GPIO_ResetBits函数,我们只要去调用即可实现对IO口的置1和清零。
3、实现多种花样的LED闪动,使得自己熟悉GPIO的编程过程。但是在调用固件库的时候,我们还需要有GPIO结构声明,结构成员初始化,系统时钟配置等等注意事项。该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。
3.2.3开始全新的STM32深入研究
经过以上调试软件的熟悉和GPIO口的编程调试后,相信您已经对STM32有一定的了解。至少知道如何利用STM32的固件库去写一个代码。OK,下面我们将开始全新的STM32深入研究。在这个阶段,将要接触到串口编程、TFT液晶屏驱动编程、定时器编程、串行外设接口SPI编程、存储器编程、SD卡与文件系统移植、USB读写、UCOS移植等,有精力还可以研究其他外设。
篇二:GPIO引脚点灯实验总结
嵌?式实验?:LED灯点亮实验?:LED灯程序?、实验环境开发机环境
操作系统:ubuntu12.04交叉编译环境:arm-linux-gcc4.3.26410板?内核源码:linux-3.0.1?标板环境:OK6410-Alinux-3.0.1?、实验原理image.png图1-OK6410LED原理图image.png图2-LED原理图从上?的原理图可以得知,LED与CPU引脚的连接?法如下,低电平点亮。LED1-GPM0LED2-GPM1LED3-GPM2LED4-GPM3image.png通过上?可以得知,需要先将GPM0设置为输出?式。将相应的寄存器进?配置。然后将GPMDAT寄存器的第0位置0灯亮,置1灯灭。三、实验代码1.编写驱动程序#include
ssize_tled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos){charwbuf[10];unsignedtmp;printk("#########write######\n");copy_from_user(wbuf,buf,count);switch(wbuf[0]){case0://offtmp=readl(S3C64XX_GPMDAT);tmp|=(0xfU);writel(tmp,S3C64XX_GPMDAT);break;case1://ontmp=readl(S3C64XX_GPMDAT);tmp&=~(0xfU);writel(tmp,S3C64XX_GPMDAT);break;default:break;}returncount;}intled_release(structinode*inode,structfile*filp){printk("#########release######\n");return0;}structfile_operationsled_fops={.owner=THIS_MODULE,.open=led_open,.read=led_read,.write=led_write,.release=led_release,};int__initled_init(void){intrc;printk("Testleddev\n");rc=register_chrdev(LED_MAJOR,"led",&led_fops);if(rc<0){printk("register%schardeverror\n","led");return-1;}printk("ok!\n");return0;}void__exitled_exit(void){unregister_chrdev(LED_MAJOR,"led");printk("moduleexit\n");return;}module_init(led_init);module_exit(led_exit);2.编写Makefile?件ifneq($(KERNELRELEASE),)obj-m:=driver_led.oelseKDIR:=/work/linux-3.0.1all:make-C$(KDIR)M=$(PWD)modulesARCH=armCROSS_COMPILE=arm-linux-clean:rm-f*.ko*.o*.mod.o*.mod.c*.symversendif3.编写测试?件#include
intfd;charbuf[10]={0,1,0,1};fd=open("/dev/my_led",O_RDWR);if(fd<0){printf("Open/dev/my_ledfileerror\n");return-1;}while(1){write(fd,&buf[0],1);sleep(1);write(fd,&buf[1],1);sleep(1);}close(fd);return0;}四、实验步骤1、编译驱动程序和测试程序在终端中运?:#make命令,编译成功??下列?件在终端中运?:#arm-linux-gcctest.c-otest,编译成功?成?件2、将?件拷贝到SD卡3、将SD卡插?到OK6410开发板中4、在OK6410终端中运?程序加载驱动:#insmodsdcard/driver_led.ko创建设备?件:#mknod/dev/my_ledc2400运?测试?件:#./sdcard/test卸载驱动程序:#rmmodsdcard/driver_led.ko5、运?结果此时可以看到OK6410开发板的4个LED灯?直同时点亮,然后熄灭。6、更改驱动程序?的代码可实现不同的功能五、实验总结本次实验主要是熟悉交叉编译,测试的步骤,理解驱动程序和测试代码之间的关系,为后续更复杂的程序开发做准备。理解代码的实际意义,可以对代码进??次开发。在实验过程中遇到的困难:Makefile?件命名要正确,?件内容格式要正确,注意Tab键的使?。
篇三:GPIO引脚点灯实验总结
STM32基本GPIO操作:点灯(库函数+寄存器)社团作业=_=开发版上的LED灯负极连接在PB5?,正极串联?510Ω电阻后与3.3V相连若开发板不带LED灯则需要??连接,务必串联?个合适的电阻防?LED灯烧坏零、?个有趣的延时函数来?于开发板配套资料当中的例程,第?次看到的时候觉得???新,代码如下:voidDelay(u32count){u32i=0;for(;i 第?种?案是将上述代码当中的GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;改为GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;因为GPIO_Pin_0~GPIO_Pin_15分别对应?进制数1、10、100、……,因此使?位运算当中的或运算即可将两个参数叠加起来同理,如果想同时使能PORTA、PORTB、PORTC时钟,则可将RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);2.使?由于PB5?与LED负极相连,因此仅当输出低电平时LED灯才会亮设置为低电平:GPIO_ResetBits(GPIOB,GPIO_Pin_5);设置为?电平:GPIO_SetBits(GPIOB,GPIO_Pin_5);3.闪灯例程代码如下:voidDelay(unsignedintcount){unsignedinti=0;for(;i GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);while(1){GPIO_SetBits(GPIOB,GPIO_Pin_5);Delay(10000000); GPIO_ResetBits(GPIOB,GPIO_Pin_5);Delay(10000000);}}Delay()当中的数字可根据实际设备的运?频率做相应调整?、寄存器版本(建议和库函数版本对?异同) 这?部分需要对C语?的位运算有?定的了解0.寄存器以下是需要?到的寄存器,通过查询STM32中?参考?册7.3和8.2可获得更加详细的信息。RCC寄存器:APB2外设时钟使能寄存器(RCC->APB2ENR)GPIO寄存器:端?配置低寄存器(GPIOx->CRL)(x=A…E)端?输出数据寄存器(GPIOx->ODR)(x=A…E)端?位设置/清除寄存器(GPIOx->BSRR)(x=A…E)端?位清除寄存器(GPIOx->BRR)(x=A…E)1.初始化以下是初始化PB5端?的代码//PORTB时钟使能RCC->APB2ENR|=1<<3;//将寄存器APB2ENR的第3位(与PORTB对应)设为1//初始化GPIOB->CRL&=0XFF0FFFFF;//清空寄存器CRL第20~23位(Pin5对应的参数)GPIOB->CRL|=0X00300000;//将寄存器CRL第20~23位设为0011初始化流程:时钟使能→直接通过配置寄存器来初始化端?关于APB2ENR寄存器:APB2ENR寄存器的各位描述如下:由图可知,若需要使能PORTC时钟,则需要以下代码RCC->APB2ENR|=1<<4;与库函数版本类似,若需要同时使能PORTA、PORTB、PORTC时钟,则需要以下代码RCC->APB2ENR|=(1<<3)|(1<<4)|(1<<5);关于CRL寄存器:CRL寄存器的各位描述如下: 当中的每4个位对应1个输出端?,查阅资料可得推挽输出对应的配置位(CNFx)为00,50MHz输出速率对应的模式位(MODEx)为114个位(bit)刚好与1个16进制数相对应(2^4=16^1=16),因此?个16进制数0~F刚好对应了?个GPIO端?的配置。?进制数0011对应的16进制数为0x3,因此上?的初始化代码可将寄存器的第20~23位设为0011同理,若需要将PC2?初始化为推挽输出+50MHz输出速率,则需要以下代码GPIOC->CRL&=0XFFFFF0FF;//清空CRL寄存器第8~11位(Pin2对应的参数)GPIOC->CRL|=0X00000300;//将CRL寄存器第8~11位设为0011设置Pin0~Pin7时?的是CRL寄存器,设置Pin8~Pin15时?的是CRH寄存器,CRH寄存器的各位描述如下,具体设置?法和CRL寄存器类似2.使?(多种?案)2.1传统操作2.1.1通过ODR寄存器操作(?烦)ODR名为端?输出数据寄存器,向其0~16位写?1则对应端?为?电位,反之为低电位这种特性意味着每次设置ODR寄存器需要给出0号端?~15号端?的?低电位由于看开发?册没有看全,?先想到的是这种操作?法设置为低电平:GPIOB->ODR&=0xffffffff-(1<<5);//将第5位(bit)清空GPIOB->ODR|=0<<5;//将第5位(bit)设置为0设置为?电平:GPIOB->ODR&=0xffffffff-(1<<5);//将第5位(bit)清空GPIOB->ODR|=1<<5;//将第5位(bit)设置为12.1.2通过BSRR/BRR寄存器操作(简单)BSRR名为端?位设置/清除寄存器,向其0~16位(bit)写?1则ODR对应位变为1(对应端?为?电位),写?0则不变 BRR名为端?位清除寄存器,向其0~16位写?1则ODR对应位变为0(对应端?为低电位),写?0则不变后期发现了这种更?便的操作?法设置为低电平:GPIOB->BRR&=1<<5;//将第5位设置为0设置为?电平:GPIOB->BSRR&=1<<5;//将第5位设置为1不使?BRR寄存器,仅使?BSRR寄存器来将ODR对应位变为0/1也是可以的,具体?法可参考STM32中?参考?册8.2.52.2位带操作个?理解是通过访问?个32位长度的地址区间(类似于直接操作?个unsignedint)来达到访问1个位的效果,各种资料上说这种操作更优越具体实现还不会,不过开发板资料中有现成的头?件可供使?头?件中的代码如下: #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))#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOC_ODR_Addr(GPIOC_BASE+12)//0x4001100C#defineGPIOD_ODR_Addr(GPIOD_BASE+12)//0x4001140C#defineGPIOE_ODR_Addr(GPIOE_BASE+12)//0x4001180C#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#defineGPIOC_IDR_Addr(GPIOC_BASE+8)//0x40011008#defineGPIOD_IDR_Addr(GPIOD_BASE+8)//0x40011408#defineGPIOE_IDR_Addr(GPIOE_BASE+8)//0x40011808#defineGPIOF_IDR_Addr(GPIOF_BASE+8)//0x40011A08#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08#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)#definePCout(n)BIT_ADDR(GPIOC_ODR_Addr,n)#definePCin(n)BIT_ADDR(GPIOC_IDR_Addr,n)#definePDout(n)BIT_ADDR(GPIOD_ODR_Addr,n)#definePDin(n)BIT_ADDR(GPIOD_IDR_Addr,n)#definePEout(n)BIT_ADDR(GPIOE_ODR_Addr,n)#definePEin(n)BIT_ADDR(GPIOE_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)include该头?件后即可使?位带操作设置为低电平:PBout(5)=0;设置为?电平:PBout(5)=1;3.闪灯例程代码如下: voidDelay(unsignedintcount){unsignedinti=0;for(;i GPIOB->BRR=1<<5;Delay(10000000);}}Delay()当中的数字可根据实际设备的运?频率做相应调整2019.11.28 (19)中华人民共和国国家知识产权局 (12)发明专利申请 (21)申请号 CN201811605863.6(22)申请日 2018.12.2(71)申请人 苏州中晟宏芯信息科技有限公司 地址 215000江苏省苏州市苏州高新区科技城学森路9号 (10)申请公布号 CN109857621A (43)申请公布日2019.06.0(72)发明人 茅振宇 (74)专利代理机构 苏州广恒知识产权代理事务所(普通合伙) 代理人 张利强 (51)Int.CI 权利要求说明书 说明书 幅图 (54)发明名称 一种基于GPIO和SGPIO两种点灯方式的硬盘背板 (57)摘要 本发明公开了一种基于GPIO和SGPIO两 种点灯方式的硬盘背板,包括连接器、选择电路、逻辑芯片以及硬盘指示灯,所述的连接器将GPIO和SGPIO信号连接至选择电路A,所述的选择电路A将SGPIO信号发送至逻辑芯片或者将GPIO信号发送给选择电路B,所述的逻辑芯片对SGPIO控制信号进行解码并发送给所述的选择电路B,所述的选择电路B对逻辑芯片的解码信号和选择电路A送出的GPIO信号进行二选一并发送篇四:GPIO引脚点灯实验总结
篇五:GPIO引脚点灯实验总结
1:环境搭建
(1)
仿真器设备的连接
【说明】USB接口不够可以使用USB集线器扩展,且互相不会干扰,非常方便。
由于用到了CC仿真器(smartRF04EB),需要相关驱动。连接仿真器,之后通过系统找设备管理器,通过更新驱动程序,可以安装好仿真器,驱动路径:…\IARSystems\EmbeddedWorkbench6.4\8051\drivers\TexasInstruments(2)
IAR的安装、配置和测试
IAR是全球领先的嵌入式系统开发工具和服务的供应商,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,尤其是C编译器-IAREmbeddedWorkbench,支持众多知名半导体公司的微处理器,包括CC2530。
IAREmbeddedWorkbenchIDE安装时要注意Lisence,而具体的使用步骤如下:
(a)Project->CreateNewProject->EmptyProject,命名test.ewp
(b)配置工程属性:右键点击工程,选择Option...。查了一下型号,是CC2530F256。
GerenalOptions中,Target的选项为:
Device:CC2530F256;CodeMode:Near;Datamodel:Large;Callingconvention:PDATAstackreentrant。
Stack/Heap堆栈设置:XDATAstacksize:0x1FF
Linker设置:Linkercommandfile:选择lnk51ew_cc2530F256.xcl
Debugger设置:Driver:TexasInstruments
(本实验为真机调试,所以选择TI;若其他程序要使用IAR仿真器,可选Simulator)
DeviceDescriptionfile:CC2530F256.ddf(可以不选)
之后保存,由于配置过了,因此IDE会把该工程的配置信息保存成workspace。常见编译错误见上页!
(c)写代码:新建一个文件,保存为test.c。然后把文件加入到工程中。代码如下:
#include
uchar;voidLed_Init()while(1)typedefunsignedint
uint;{{#defineLED1P1_0P1SEL&=~(1<<0);
LED1=0;P1DIR|=(1<<0);Delay(10);voidDelay(uintmsec)
//延时
{}LED1=1;uinti,j;
Delay(100);for(i=0;i (d)Compile->Make->Download,然后 菜单 ->Debug->Go 之后可看到LED反应。此时去掉仿真器,通电,该模块还是如此。程序已经下载到开发板中。 2:实验一:GPI/O输出控制Led亮灭实验 (1)原理说明 通用接口寄存器说明 CC2530具有 P0_0~P0_7,P1_0~P1_7,P2_0~P2_4共21个I/O口。它们可作为通用数字I/O,也可用于连接ADC、定时/计数器或USART等外设IO。在使用IO口时需配置,若缺省,则取系统默认值。CC2530的SFR中有三类寄存器可用于配置这些IO口: Px寄存器 0xf40xfeoxf60xf40xfeoxf6作用 端口1功能选择 端口1方向 端口1输入模式 端口0功能选择 端口0方向 端口0输入模式 描述 P1.7~P1.0功能选择:0:通用数字IO,1:外设IO。缺省为P1.7~P1.0方向:0:输入,1:输出。缺省默认为0,即默认输入。 P1.7~P1.0输入模式:0:上拉/下拉,1:三态,缺省默认为0。 P0.7~P0.0功能选择:0:通用数字IO,1:外设IO。缺省为P0.7~P0.0方向:0:输入,1:输出。缺省默认为0,即默认输入。 P0.7~P0.0输入模式:0:上拉/下拉,1:三态,缺省默认为0。 P1P1SEL 0x90P1DIR P1INP P0P0SEL P0DIR P0INP 数字I/O设置原则:不能影响其它bit位 一般采用如下方式:A&0=0、A&1=A、A|0=A、A|1=1P1SEL&=~(1<<1); 即P1SEL=P1SEL&11111101,所以将P1_1设置为0,普通IO,其他不变。 P1DIR|=(1<<1); 即P1DIR=P1DIR|00000010,所以将P1_1设置为1,输出,其他不变。 按照开发板的电路图:取P1.0位作为D1发光使用。 所以P1.0的设置为:I/O,输出,1灭,0亮。 所以采用的设置方式为: P1SEL&=~(1<<0); P1DIR|=(1<<0);(2)操作过程和配置 新建工程exp1_gpio_led.ewp? 保存WorkSpace,保存为exp1_gpio_led.eww? 新建led.c加入到工程中 开始配置 (1) GerenalOptions中,Target的选项为:Device:CC2530F256;CodeMode:Near;Datamodel:Large;Callingconvention:PDATAstackreentrant。 (2) Stack/Heap堆栈设置:XDATAstacksize:0x1FF(3) Linkercommandfile:选择lnk51ew_cc2530F256.xcl(4) Debug设置:Driver选择TI? 输入代码 编译成功 仿真调试,点击DownloadandDebug,即可。 下载完成之后,点击Debug,然后Go!实验成功!! (3)代码(见上页内容 (4)扩展 计算频度 计算时间:亮灭25次,花费时间53.1s。也就是亮灭一次时间为2.124s。 一次亮灭计算频度为10000x(10+100)=1.1M次。即1.1M次执行时间为2.124s,所以每秒大概近0.5M
推荐访问:GPIO引脚点灯实验总结 点灯 引脚 实验