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的方法访问寄存器了。
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 闪烁速度明显加快、、。
STM8S学习笔记
main() {
unsigned char i; TIM_Init();
// 初始化定时器
while(1)
// 进入无限循环
{ // 下面的循环将占空比逐渐从 0 递增到 50%
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM2_IER = 0x01;
// 允许更新中断
_asm("rim");
// 允许 CPU 全局中断
while(1)
// 进入无限循环
{
}
}
// 函数功能:定时器 4 的更新中断服务程序 // 输入参数:无 // 输出参数:无
// 返 回 值:无
PD_CR1 = 0x08; PD_CR2 = 0x00;
// 将 PD3 设置成推挽输出
// 然后初始化定时器 4
TIM4_IER = 0x00;
// 禁止中断
TIM4_EGR = 0x01;
// 允许产生更新事件
TIM4_PSCR = 0x07;
// 计数器时钟=主时钟/128=2MHZ/128
TIM2_CCER1 = TIM2_CCER1 | 0x30; // CC polarity low,enable PWM output */ // CC2P = 1,低电平为有效电平 // CC2E = 1,开启输出引脚
//初始化自动装载寄存器,决定 PWM 方波的频率, //Fpwm=4000000/256=15625HZ TIM2_ARRH = 0; TIM2_ARRL = 0xFF; //初始化比较寄存器,决定 PWM 方波的占空比 TIM2_CCR2H = 0; TIM2_CCR2L = 0; // 初始化时钟分频器为 1,即计数器的时钟频率为 Fmaster=4MHZ TIM2_PSCR = 0; // 启动计数 TIM2_CR1 = TIM2_CR1 | 0x01; }
STM8教程-第七章-STM8S207-GPIO模块及其应用
if(PA_IDR & 0x01 == 1) //判断PA0口的状态
也可以单独读取一个IO口,例如
if(PA_IDR_IDR0 == 1) //效率比上面的更好
7.3IO口基础应用实例
本节以通用IO口简单应用的角度讲解如何控制LED灯和按键开关信号,通过几个实例的介绍,让读者掌握IO口的使用和编程方法。
3、可选择的输出模式:推挽式输出和开漏输出
4、数据输入和输出采用独立的寄存器
5、外部中断可以单独使能和关闭
6、输出摆率控制用以减少EMC噪声
7、片上外设的I/O功能复用
8、当作为模拟输入时可以关闭输入施密特触发器来降低功耗
9、在数据输出锁存时支持读-修改-写
10、输入兼容5V电压
11、I/O口工作电压围为1.6 V到VDDIOmax
*/
void delay_ms(int value)
{
int i,j;
if(value < 1)
value = 1;
for(i=0;i!=value;++i)
for(j=0;j!=5000;++j);
}
编译下载后就可以验证实验的结果。
7.4本章小结
本章开始了STM8S207的实例编程,这里选择了最为简单的IO操作的编程,同时希望读者在熟悉STM8S207的基本IO口操作后可以实现更多更为复杂的功能
实例程序如下所示。
#include "iostm8s207rb.h"
typedef unsigned char uchar;
void delay_ms(int value);
int main( void )
STM8的GPIO特性分析
STM8的GPIO主要功能:● 端口的各个位可以被单独配置● 可选择的输入模式:浮动输入和带上拉输入● 可选择的输出模式:推挽式输出和开漏输出● 数据输入和输出采用独立的寄存器● 外部中断可以单独使能和关闭● 输出摆率控制用以减少EMC噪声● 片上外设的I/O功能复用● 当作为模拟输入时可以关闭输入施密特触发器来降低功耗● 在数据输出锁存时支持读-修改-写● 输入兼容5V电压● I/O口工作电压范围为1.6 V 到V DDIOmax每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。
一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器的状态。
GPIO的每个端口由输出数据寄存器(ODR),引脚输入寄存器(IDR),数据方向寄存器(DDR)控制,控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出模式配置。
模式配置图为:可以得出将DDRx 位清零就选择了输入模式。
在该模式下读IDR寄存器的位将返回对应I/O引脚上的电平值。
将DDRx 位置1就选择了输出模式。
在该模式下向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口。
读IDR的位将会返回相应的I/O引脚电平值。
通过软件配置CR1,CR2寄存器可以得到不同的输出模式:上拉输出,开漏输出。
复位后引脚状态为悬空输入。
* 注意!!没有使用的I/O口要连接到固定的电平值,上拉或下拉。
另有三个寄存器端口x 输出数据寄存器(Px_ODR),端口x 输入寄存器(Px_IDR)(可读),端口x 数据方向(Px_DDR)[0输入:1输出]。
均为8位寄存器。
还有两个配置寄存器端口x 控制寄存器1 (Px_CR1),端口x 控制寄存器2 (Px_CR2)。
库函数中的GPIO配置:typedef enum{GPIO_MODE_IN_FL_NO_IT = (uint8_t)0x00, /*浮空输入无中断*/GPIO_MODE_IN_PU_NO_IT = (uint8_t)0x40, /*上拉输入无中断*/GPIO_MODE_IN_FL_IT = (uint8_t)0x20, /*浮空输入有中断*/GPIO_MODE_IN_PU_IT = (uint8_t)0x60, /*上拉输入有中断*/GPIO_MODE_OUT_OD_LOW_FAST = (uint8_t)0xA0, /*开漏-输出低-高速-10MH z*/ GPIO_MODE_OUT_PP_LOW_FAST = (uint8_t)0xE0, /*推挽-输出低-高速-10MHz */ GPIO_MODE_OUT_OD_LOW_SLOW = (uint8_t)0x80, /*开漏-输出低-低速-2MHz */ GPIO_MODE_OUT_PP_LOW_SLOW = (uint8_t)0xC0, /*推挽-输出低-低速-2MHz */ GPIO_MODE_OUT_OD_HIZ_FAST = (uint8_t)0xB0, /*开漏-输出高阻-高速-10MHz */ GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0, /*推挽-输出高-高速-10MHz */ GPIO_MODE_OUT_OD_HIZ_SLOW = (uint8_t)0x90, /*开漏-输出高阻-低速-2MHz */ GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0 /*推挽-输出高-低速-2MHz */ }GPIO_Mode_TypeDef;。
stm8学习笔记
所用芯片 stm8s105s4开发环境:ST Visual DevelopStm8s的库为V1.1.1CPU频率及所有外设频率/时钟系统复位后,所有外设时钟均处于开的状态。
用户可通过清除CLK_PCKENR1或CLK_PCKENR2中的PCKEN位来关闭相应的外设时钟。
但是在关闭外设的时钟前,用户必须设置相应的位禁用该外设。
为了使能一个外设,用户必须先设置寄存器CLK_PCKENR中对应的PCKEN位,然后设置外设控制寄存器中的外设使能位。
AWU计数器是由独立于fMASTER的内部或外部时钟(LSI或HSE)驱动,因此,即使寄存器的时钟已被关掉,该外设依然可以继续运行。
例如禁用所有外设时钟:CLK_PCKENR1 = 0x00;// close all clks of PeripheralCLK_PCKENR2 = 0x00;开启定时器TIME1定时器时钟:CLK_PCKENR1 |= 0x20; //具体参考STM8S_Reference 59页CPU分频因子:CPU时钟(fCPU)由主时钟(fMASTER)分频而来,分频因子由时钟分频寄存器(CLK_CKDIVR)中的位CPUDIV[2:0]决定。
共7个分频因子可供选择(1至128中,2的幂)。
如图13所示。
fCPU为CPU和窗口看门狗提供时钟。
时钟分频寄存器(CLK_CKDIVR)通用端口GPIO和其他的单片机一样,我是习惯从端口开始学习。
Stm8s105s系列最多有7组I/O端口,A~G,而根据不同的封装可能没有其中的一些,在这里根据具体项目,我选择的是44脚封装的。
使用任何的外设前,我们都要根据需要的将参考手册和数据手册看一边,当然端口也不能另外了。
作为通用的IO口,每一个GPIO端口都有5个对应的寄存器如下表:注意:初始复位时,所有引脚设置为浮空输入。
其中1. Px_ODR是ODR[7:0]:端口输出数据寄存器位;(1)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。
STM32F4学习笔记之GPIO(使用固件库)
1. 使能GPIO 的AHB 时钟,使用函数:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);2. 配置GPIO工作模式用GPIO_Init()函数数据类型说明typedef struct{uint32_t GPIO_Pin; // 引脚配置GPIOMode_TypeDef GPIO_Mode; 〃GPIO_Mode_IN(输入),GPIO_Mode_OUT (输出),GPIO_Mode_AF (备用),GPIO_Mode_AN (模拟)GPIOSpeed_TypeDef GPIO_Speed;〃GPIO_Speed_2MHz ,GPIO_Speed_25MHz , GPIO_Speed_5OMHz GPIO_Speed_1OOMHzGPIOOType_TypeDef GPIO_OType; // GPIO_OType_PP (推挽),GPIO_OType_OD (开漏)GPIOPuPd_TypeDef GPIO_PuPd; GPIO_PuPd_NOPULL (无),GPIO_PuPd_UP (上拉),GPIO_PuPd_DOWN (下拉)}GPIO_InitTypeDef;3•备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数void GPIO_Pi nAFCo nfig(GPIO_TypeDef* GPIOx, uin t16_t GPIO_Pi nSource, uint8_t GPIO_AF)* This GPIO_AF can be one of the following values:* @arg GPIO_AF_RTC_50Hz: Co nnect RTC_50Hz pin to AF0 (default after reset)* @arg GPIO_AF_MCO: Co nnect MCO pin (MCO1 and MCO2) to AF0 (default after reset)* @arg GPIO_AF_TAMPER: Conn ect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset)* @arg GPIO_AF_SWJ: Conn ect SWJ pins (SWD and JTAG)to AF0 (default after reset)* @arg GPIO_AF_TRACE: Co nn ect TRACE pins to AF0 (default after reset)* @arg GPIO_AF_TIM1: Conn ect TIM1 pins to AF1* @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1* @arg GPIO_AF_TIM3: Conn ect TIM3 pins to AF2* @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2* @arg GPIO_AF_TIM5: Conn ect TIM5 pins to AF2* @arg GPIO_AF_TIM8: Conn ect TIM8 pins to AF3@arg GPIO_AF_TIM9: Co nn ect TIM9 pins to AF3@arg GPIO_AF_TIM10: Conn ect TIM10 pins to AF3@arg GPIO_AF_TIM11: Co nn ect TIM11 pins to AF3@arg GPIO_AF_I2C1: Conn ect I2C1 pins to AF4@arg GPIO_AF_I2C2: Co nn ect I2C2 pins to AF4@arg GPIO_AF_I2C3: Co nn ect I2C3 pins to AF4@arg GPIO_AF_SPI1: Conn ect SPI1 pins to AF5@arg GPIO_AF_SPI2: Co nn ect SPI2/I2S2 pins to AF5@arg GPIO_AF_SPI3: Co nn ect SPI3/I2S3 pins to AF6@arg GPIO_AF_I2S3ext: Co nn ect I2S3ext pins to AF7@arg GPIO_AF_USART1: Conn ect USART1 pins to AF7@arg GPIO_AF_USART2: Conn ect USART2 pi ns to AF7@arg GPIO_AF_USART3: Conn ect USART3 pi ns to AF7@arg GPIO_AF_UART4: Conn ect UART4 pi ns to AF8@arg GPIO_AF_UART5: Co nn ect UART5 pins to AF8@arg GPIO_AF_USART6: Conn ect USART6 pi ns to AF8@arg GPIO_AF_CAN1: Conn ect CAN1 pins to AF9@arg GPIO_AF_CAN2: Co nn ect CAN2 pins to AF9@arg GPIO_AF_TIM12: Conn ect TIM12 pins to AF9@arg GPIO_AF_TIM13: Conn ect TIM13 pins to AF9@arg GPIO_AF_TIM14: Conn ect TIM14 pins to AF9@arg GPIO_AF_OTG_FS: Co nn ect OTG_FS pins to AF10@arg GPIO_AF_OTG_HS: Conn ect OTG_HS pins to AF10@arg GPIO_AF_ETH: Conn ect ETHERNET pi ns to AF11@arg GPIO_AF_FSMC: Co nn ect FSMC pins to AF12@arg GPIO_AF_OTG_HS_FS: Co nn ect OTG HS (co nfigured in FS) pins to AF12@arg GPIO_AF_SDIO: Conn ect SDIO pins to AF12@arg GPIO_AF_DCMI: Co nn ect DCMI pi ns to AF13@arg GPIO_AF_EVENTOUT: Conn ect EVENTOUT pi ns to AF154. 使用GPIO_ReadI nputData(GPIO_TypeDef* GPIOx)和GPIO_ReadI nputDataBit(GPIO_TypeDef* GPIOx, uin t16_t GPIO_Pi n)读输入信号5. 使用GPIO_SetBits()/GPIO_ResetBits() 设置输出引脚6. 上电或复位后,弓I脚备用功能都没启用(JTAG引脚除外),为悬浮输入状态7. LSE 引脚OSC32_IN 禾口OSC32_OUT ( PC14 and PC15 )的优先级高于GPIO8. HSE 引脚OSC」N/OSC_OUT (PHO / PH1 )的优先级高于GPIO例程:int main(void){GPIO_lnitTypeDef GPIO」nitstructure;/* GPIOG Periph clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_lnitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_lnitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO」nitStructure.GPIO_OType = GPIO_OType_PP;GPIO_lnitStructure.GPIO_Speed = GPIO_Speed_100MH z;GPIO_lnitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, & GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_O;GPIO_lnitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_lnitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_lnitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_12);GPIO_ResetBits(GPIOD, GPIO_Pin_13);while (1){if(GPIO_ReadlnputDataBit(GPIOA,GPIO_Pin_0)==0){GPIO_SetBits(GPIOD, GPIO_Pin_13);GPIO_ResetBits(GPIOD, GPIO_Pin_12);else{GPIO_SetBits(GPIOD, GPI0_Pin_12);GPIO_ResetBits(GPIOD, GPIO_Pin_13);}}}。
stm8学习资料
第一节:心情和时钟说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。
心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,可是我会什么?我会的大大们都写了,我不会的大大们也写了。
一个星期前花项目经费买了***的kit三合一板,最近几天闲了下来,便动手调试一下。
算是有点心得,我又想奉献,可是我会什么?我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。
唠叨了这么多,现在开始吧。
配置: stvd , cosmic我学单片机开门三砖总是要砸的。
第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下第二砖:时钟系统,这等下再说。
第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。
现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。
1 CLK_ECKR |=0X1; //开启外部时钟2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy3 CLK_CKDIVR &= 0XF8; //CPU无分频4 CLK_SWR = 0XB4; //选择外部时钟5 CLK_SWCR |=0X2; //使能外部时钟上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。
就变成了下面的代码CLK_ECKR |=0X1; //开启外部时钟while(!(CLK_ECKR&0X2)); //等待外部时钟rdyCLK_CKDIVR &= 0XF8; //CPU无分频CLK_SWR = 0XB4; //选择外部时钟while(!(CLK_SWCR&0X8)); //这里要等CLK_SWCR |=0X2; //使能外部时钟现在一切ok,是不是觉得看东西要仔细一下~~。
STM8L探索套件学习笔记-GPIO端口操作(一)
STM8L探索套件学习笔记-GPIO端口操作(一)STM8 与STM32 一样提供了固件库函数,方便用户快速开发,不需要花费很多时间去查寄存器。
不过没有STM32 的库完善,给的说明文档是chm 格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载,今天按照官方给的模板自己做个模板文件夹,方便后期的移植,这样就不要再重复设置了。
首先我们看看GPIO 模块,在用固件库之前先了解下GPIO 里面的大体的寄存器,方便后期使用固件库。
缺点是你所以输入的参数都会检测是否符合规范,必须得按照库函数里面定义的参数写。
GPIO 寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可以配置为8 种GPIO 的模式,如下图:而固件库函数给出了8 中模式,在上面的基础上加入了输出高/输出低电平的状态。
GPIO_Mode_In_FL_No_IT 浮空输入无中断Input floating, no external interruptGPIO_Mode_In_PU_No_I 上拉输入无中断Input pull-up, no external interruptGPIO_Mode_In_FL_IT 浮空输入有中断Input floating, external interruptGPIO_Mode_In_PU_IT 上拉输入有中断Input pull-up, external interruptGPIO_Mode_Out_OD_Low_Fast 开漏-输出低-高速Output open-drain, low level, 10MHzGPIO_Mode_Out_PP_Low_Fast 推挽-输出低-高速Output push- pull, low level, 10MHzGPIO_Mode_Out_OD_Low_Slow 开漏-输出低-低速Output open-drain, low level, 2MHzGPIO_Mode_Out_PP_Low_Slow 推挽-输出低-低速Output push-pull, low level, 2MHzGPIO_Mode_Out_OD_HiZ_Fast 开漏-输出高阻- 高速Output open-drain, high-impedance level, 10MHzGPIO_Mode_Out_PP_High_Fast 推挽-输出高-高速Output push-pull, high level, 10MHzGPIO_Mode_Out_OD_HiZ_Slow 开漏-输出高阻-低速Output open-。
- 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可选。