STM8 GPIO入门讲解笔记

合集下载

STM8的按键程序学习笔记

STM8的按键程序学习笔记
{
key_delay_count++; //延时计数器开始计数
if(key_delay_count>=65530)
{key_delay_count=0;key_down_IF=0;} //按键按下时间过长,则是故障,不执行按键反馈
if(key_delay_count>=key_delay_long)
//#define key_1_in() {(GPIO_ReadInputPin(GPIOC, GPIO_PIN_5)==SET)? 1:0}
/*设置端口按键中断的触发方式下降沿和低电平触发*/
#define key_int_way EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
//#define key_short 0x01; //定义短按键值,按键按下后根据按键1号按键短按最终键值为0x11,长按为0x12.类推
//#define key_long 0x02; //定义长按键值,
//#define key_short 0x01;
//#define key_short 0x01;
注意:系统中断函数中有按键扫描的部分程序INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 4)等。
调用方法:
void key_port_init();//按键端口的定义
void scan_key();//按键的扫描程序,放在定时器中断中,定时器1ms中断。
extern unsigned char key_down_IF=0x00; //在中断函数中加入变量声明
void key_interrupt_do()

STM8 库函学习笔记之CLK

STM8 库函学习笔记之CLK

//-----------------------------------------------------------------------------------------
2 void CLK_HSECmd(FunctionalState NewState);
启用或禁用外部高速振荡器(HSE)
启用或禁用内部高速振荡器(HSI 16MHz)
参数: NewState: 新的状态值 DISABLE 禁用 ENABLE 启用
返回值:无
//-----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------1 void CLK_DeInit(void);
1 / 10
STM8 库函数学习笔记之时钟树解析
2012-12.12
恢复相关的时钟寄存器到默认值
clkflaglsirdy内部低速振荡器就绪标志clkflaghsirdy内部高速振荡器就绪标志clkflaghserdy外部高速振荡器就绪标志clkflagswif时钟切换中断标志clkflagswbsy时钟切换忙标志clkflagcssd系统时钟安全检测标志clkflagaux辅助振荡器的开关状态如果辅助振荡器hsi8开并做为当前的主时钟源clkflagccobsy可配置的时钟输出忙用于指示所选的cco时钟源正处于切换状态clkflagccordy可配置的时钟输出就绪用于指示所选的cco时钟源正处稳定状态返回值

STM8学习笔记——时钟和GPIO

STM8学习笔记——时钟和GPIO

STM8学习笔记——时钟和GPIO说起STM8 的时钟,那还真是个杯具,用HSI 没问题,切换到HSE 也没问题,就是切LSI 怎么都不行,然后百思不得其解人,然后上论坛求教,才知道还有个选项字节(OPTION BYTE),数据手册上有这么一段描述:选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。

除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份的互补格式(NOPTx)要使用内部低速RC 必须将LSI_EN 置1,就是这个地方让我纠结了半天,然后用IAR 将其置1,方法是:进入调试模式,在上面有个ST-LINK,点击,看到OPTION BYTE,左键点进去,右键单击上面的选项,就可更改了,然后全速运行,就写进去了。

STM8 的时钟分为HSI,HSE,LSI,最常用的是HSI,STMS105S4 内置的是16M 的RC,叫fhsi。

它可以分频输出为fhsidiv=fhsi/hsidiv,如果选择其为主时钟源,那么主时钟fmaster=fhsidiv。

CPU 时钟fcpu=fmaster/cpudiv。

可以通过外设时钟门控寄存器CLK_PCKENR1 和CLK_PCKENR2 选择是否与某个外设连接。

好了上个切换内部时钟的源代码,测试通过void CLK_Init(void){ //切换到内部LSI(!!!需要修改选项字节的LSI_EN 为1)CLK_ICKR|=0x08;//开启内部低速RC 震荡while(CLK_ICKR&0x10==0); //LSI 准备就绪CLK_SWR=0xd2; while(CLK_SWCR&0x08==0); //等待目标时钟源就绪CLK_SWCR|=0x02; //CPU 分频设置CLK_CKDIVR=0;//内部RC 输出。

STM8自学笔记

STM8自学笔记

STM8 实战篇
一、参考文档《STM8单片机入门V3.0》安装软件。

建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。

(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。

下面开始编写程序
硬件中PE5口有一个LED。

做一个闪烁灯。

在线
使用标准库:
和上面一样建立普通的工程。

从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。

可以建立如下的结构
添加文件为
编译后成功。

当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。

小菲教你STM8单片机基础入门

小菲教你STM8单片机基础入门
STM8S主要特点:
速度达20 MIPS的高性能内核 抗干扰能力强,品质安全可靠 领先的130纳米制造工艺,优异的性价比 程序空间从4K到128K, 芯片选择从20脚到80脚,宽范围产品系列 系统成本低,内嵌EEPROM和高精度RC振荡器 开发容易,拥有本地化工具支持
STM8S主要应用:
STM8L主要特点:
STM8 16 MHz CPU 内置 4-32 KB 闪存,多达 2KB SRAM 三个系列:跨系列的引脚对引脚兼容、软件相互兼容、外设相互兼容 电源电压:1.8 V-3.6 V (断电时,最低 1.65 V) 超低功耗模式:保持 SRAM 内容时,最低功耗 350nA 运行模式动态功耗低至 150μA/MHz 最先进的数字和模拟外设接口 工作温度范围:-40°C 到+85 °C,可高达 125 °C 免费的触感固件库
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-7-
1.3 STM8A 系列
意法半导体公司推出的 STM8A 是一款专门用于满足汽车应用的特殊需求的 8-位 Flash 微控制器。这些模块化产品提供了真数据 EEPROM 以及软件和引脚兼容性,适用的程序存 储器尺寸范围为 8KB 至 256KB 和 20 至 128-引脚封装。所有器件的工作电压均为 3V 至 5V, 并且其工作温度扩展到了 145°C。
监控、紧急求助
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-4-
STM8S 产品分为“Access Line(入门级)”和“Peroformance Line(增强型)”,如 下图所示。
王志杰 Email: iewangzhijie@ QQ:411238869

stm8gpio库函数笔记

stm8gpio库函数笔记

STM8库函数学习笔记之GPIO【整理者】【提供者】885783【详细说明】STM8库函数学习笔记之GPIOSTM8库函数学习笔记之GPIO作者:BH7KQK日期:2010.12.30相关的函数:void GPIO_DeInit(GPIO_TypeDef* GPIOx);void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDefGPIO_Mode);void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal);void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);u8 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);u8 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin,FunctionalState NewState);//---------------------------------------------------------------------------------------void GPIO_DeInit(GPIO_TypeDef* GPIOx);这个函数用来恢复指定端口的寄存器ODR、DDR、CR1及CR2到默认值0x00,即无中断功能的浮动输入,无返回值。

STM8 GPIO入门讲解笔记

STM8 GPIO入门讲解笔记

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 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, 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,GPIO_Mode_In_FL_IT);注释已经写得很明白了。

STM8S学习笔记之三(STM8 SysClk)

STM8S学习笔记之三(STM8 SysClk)

STM8S 学习笔记之三(STM8 SysClk)STM8S 系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。

举个例子,做AVR 时在高稳定的串口通讯时用的时钟一般是3.6864M,主要是这个算波特率精确。

STM8S 同样重要。

STM8S 时钟源:●1-24MHz高速外部晶体振荡器(HSE) ●最大24MHz 高速外部时钟信号(HSE user-ext) ●16MHz高速内部RC 振荡器(HSI) ●128KHz低速内部RC(LSI) 各个时钟源可单独打开或关闭,从而优化功耗。

对于我这么懒得人一般都是用的内部或者外部晶振。

这个芯片时钟方面很大的一个亮点就是时钟可以自由分频。

在降低功耗方面,如果有特殊需求的时候还是考虑STM8L 系列或者430 的吧,不得不承认术业有专攻。

按照技术手册寄存器功能给寄存器赋值写成一下函数://启动时钟配置void SysClkInit(void) { // CLK_SWR=0xe1; //HSI 为主时钟源CLK_SWR=0xb4; //HSE 为主时钟源CLK_CKDIVR=0x00;//CPU 时钟0 分频,系统时钟0 分频CLK_CSSR=0x01;//时钟安全监测使能CLK_SWCR=0x02;//使能自动时钟切换}首先设置时钟源,也就是时钟是用内部还是外部,如果对时间精度要求不高,用内部也可以。

然后是时钟分频。

这个分频需要设定系统时钟和CPU时钟,这两个时钟,如果对此有特殊要求就得好好斟酌一下了,而我全部不分频。

时钟安全监测还是打开吧,如果用的外部时钟,但是外部时钟突然出现故障的话,单片机会自动启用内部时钟,内部时钟默认为8 分频也就是2M。

然后时钟自动切换,好像这个有没有都可以,去掉能不能使回头再试。

开机初始化,在不调用此函数时CPU 时钟默认开启2M,但是调用此函数后,时钟切换为16M,LED 闪烁速度明显加快、、。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 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, 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,GPIO_Mode_In_FL_IT);注释已经写得很明白了。

玩过430或者stm32的童鞋应该多少都知道,这些比较新款的单片机,跟以前的51不太一样,那就是外部中断源贼多,而且是跟着gpio走的。

坦白说,现在回想起来,其实51的外部中断也是跟着io口走的,想起来了吗?INT0和INT1就是P3.0和P3.1,只不过它少一点而已。

但鉴于我们现在是要入门,所以,我们先不管中断——说起来,玩这个还真费了我不少劲,不过说起来已经不错了,哈哈,那时候STM32还不会定时中断呢(当然,现在也没弄定时,但既然外部中断都会了,想来也差不多吧~~~)所以,我们的目标先设得简单一点:我们只要实现基本的gpio读写功能,读用来读按键,写用来点亮LED。

右键就可以点开相关函数的定义位置(这里说一下,所谓定义,对函数来说,就是函数实现,与函数声明区分,在讨论程序时,我提到实现,大多是指的都是这个意义上的实现,而不再是一般说的那个实现的意思。

)void GPIO_Init(GPIO_TypeDef* GPIOx,uint8_t GPIO_Pin,GPIO_Mode_TypeDef GPIO_Mode)没事,我们不会去看源码。

我们只要看函数接口。

一个是gpio的port口,一个是gpio的pin数,一个是gpio的配置模式。

对单片机比较熟悉的朋友基本不用多说,这里还是简单说一下,在单片机里,io口都是按组划分。

比如说,最常见的8位机一组8个,然后可能有4到6组。

当然也有16位机的16个一组,让我有点奇怪的是STM32是32位ARM,一组却也只有16个。

更有甚者,比如我玩的一个32位系统,居然只有8个一组,看来这个跟位数没必然关系。

说了这么多,我们来看看我们这个stm8l-discover开发套件上的gpio口情况。

用不着看pdf,从开发板引出的管脚就知道。

它总共有41个io口,共分6组,五组8个,最后一组1个,它以A~F按顺序命名。

分别是GPIOA~GPIOF.这就是我们的port然后每组分8位,这就是我们的pin。

好了,现在我们搞清楚数目上的状况了。

我们再看第三个参数,IO口类型。

我们可以通过查看gpio.h这个头文件获取相关的信息。

看的时候不妨多看一些我们曾见到的熟面孔,这样会加快熟悉对与其相关的宏和操作函数的了解程度。

比如说,首先我们看到的就是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, /*!< 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 = (uint8_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 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;这是个结构体,如果你熟悉,光看名字就猜到了,如果你不熟悉,看看英文注释也差不多了,当然,假如你对电路的了解不深,那可能不知其所然。

而对我来说,尽管我了解这些都是什么玩意,但是对于部分模式,我并不了解它的作用和意义。

于是我另外花了一些时间,去找这方面的的信息看,最后找到一份周立功的文档,感觉相当不错,比起那些坑爹的强太多了——说的都是废话。

基本就是把STC那种乱七八糟的pdf里的内容半通不通地翻译成中文而已。

没有任何解释。

具体的文档可以上百度搜索,我记得我是请朋友帮我在百度文库里下的,刚找了找,没找着,下次看看补上链接什么的。

下面是简单总结:基本输入电路基本IO输入电路施密特触发输入电路弱上拉输入电路基本IO输入,三态缓冲器,只在读取时,外部状态会反映到内部总线上,其余时刻不影响内部电路。

读取时,CPU发出一个外部选通信号施密特输入电路对外部输入脉冲进行整形,它可以去除某种程度的抖动。

带外部弱上拉的输入电路弱上拉的好处是对外部干扰信号有较好的抵抗能力,但输入阻抗显著降低。

而悬空态的输入电路,对于干扰信号抵抗能力较差。

至于输出,实际上只有两种:1 开漏输出2 内部上拉输出。

对这两个我简单解释一下,开漏和开集电极是很接近的。

这里的漏说的是场效应管的漏极,它在功能上类似于三极管的集电极。

英文称之为 open drain 和 open collection,也就是别人总是神侃的OD门和OC门。

它就是少了一个上拉电阻,我个人认为它的最大意义有两个:1 第一,它不怕外部IO短路,可以起相当的保护作用。

2 它适合不同电平之间的匹配,比如常见的5V系统和3.3V系统。

但它的缺陷却是,输出的电平是不定的。

也就是高不一定能高到电源电压,低不能低到地的零电平。

而外部上拉,它则可以保证输出永远是稳定的高或者低电平,但是,很显然它遇到IO短路,会有烧毁IO口的危险。

关于这一部分,其实我并没说的很明白,这其中的内容,咱们有需要再多找资料看吧,嘿嘿,我懂的也就这么多了。

我们这里普普通通,只用外部上拉输入和外部上拉输入输出。

接着看一下这个不是很长的头文件。

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;首先是这个结构体,注意观察,从0到7很有规律的是十六进制的 01到80,显然这是位操作模式。

相关文档
最新文档