上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO、外部中断、定时器、串口等,本节先给大家介绍一下STM8单片机的GPIO口。

我们先不介绍STM8单片机GPIO口的内部资源,我们先从程序代码着手,再根据代码进一步分析GPIO对应的寄存器,这样才能更容易去理解GPIO的驱动原理。

这篇内容是无际单片机编程lora模块项目其中一节课内容,会配套有视频教程。

1.STM8单片机的标准库中,不仅包括了我们单片机库文件,还提供了外设的例程代码,供单片机软件程序开发参考.

如上图所示,标准库中包括了STM8单片机所有的外设历程,我们今天要学习的GPIO的驱动,所以我们打开GPIO文件夹。

2.我们先将\GPIO\GPIO_IOToggle文件下的四个文件复制并代替     \Project\STM8L10x_StdPeriph_Templates 文件下的四个文件,如下图所示。

①\Project\STM8L10x_StdPeriph_Templates 是STM8单片机的一个工程,开发环境是IAR,方便我们移植并打开我们需要的例程文件。

②\Project\STM8L10x_StdPeriph_Templates目录是标准库中的空例程下的四个文件,上图外设例程中只包含了程序文件,并没有工程。 所以我们需要讲例程中的四个文件复制并代替\Project\STM8L10x_StdPeriph_Templates 目录下的四个文件,如上图。

③对应四个文件简单说明:

main.c :  main函数文件

stm8l10x_conf.h:  STM8单片机外设配置文件,可以删除或者增加单片机的外设资源,STM8单片机标准库移植必须包含的.h文件

Stm8l10x_it.c:  STM8中断服务处理入口

Stm8l10x_it.h:  对应.C文件的声明。

3.进入\Project\STM8L10x_StdPeriph_Templates\EWSTM8,打开工程

工程打开如下: 工程第第一句是:#include “stm8l10x.h”,

单片机内部的所有的外设资源,我们都是通过“STM8L10X.H”来调用。

4.我们接着往下看,如下图所示:

①第一步,我们先找一下main函数。

②第二步,GPIO口的初始化操作。

GPIO口的初始化只用到了一个函数。GPIO_Init,如下图

③第三步,参看GPIO口的操作:

通过GPIO_ToggleBits函数来完成单片机的反转。

我们先透析一下GPIO_Init函数。GPIO_Init函数原型如下:

void GPIO_Init(GPIO_TypeDef* GPIOx,uint8_t GPIO_Pin,GPIO_Mode_TypeDef GPIO_Mode)

共包括3个参数:

①GPIO_TypeDef* GPIOx :  单片机IO的端口,PA,PB,PC,PD 四个选项

#define GPIOA ((GPIO_TypeDef *) GPIOA_BaseAddress)#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)#define GPIOC ((GPIO_TypeDef *) GPIOC_BaseAddress)#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress)

②uint8_t GPIO_Pin: GPIO端口对应的脚位: 如下图所示。

typedef enum{GPIO_Pin_0    = ((uint8_t)0x01),  /*!< Pin 0 selected */GPIO_Pin_1    = ((uint8_t)0x02),  /*!< Pin 1 selected */GPIO_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 = ((uint8_t)0x0F),  /*!< Low nibble pins selected */GPIO_Pin_HNib = ((uint8_t)0xF0),  /*!< High nibble pins selected */GPIO_Pin_All  = ((uint8_t)0xFF)   /*!< All pins selected */}GPIO_Pin_TypeDef;

③GPIO_Mode_TypeDef GPIO_Mode:配置单片机IO输入输出的模式:

typedef enum{GPIO_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 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,   /*!< Output open-drain, low level, 10MHz */GPIO_Mode_Out_PP_Low_Fast  = (uint8_t)0xE0,   /*!< Output push-pull, low level, 10MHz */GPIO_Mode_Out_OD_Low_Slow  = (uint8_t)0x80,   /*!< Output open-drain, low level, 2MHz */GPIO_Mode_Out_PP_Low_Slow  = (uint8_t)0xC0,   /*!< Output push-pull, low level, 2MHz */GPIO_Mode_Out_OD_HiZ_Fast  = (uint8_t)0xB0,   /*!< Output open-drain, high-impedance level, 10MHz */GPIO_Mode_Out_PP_High_Fast = (uint8_t)0xF0,   /*!< Output push-pull, high level, 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;

举例来说明GPIO端口的初始化操作,如历程所示,初始化STM8单片机的GPIO口的PD4,PD5,PD6为输出高速上拉模式。

初始化的端口是GPIOD

对应的GPIO口脚位是PIN4,PIN5,PIN6

模式是:GPIO_Mode_Out_PP_Low_Fast。

4.接下来我们在进一步了解GPIO口的其他的库函数。我们打开stm8l10x_gpio.h文件,如下图所示:

对于我们单片机开发应用来说,讲到这里基本上就可以操作应用了,没有必要进一步再去深挖。我们现在根据我们的开发板先简单的举个例子来练习一下GPIO的简单的使用和开发。

5.我们先打开Lora模块的原理图,如下图所示:

实验一:我们要讲PA3的端口配置成 输出高电平。

我们打开上节可搭建的工程,编辑程序,程序代码如下:

我们编译一下,发送有错误,如下:

如何处理错误,我们需要屏蔽掉conf.h 文件中的#define USE_FULL_ASSERT    1  语言,如下图,再编译通过。

接下来,我们链接目标板,烧录程序验证测试结果。因PA3外部悬空,我们通过示波器来测试PA3端口的高低电平。

接下来我们做其他实验

实验2: PA3端口输出低电平

实验3: 配置PA3端口为输入模式,检测PA3端口的高低电平。

再这里就给大家不一一介绍了。

6.接下来,我们再深入的探讨一下GPIO口。因为单片机的库函数最终是对单片机的内部寄存器的操作,所以再这里给大家简单的介绍一下GPIO的寄存器。

我们打开STM8单片机的数据手册,根据目录跳到GPIO口部分,来产看GPIO的寄存器说明:

STM8单片机共有5个寄存器来配置GPIO口。

第一个: Px_ODR  输出配置寄存器。

输出配置寄存器,配置为1输出高电平,0,输出低电平。

第二个寄存器: PX_IDR  输入状态寄存器

读取本寄存器,获取GPIO的输入状态, 1为高电平 0为低电平

第三个寄存器: Px_CR1 配置端口的输入输出模式。

配置为1 表示端口为输出模式,0表示为输入模式

第四个寄存器: PX_CR1输入输出模式寄存器1:

本寄存器配置和和第三个寄存器相关:

端口模式为输入模式:

配置为1,表示端口是上拉输入模式

配置为0,表示端口是悬空输入模式

端口模式为输出模式:

配置为1,上拉输出

配置为0,开漏输出

第五个寄存器: PX_CR2输入输出模式寄存器2: 

本寄存器配置和第三个寄存器配置相关:

端口模式为输入模式:

配置为1,端口外部终端使能

配置为0,端口外部终端不使能

端口模式为输出模式:

配置为1,输出的速率是10MHZ

配置为0,输出的速率是2MHZ

综上就是STM8单片机GPIO的介绍,关于内部寄存器,大家可以通过GPIO的库文件对应学习。

STM8单片机GPIO口的驱动深度解析相关推荐

  1. c语言单片机驱动数码管程序,51单片机IO口直接驱动LED数码管方法

    1.实验任务 如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地.在数码管上循环显示0-9数字,时间间隔0.2秒. 2.电路原 ...

  2. 51单片机c语言io口程序,51单片机IO口直接驱动LED数码管方法

    1.实验任务 如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地.在数码管上循环显示0-9数字,时间间隔0.2秒. 2.电路原 ...

  3. 51单片机喇叭c语言,c51单片机io口直接驱动喇叭,播放《挥着翅膀的女孩》.....

    #include #include #include main() { InitialSound(); Play(Music_Girl,0,2,350); while(1) { } } //挥着翅膀的 ...

  4. STM8单片机定时器驱动的深度解析

    上一节给大家介绍了基于标准库STM8单片机GPIO的驱动,本节课主要给大家介绍一下STM8定时器的驱动. 我们先打开STM8L10x单片机的规格书,简单的了解一下STM8L10X单片机的定时器功能. ...

  5. 单片机c语言怎么把p0口换p1口,关于51单片机P0口的结构及上拉问题

    1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构.高电平时,V1打开,V2截止:低电平时,V1截止,V2打开.这种情况下不用外接上拉电阻.而且,当V1打开,V2截止,输出高电平的时候, ...

  6. m0单片机io口_51单片机蜂鸣器

    蜂鸣器实验 * 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电子设备.电话机.定时器等电子产品中作发声器件.蜂鸣器主要分为压电 ...

  7. STM8单片机串口驱动的深度解析

    串口是单片机最重要的外设之一,在很多项目开发中都有应用,Lora模块的外部通讯方式就是串口. 本节简单的和大家解析一下串口通讯及驱动代码的编程. STM8L101F3单片机支持一路串口通讯.我们先看一 ...

  8. MTK 驱动开发(3)---GPIO口的使用方法汇总

    1简介 GPIO=General Purpose Input Output,通用输入输出.有时候简称为"IO口".通用,就是说它是万金油,干什么都行.输入输出,就是说既能当输入口使 ...

  9. 2008年12月13日上海USB驱动开发深度解析讲座PPT

    讲座PPT:宋宝华2008年12月13日上海USB驱动开发深度解析讲座PPT [url]http://www.linuxdriver.cn/200812/20081213172619_836.rar[ ...

最新文章

  1. RTP/RTSP/RTCP 协议详解
  2. 引入OAuth2的主要目的
  3. SQL SERVER 2008安全配置
  4. html5手机移动端三级联动城市选择器
  5. NUC1921 E.迷雾森林【筛选法】
  6. NodeJS Stream 五:双工流
  7. 考研数学线上笔记(二):凯哥不定积分计算系列课程
  8. 网络安全与渗透测试工具导航
  9. 计算机无法启动printspooler,Win7系统下print spooler服务无法启动的解决方法
  10. 中国oracle ace名单
  11. Codeforces 128 A Statues【预处理+Bfs】
  12. Windows安装hadoop
  13. FreeSWITCH的端口设置
  14. Extjs介绍(一)
  15. 小乌龟提交本地的文件夹下多个项目
  16. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。到第10天早上时,只剩下一个,求第一天有多少桃子。
  17. linux ram大小 arm,在linux / arm下对RAM(无ECC)进行基准测试的最佳方法是什么?
  18. 如何用SpreadJS添加背景图片和水印?
  19. python系列-认识python
  20. python批量修改json文件

热门文章

  1. 刚刚!华为突然传来这一消息,我想辞职了
  2. Spring基础专题——第八章(事务)
  3. k8s概念入门之kubelet-针对1.1.版本阅读
  4. 在Linux系统中安装pycharm详解
  5. Python Beautiful Soup类的基本元素
  6. 一文看懂MYCAT数据库服务器!
  7. 通俗易懂理解~图机器学习导论
  8. 如何使用OpenCV和Socket进行视频聊天?
  9. 什么是 Canny 边缘检测算法?
  10. CloudStats :一款SaaS 服务器监控工具