ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:201.52KB ,
资源ID:4279821      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4279821.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STM8GPIO入门文件认识.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

STM8GPIO入门文件认识.docx

1、STM8GPIO入门文件认识STM8l最白菜的入门笔记(2)gpio篇v:* behavior:url(#default#VML);o:* behavior:url(#default#VML);w:* behavior:url(#default#VML);.shape behavior:url(#default#VML);我们先来观察一下例程里是怎么操作 gpio的。我们打开discover这个例程。我们看到main刚开始的几句就是gpio初始化。(因为我曾折腾过STM32,所以多少熟一点,一看到这个,我就知道,事情就在这,所以不会再看太多。)我们截取其中几句看看。* USER button

2、init: GPIO set in inputinterrupt active mode */GPIO_Init( BUTTON_GPIO_PORT, USER_GPIO_PIN, GPIO_Mode_In_FL_IT); /* Green led init: GPIO set in output */GPIO_Init( LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast); /* Blue led init: GPIO set in output */GPIO_Init( LED_BLUE_PORT, LED_BLUE_PIN

3、, GPIO_Mode_Out_PP_High_Fast); /* Counter enable: GPIO set in output forenable the counter */GPIO_Init( CTN_GPIO_PORT, CTN_CNTEN_GPIO_PIN,GPIO_Mode_Out_OD_HiZ_Slow); /* Wake up counter: for detect end ofcounter GPIO set in input interupt active mode */GPIO_Init( WAKEUP_GPIO_PORT, ICC_WAKEUP_GPIO_PIN

4、, GPIO_Mode_In_FL_IT);注释已经写得很明白了。玩过430或者stm32的童鞋应该多少都知道,这些比较新款的单片机,跟以前的51不太一样,那就是外部中断源贼多,而且是跟着gpio走的。坦白说,现在回想起来,其实51的外部中断也是跟着io口走的,想起来了吗?INT0和INT1就是P3.0和P3.1,只不过它少一点而已。但鉴于我们现在是要入门,所以,我们先不管中断说起来,玩这个还真费了我不少劲,不过说起来已经不错了,哈哈,那时候STM32还不会定时中断呢(当然,现在也没弄定时,但既然外部中断都会了,想来也差不多吧)所以,我们的目标先设得简单一点:我们只要实现基本的gpio读写功能

5、,读用来读按键,写用来点亮LED。右键就可以点开相关函数 的定义位置(这里说一下,所谓 定义,对函数来说,就是函数实现,与函数声明区分,在讨论程序时,我提到实现,大多是指的都是这个意义上的实现,而不再是 一般说的那个 实现 的意思。)void GPIO_Init(GPIO_TypeDef* GPIOx,uint8_t GPIO_Pin,GPIO_Mode_TypeDef GPIO_Mode)没事,我们不会去看源码。我们只要看函数接口。一个是gpio的port口,一个是gpio的pin数,一个是gpio的配置模式。对单片机比较熟悉的朋友基本不用多说,这里还是简单说一下,在单片机里,io口都是按组

6、划分。比如说,最常见的8位机一组8个,然后可能有4到6组。当然也有16位机的16个一组,让我有点奇怪的是STM32是32位ARM,一组却也只有16个。更有甚者,比如我玩的一个32位系统,居然只有8个一组,看来这个跟位数没必然关系。说了这么多,我们来看看我们这个stm8l-discover开发套件上的gpio口情况。用不着看pdf,从开发板引出的管脚就知道。它总共有41个io口,共分6组,五组8个,最后一组1个,它以AF按顺序命名。分别是GPIOAGPIOF.这就是我们的port然后每组分8位,这就是我们的pin。好了,现在我们搞清楚数目上的状况了。我们再看第三个参数,IO口类型。我们可以通过查

7、看gpio.h这个头文件获取相关的信息。看的时候不妨多看一些我们曾见到的熟面孔,这样会加快熟悉对与其相关的宏和操作函数的了解程度。比如说,首先我们看到的就是io口类型typedef enumGPIO_Mode_In_FL_No_IT =(uint8_t)0x00, /*! Input floating,no external interrupt */GPIO_Mode_In_PU_No_IT =(uint8_t)0x40, /*! Input pull-up,no external interrupt */GPIO_Mode_In_FL_IT =(uint8_t)0x20, /*! Input

8、 floating,external interrupt */GPIO_Mode_In_PU_IT =(uint8_t)0x60, /*! Input pull-up,external interrupt */GPIO_Mode_Out_OD_Low_Fast =(uint8_t)0xA0, /*! Outputopen-drain, low level, 10MHz */GPIO_Mode_Out_PP_Low_Fast =(uint8_t)0xE0, /*! Outputpush-pull, low level, 10MHz */GPIO_Mode_Out_OD_Low_Slow =(ui

9、nt8_t)0x80, /*! Outputopen-drain, low level, 2MHz */GPIO_Mode_Out_PP_Low_Slow =(uint8_t)0xC0, /*! Outputpush-pull, low level, 2MHz */GPIO_Mode_Out_OD_HiZ_Fast =(uint8_t)0xB0, /*! Outputopen-drain, high-impedance level, 10MHz */GPIO_Mode_Out_PP_High_Fast = (uint8_t)0xF0, /*! Output push-pull, high le

10、vel, 10MHz*/GPIO_Mode_Out_OD_HiZ_Slow =(uint8_t)0x90, /*! Output open-drain,high-impedance level, 2MHz */GPIO_Mode_Out_PP_High_Slow = (uint8_t)0xD0 /*! Output push-pull, high level, 2MHz*/GPIO_Mode_TypeDef;这是个结构体,如果你熟悉,光看名字就猜到了,如果你不熟悉,看看英文注释也差不多了,当然,假如你对电路的了解不深,那可能不知其所然。而对我来说,尽管我了解这些都是什么玩意,但是对于部分模式,

11、我并不了解它的作用和意义。于是我另外花了一些时间,去找这方面的的信息看,最后找到一份周立功 的文档,感觉相当不错,比起那些坑爹的强太多了说的都是废话。基本就是把STC那种乱七八糟的pdf里的内容半通不通地翻译成中文而已。没有任何解释。具体的文档可以上XX搜索,我记得我是请朋友帮我在XX文库里下的,刚找了找,没找着,下次看看补上链接什么的。下面是简单总结:基本输入电路基本IO输入电路施密特触发输入电路弱上拉输入电路基本IO输入,三态缓冲器,只在 读取 时,外部状态会反映到内部总线上,其余时刻不影响内部电路。读取时,CPU发出一个外部选通信号施密特输入电路对外部输入脉冲进行整形,它可以去除某种程度

12、的抖动。带外部弱上拉的输入电路弱上拉的好处是对外部干扰信号有较好的抵抗能力,但输入阻抗显著降低。而悬空态的输入电路,对于干扰信号抵抗能力较差。至于输出,实际上只有两种:1 开漏输出2 内部上拉输出。对这两个我简单解释一下,开漏和开集电极是 很接近的。这里的漏说的是 场效应管的 漏极,它在功能上类似于三极管的 集电极。英文称之为 open drain 和 open collection,也就是别人总是神侃的OD门和OC门。它就是少了一个上拉电阻,我个人认为它的最大意义有两个:1 第一,它不怕外部IO短路,可以起相当的保护作用。2 它适合不同电平之间的匹配,比如常见的5V系统和3.3V系统。但它的

13、缺陷却是,输出的电平是不定的。也就是高不一定能高到电源电压,低不能低到地的零电平。而外部上拉,它则可以保证输出永远是稳定的高或者低电平,但是,很显然它遇到IO短路,会有烧毁IO口的危险。关于这一部分,其实我并没说的很明白,这其中的内容,咱们有需要再多找资料看吧,嘿嘿,我懂的也就这么多了。我们这里普普通通,只用外部上拉输入 和 外部上拉输入输出。接着看一下这个不是很长的头文件。typedef enumGPIO_Pin_0 =(uint8_t)0x01), /*! Pin 0 selected*/GPIO_Pin_1 =(uint8_t)0x02), /*! Pin 1 selected*/GPI

14、O_Pin_2 =(uint8_t)0x04), /*! Pin 2 selected*/GPIO_Pin_3 =(uint8_t)0x08), /*! Pin 3 selected*/GPIO_Pin_4 =(uint8_t)0x10), /*! Pin 4 selected*/GPIO_Pin_5 =(uint8_t)0x20), /*! Pin 5 selected*/GPIO_Pin_6 =(uint8_t)0x40), /*! Pin 6 selected*/GPIO_Pin_7 =(uint8_t)0x80), /*! Pin 7 selected*/GPIO_Pin_LNib =

15、 (uint8_t)0x0F), /*! Low nibble pins selected */GPIO_Pin_HNib = (uint8_t)0xF0), /*! High nibble pins selected */GPIO_Pin_All =(uint8_t)0xFF) /*!ODR|=b#define GPIO_LOW(a,b) a-ODR&=b以后等你熟悉了STM的寄存器,你也会知道,这实际上是直接操作它的输出寄存器,IDR就是输入寄存器。但我们这里,暂时不考虑这么多,我们首先坚持只用固件库的原有函数做开发。既然我们已经分析了 gpio操作函数分三大类,也就是说,我们可以直接调用

16、。好了,经过以上分析,我们是时候真正展开动手来做一个属于自己的gpio项目文件了。项目的建立见上一篇。上一篇我们建立了一个只有空函数的可编译的项目文件,现在我们在它的基础上,增加gpio的固件库。因为我们只要操作gpio,所以我们只需要添加gpio.c和gpio.h对于文件夹的布置,我个人很欣赏stm例程的做法,于是,也按照它的做法做。首先是一个库,命名为 Library然后是我们自己的项目文件,命名为 Project再有一个文件夹属于开发中的文档以后你就会知道,一个完整的项目必须有一些必要的简洁但完整的开发文档,否则,该程序的可维护性和可读性将大打折扣。Library下,仍然学习例程,下分i

17、nc存放头文件,src存放源文件。由于我的项目文件中还有别的内容,所以我添加了其它头文件,实际上,对于我们这个gpio来说,除了gpio.h以外,只再需要一个stm8l115x.h。千万别忘了,因为在结构上,如第一篇分析,它是所有外设头文件的基础,没有它,无法完成项目文件的编译。Src中,则只有一个gpio.c 当然了,它们的全名是 stm8l115_gpio.c和 stm8l115x_gpio.h现在,来写我们的主函数。我们在Project下建立一个main.c源文件,内容很简单,如下:复制内容到剪贴板1. #include stm8l15x.h2. 3. #include stm8l15x

18、_gpio.h4. 5. /#include stm8l15x_exti.h6. 7. /#include stm8l15x_it.h8. 9. 10. 11. 12. 13. #define BUTTON_GPIO_PORT GPIOC14. 15. #define USER_GPIO_PIN GPIO_Pin_116. 17. 18. 19. #define LD4_GPIO_PORT GPIOC20. 21. #define LD4 GPIO_Pin_722. 23. 24. 25. int main( void )26. 27. 28. 29. GPIO_Init( BUTTON_GP

19、IO_PORT, USER_GPIO_PIN, GPIO_Mode_In_FL_IT);30. 31. 32. 33. /EXTI_SetPortSensitivity(EXTI_Port_B, EXTI_Trigger_Falling);34. 35. 36. 37. /EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Falling);38. 39. 40. 41. /enableInterrupts();42. 43. 44. 45. while(1)46. 47. 48. 49. 50. 51. if (GPIO_ReadInputData

20、Bit(BUTTON_GPIO_PORT, USER_GPIO_PIN) )52. 53. GPIO_Init(LD4_GPIO_PORT,LD4, GPIO_Mode_Out_PP_High_Fast);54. 55. else56. 57. GPIO_Init(LD4_GPIO_PORT, LD4, GPIO_Mode_Out_PP_Low_Fast);58. 59. 60. 61. 62. 63. 这段代码本来是已经做到用gpio口的外部中断了,所以有一些被我注释掉的内容,你可以直接去掉。我们这个代码实现的功能就是,按着按键时,灯是灭的,松开手时,灯是亮的。具体理解,如同我前面介绍一样,

21、一句话,查看我所调用的函数的函数声明。你只需要理解它的接口和返回值即可。对了,差点忘了两件很重要的事。1 指定 头文件搜索的相对路径 - 这对我来说,曾经是非常蛋疼的一件事,现在其实说白了很简单的事情,让我一下就捅破它吧。我们的编译器在包含头文件时,需要给它指定一个路径,才能准确在特定位置找到我们要的头文件。指定路径有两种方式:1 绝对路径2 相对路径绝对路径就是死的,它就是我们在文件夹的地址栏里看到的这个东西:C:Documents and SettingsAdministrator桌面STM8资料stm8l-gpio2Project它的缺陷是,假设下次你把这个项目文件移到另一个位置,比如说

22、D:下,那它就全傻了,届时你会看到一堆的警告和错误,实在颇为状况和.让人心惊胆战。所以,一般推荐相对路径。相对路径以项目文件中的工作环境文件.eew为起点,依次寻找搜寻对应的文件夹,由此,不管我们把文件夹移到哪去,都可以正确找到我们放在里面的头文件。无论是相对路径还是绝对路径都在一个地方设置。右键点击 WorkPlace 里那个灰蓝色实体,选择 Option。选择 C/C+ Compiler下的 Preprocessor选项卡因为把头文件包含进代码里,这一步正是预编译阶段,所以要设置的是预编译器其中$PROJ_DIR$正是我们前面说的 .eew项目环境文件。此处要注意的是.它的意思是指,回到上

23、一级文件夹。回忆一下我们的文件夹是如何布置的。.eew是存在Project文件夹下,而头文件是在与Project同级的Library下的inc里。所以,首先要回到上一级文件夹,再找到Library下的inc。这个过程的演变是$PROJ_DIR$. 回到上一级文件夹$PROJ_DIR$.Libraryinc 找到该文件夹里Library下的inc对于其他位置,而是类似的方法,但要注意的是,一个位置的相对地址要单独写一行。2 选择ST-LINK编译器,这个简单很多差点又忘了,首先首先要选择 器件型号。同样在这个Option下,选择第一个 General Option然后在Device下拉菜单里选择,对于我们的stm8l152c6t6,我们能选到的最接近型号就是选择其中的 STM8L152C6至于另两个选项是设置程序存储器 和 数据存储器 的模式,这个暂时不会玩,先按默认的选即可。3点击DebuggerDriver一项选择 ST-LINK好了,OK了,现在点击OK。然后开始编译和运行我们的程序吧。首先编译程序。方法如前所说,右键 Rebuild All然后插上开发板,直接点那个 绿色小三角,将会看到它在链接和下载。这时自动处于debug模式,你可以点那些蓝色箭头,实现单步,全速等调试功能。也可以直接关掉,即可让开发板直接跑程序了。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1