STM8 库函学习笔记之GPIO
深入浅出stm8单片机入门、进阶与应用实例

深入浅出stm8单片机入门、进阶与应用实例STM8单片机是一款性能优越、功能丰富的微控制器,被广泛应用于嵌入式系统中。
本文将从深入浅出的角度,为大家介绍STM8单片机入门、进阶以及实际应用案例。
一、STM8单片机入门1. STM8单片机概述STM8单片机是意法半导体公司推出的一款8位微控制器,采用了高性能的STM8内核和丰富的外设资源。
相比其他8位单片机,STM8单片机具有更高的性能、更丰富的功能和更低的功耗。
2. STM8单片机编程语言STM8单片机支持多种编程语言,包括C语言、汇编语言、BASIC语言等。
其中,C语言是最常用的一种编程语言,具有语法简单、易于理解等优点。
3. STM8单片机开发环境STM8单片机开发环境包括开发工具和编程器。
常用的开发工具有IAR Embedded Workbench、ST Visual Develop、Keil uVision等。
编程器可以选择ST-Link/V2、ST-Link/V3、J-Link等。
4. STM8单片机基础知识STM8单片机基础知识包括IO口、定时器、中断等。
掌握这些基础知识是学习STM8单片机的基础。
其中,IO口用于接收或输出数字信号,定时器用于计时、测量时间等,中断用于实现程序的异步处理。
二、STM8单片机进阶与实践1. STM8单片机外设应用STM8单片机具有丰富的外设资源,包括GPIO、I2C、SPI、USART、ADC等。
这些外设可以满足不同应用场景的需求。
例如,GPIO用于控制LED等外围设备,I2C和SPI用于连接外部设备,USART用于串口通信,ADC用于模拟信号的采集。
2. STM8单片机通信协议STM8单片机支持多种通信协议,包括UART、I2C、SPI等。
这些通信协议可以实现与其他设备的通信,例如与传感器、显示器、无线模块等设备的通信。
不同的通信协议有着不同的特点和应用场景,需要根据实际需求选择合适的协议。
3. STM8单片机中断技术中断是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

//-----------------------------------------------------------------------------------------
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 的时钟,那还真是个杯具,用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单片机入门V3.0》安装软件。
建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。
(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。
下面开始编写程序
硬件中PE5口有一个LED。
做一个闪烁灯。
在线
使用标准库:
和上面一样建立普通的工程。
从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。
可以建立如下的结构
添加文件为
编译后成功。
当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。
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入门讲解笔记

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的寄存器的地址在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有关的这五个寄存器就被安排在了0x00 5000~0x00 5004这5个地址空间中,它们有一个0x005000的基地址,分别偏移0,1,2,3,4。
”stm8s.h"中与GPIO有关的定义,以及固件库中访问外围设备寄存器的方法typedef struct GPIO_struct{vu8 ODR; /*!< Output Data Register */vu8 IDR; /*!< Input Data Register */vu8 DDR; /*!< Data Direction Register */vu8 CR1; /*!< Configuration Register 1 */vu8 CR2; /*!< Configuration Register 2 */}GPIO_TypeDef;#define GPIOA_BaseAddress 0x5000#define GPIOB_BaseAddress 0x5005#define GPIOC_BaseAddress 0x500A#define GPIOD_BaseAddress 0x500F#define GPIOE_BaseAddress 0x5014#define GPIOF_BaseAddress 0x5019#define GPIOA ((GPIO_TypeDef *) GPIOA_BaseAddress)#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)#define GPIOC ((GPIO_TypeDef *) GPIOC_BaseAddress)#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress)#define GPIOE ((GPIO_TypeDef *) GPIOE_BaseAddress)#define GPIOF ((GPIO_TypeDef *) GPIOF_BaseAddress)在结构体GPIO_TypeDef中,ODR,IDR,DDR,CR1,CR2的偏移分别是0,1,2,3,4正好与STM8S208RB对这几个安排一致,当我们将0x5000这个地址转换为指向GPIO_TypeDef的指针后,我们就可以用类似GPIOA->ODR的方法访问寄存器了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM8库函数学习笔记之GPIO相关的函数:1 void GPIO_DeInit(GPIO_TypeDef* GPIOx);2 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode);3 void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal);4 void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);5 void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);6 void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);7 u8 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);8 u8 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);9 BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);10 void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState);//---------------------------------------------------------------------------------------void GPIO_DeInit(GPIO_TypeDef* GPIOx);这个函数用来恢复指定端口的寄存器ODR、DDR、CR1及CR2到默认值0x00,即无中断功能的浮动输入,无返回值。
参数:GPIOx: GPIOA到GPIOI可选。
示例: 恢复GPIOB的相应寄存器为默认值GPIO_DeInit(GPIOB);//---------------------------------------------------------------------------------------void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode);这个函数用来配置指定端口的各个引脚功能,无返回值。
参数:GPIOx: 端口GPIOA到GPIOI可选。
GPIO_Pin: 要初始化的引脚,可以用“或”方式选择多个引脚,可选值:GPIO_PIN_0 选择 0 引脚GPIO_PIN_1 选择 1 引脚GPIO_PIN_2 选择 2 引脚GPIO_PIN_3 选择 3 引脚GPIO_PIN_4 选择 4 引脚GPIO_PIN_5 选择 5 引脚GPIO_PIN_6 选择 6 引脚GPIO_PIN_7 选择 7 引脚GPIO_PIN_LNIB 低四位引脚选择,即同时选择PIN_0到PIN_3。
GPIO_PIN_HNIB 高四位引脚选择,即同时选择PIN_4到PIN_7。
GPIO_PIN_ALL 选择全部引脚,即同时选择PIN_0到PIN_7。
GPIO_Mode:工作模式。
可选值:GPIO_MODE_IN_FL_NO_IT 无中断功能的浮动输入。
GPIO_MODE_IN_PU_NO_IT 无中断功能的上拉输入。
GPIO_MODE_IN_FL_IT 带中断功能的浮动输入。
GPIO_MODE_IN_PU_IT 带中断功能的上拉输入。
GPIO_MODE_OUT_OD_LOW_FAST 高速开漏低电平输出,可工作到10MHz。
GPIO_MODE_OUT_PP_LOW_FAST 高速推挽低电平输出,可工作到10MHz。
GPIO_MODE_OUT_OD_LOW_SLOW 低速开漏低电平输出,可工作到2MHz。
GPIO_MODE_OUT_PP_LOW_SLOW 低速推挽低电平输出,可工作到2MHz。
GPIO_MODE_OUT_OD_HIZ_FAST 高速开漏高阻态输出,可工作到10MHz。
GPIO_MODE_OUT_PP_HIGH_FAST 高速推挽高电平输出,可工作到10MHz。
GPIO_MODE_OUT_OD_HIZ_SLOW 低速开漏高阻态输出,可工作到2MHz。
GPIO_MODE_OUT_PP_HIGH_SLOW 低速推挽高电平输出,可工作到2MHz。
示例: 把GPIOB的引脚0、1、4配置为高速推挽高电平输出。
GPIO_Init(GPIOB, (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4), GPIO_MODE_OUT_PP_HIGH_FAST);//---------------------------------------------------------------------------------------void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal);这个函数用来输出一个八位的值到指定的端口,无返回值。
所需条件:该端口必须配置为输出模式。
参数:GPIOx:端口GPIOA到GPIOI可选。
PortVal:为无符号8位数值。
示例: 端口B输出0x22。
GPIO_Write(GPIOB, 0x22);//---------------------------------------------------------------------------------------void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);这个函数用来置位指定端口的一个或多个引脚,即置相应引脚输出为高电平,无返回值。
所需条件:该端口必须配置为输出模式。
参数:GPIOx:端口GPIOA到GPIOI可选。
PortPins: 要置位引脚,可以用“或”方式选择多个引脚,可选值:GPIO_PIN_0 选择 0 引脚GPIO_PIN_1 选择 1 引脚GPIO_PIN_2 选择 2 引脚GPIO_PIN_3 选择 3 引脚GPIO_PIN_4 选择 4 引脚GPIO_PIN_5 选择 5 引脚GPIO_PIN_6 选择 6 引脚GPIO_PIN_7 选择 7 引脚GPIO_PIN_LNIB 低四位引脚选择,即同时选择PIN_0到PIN_3。
GPIO_PIN_HNIB 高四位引脚选择,即同时选择PIN_4到PIN_7。
GPIO_PIN_ALL 选择全部引脚,即同时选择PIN_0到PIN_7。
示例: 把GPIOB的引脚0和引脚3置位。
GPIO_WriteHigh(GPIOB, (GPIO_PIN_0 | GPIO_PIN_3));//---------------------------------------------------------------------------------------void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);这个函数用来复位指定端口一个或多个引脚的电平,即置相应引脚输出为低电平,无返回值。
所需条件:该端口必须配置为输出模式。
参数:GPIOx:端口GPIOA到GPIOI可选。
PortPins: 要复位引脚,可以用“或”方式选择多个引脚,可选值:GPIO_PIN_0 选择 0 引脚GPIO_PIN_1 选择 1 引脚GPIO_PIN_2 选择 2 引脚GPIO_PIN_3 选择 3 引脚GPIO_PIN_4 选择 4 引脚GPIO_PIN_5 选择 5 引脚GPIO_PIN_6 选择 6 引脚GPIO_PIN_7 选择 7 引脚GPIO_PIN_LNIB 低四位引脚选择,即同时选择PIN_0到PIN_3。
GPIO_PIN_HNIB 高四位引脚选择,即同时选择PIN_4到PIN_7。
GPIO_PIN_ALL 选择全部引脚,即同时选择PIN_0到PIN_7。
示例: 把GPIOB的引脚0和引脚3置为低电平。
GPIO_WriteLow(GPIOB, (GPIO_PIN_0 | GPIO_PIN_3));//---------------------------------------------------------------------------------------void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);这个函数用来取反指定端口的一个或多个引脚的电平状态,如果当前该引脚为高电平则置为低电平,如果为低电平则置为高电平,无返回值。
所需条件:该端口必须配置为输出模式。
参数:GPIOx:端口GPIOA到GPIOI可选。
PortPins: 要取反的引脚,可以用“或”方式选择多个引脚。
可选值:GPIO_PIN_0 选择 0 引脚GPIO_PIN_1 选择 1 引脚GPIO_PIN_2 选择 2 引脚GPIO_PIN_3 选择 3 引脚GPIO_PIN_4 选择 4 引脚GPIO_PIN_5 选择 5 引脚GPIO_PIN_6 选择 6 引脚GPIO_PIN_7 选择 7 引脚GPIO_PIN_LNIB 低四位引脚选择,即同时选择PIN_0到PIN_3。
GPIO_PIN_HNIB 高四位引脚选择,即同时选择PIN_4到PIN_7。
GPIO_PIN_ALL 选择全部引脚,即同时选择PIN_0到PIN_7。
示例: 取反GPIOB的引脚0和引脚3的电平状态。
GPIO_WriteReverse(GPIOB, (GPIO_PIN_0 | GPIO_PIN_3));//---------------------------------------------------------------------------------------u8 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);这个函数用来读取指定端口的数据,返回一个八位无符号值。
所需条件:该端口必须配置为输入模式。
参数:GPIOx:端口GPIOA到GPIOI可选。