STM8学习笔记——时钟和GPIO
- 格式:docx
- 大小:10.21 KB
- 文档页数:2
STM8 低功耗模式STM8应用笔记四种STM8低功耗模式的主要特性如表12。
(表12:STM8S低功耗模式管理)1.如果外设时钟未被关闭2.包括通讯外设的中断(参见中断向量表)STM8等待(Wait)模式在运行模式下执行WFI(等待中断)指令,可进入等待模式。
此时CPU停止运行,但外设与中断控制器仍保持运行,因此功耗会有所降低。
等待模式可与PCG(外设时钟门控),降低CPU时钟频率,以及选择低功耗时钟源(LSI,HSI)相结合使用,以进一步降低系统功耗。
参见时钟控制(CLK)的说明。
在等待模式下,所有寄存器与RAM的内容保持不变,之前所定义的时钟配置也保持不变(主时钟状态寄存器CLK_CMSR)。
当一个内部或外部中断请求产生时,CPU从等待模式唤醒并恢复工作。
STM8停机(Halt)模式在该模式下主时钟停止。
即由fMASTER提供时钟的CPU及所有外设均被关闭。
因此,所有外设均没有时钟,MCU的数字部分不消耗能量。
在停机模式下,所有寄存器与RAM的内容保持不变,默认情况下时钟配置也保持不变(主时钟状态寄存器CLK_CMSR)。
MCU可通过执行HALT指令进入停机模式。
外部中断可将MCU从停机模式唤醒。
外部中断指配置为中断输入的GPIO 端口或具有触发外设中断能力的端口。
在这种模式下,为了节省功耗主电压调节器关闭。
仅低电压调节器(及掉电复位)处于工作状态。
快速时钟启动HSI RC的启动速度比HSE快(参见数据手册中电特性参数)。
因此,为了减少MCU的唤醒时间,建议在进入暂停模式前选择HSI做为fMASTER的时钟源。
在进入停机模式前可通过设置内部时钟寄存器CLK_ICKR的FHWU位选择HSI做为fMASTER的时钟源,而无需时钟切换。
参见时钟控制章节。
STM8活跃停机(Active Halt)模式活跃停机模式与停机模式类似,但它不需要外部中断唤醒。
它使用AWU,在一定的延时后产生一个内部唤醒事件,延迟时间是用户可编程的。
#error directive: "Unsupported Compiler!" STM8编译错误解决方法STM8的库使用很方便,不过初学者下载ST官方的库可能会遇到下面的问题。
原因是因为STM8S的官方库文件发布时,IAR EWSTM8还没有出来,所以在官里面IAR未能被支持,最好是采用IAR自带的头文件,如下图所示:IAR自带的头文件目录,请以你自己的安装目录下查时钟控制STM8的钟控制器功能强大而且灵活易。
现以STM8L101xx单片机的时钟树为例,时钟树如下图所示:HSI 高速接口时钟源LSI 低速接口时钟源从时钟树来看,fCPU 的时钟来源是fMASTER 时钟;fMASTER的时钟源有三个可以选择:fHSI。
fHSI来自于内部的时钟;fHSIDIV来自于内部16MHz RC的时钟源;fLSI来自于内部38KHz RC时钟源。
TIMER2TIM时基单元,如下图所示:计数器使用内部时钟(fMA STER) ,由CK_PSC提供,并经过预分频器分频产生计数器时钟CK_CNT。
计数器时钟频率的计算公式:fCK_CNT = fCK_PSC/2(PSCR[2:0])中断向量表串口uart 学习STM8L101f3p6 有一个串口如图本历程基于库操作不讨论具体寄存器操作有兴趣的同学可以自行参考编程手册下面看一下手册的了解一下特点本人英语是个小白只可意会不可言传了内部结构了由于是基于库函数的所以不做寄存器的分析了库函数的好处就是可以在不了解单片机寄存器的前提下可以快速开发应用下面举个例子波特率 9600 8位字长停止位一位无校验串口模式为收发模式查询发送中断接收在初始化串口之前应该先初始化串口对应的IO口由手册可知串口对应的IO为PC2(USART_RX)和PC3(USART_TX)。
首先宏定义下IO 方便理解和配置#define TXD_GPIO_PORT GPIOC#define RXD_GPIO_PORT GPIOC#define TXD_GPIO_PINS GPIO_Pin_3#define RXD_GPIO_PINS GPIO_Pin_2初始化IOTxD 配置成输出上拉高速模式RxD 配置成输入上拉无中断模式GPIO_Init(TXD_GPIO_PORT, TXD_GPIO_PINS, GPIO_Mode_Out_PP_High_Fast);GPIO_Init(RXD_GPIO_PORT, RXD_GPIO_PINS, GPIO_Mode_In_PU_No_IT);接下来打开串口模块时钟(之前就是忘配置这个功能所以一直不好使)CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);配置串口详细的功能USART_Init((u32)9600, USART_WordLength_8D, USART_StopBits_1, USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));开启接收中断USART_ITConfig(USART_IT_RXNE, ENABLE); //开启接收中断打开串口USART_Cmd(ENABLE);最后在开启总中断就可以啦enableInterrupts(); /* 开启总中断 */发个数据UART_SendString("This is a UART Demo \r\n");哈哈好使下面是完整的功能函数/********************************************************************** ********** 名称: Uart_Init* 功能: UART2初始化操作* 形参: 无* 返回: 无* 说明: 无*************************************************************************** ***/void Uart_Init(void){GPIO_Init(TXD_GPIO_PORT, TXD_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);GPIO_Init(RXD_GPIO_PORT, RXD_GPIO_PINS, GPIO_Mode_In_PU_No_IT);// GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);USART_DeInit(); /* 将寄存器的值复位 *//** 将UART2配置为:* 波特率 = 9600* 数据位 = 8* 1位停止位* 无校验位* 使能接收和发送*/USART_Init((u32)9600, USART_WordLength_8D, USART_StopBits_1, \USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx |USART_Mode_Tx));USART_ITConfig(USART_IT_RXNE, ENABLE); //开启接收中断USART_Cmd(ENABLE);enableInterrupts(); /* 开启总中断 */}11。
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,即无中断功能的浮动输入,无返回值。
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 系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。
举个例子,做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 闪烁速度明显加快、、。
STM8庫函數學習筆記之GPIO来源地址:/s/articlelist_1660746614_0_1.html【整理者】【提供者】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_TypeDef GPIO_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,即無中斷功能的浮動輸入,無返回值。
第七章STM8S207 GPIO模块及其应用本章终于开始STM8S207 的例程编写了,通过前面章节的学习,相信对STM8S207 已经有了一定的认识。
本章从STM8S207 最简单的IO 口模块开始STM8S207 的编程。
7.1 GPIO 简介STM8S207 内部有非常丰富的输入、输出端口资源,同时也集成了多种功能模块,其输入、输出引脚大多为复用引脚。
STM8S207 单片机的IO 口包括PA、PB、PC、PD、PE、PF、PG、PI 等52 个IO 口通用输入/输出口用于芯片和外部进行数据传输。
一个IO 端口可以包括多达8 个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。
另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。
但是在同一时刻仅有一个复用功能可以映射到引脚上。
复用功能的映射是通过选项字节控制的。
请参考数据手册关于选项字节的描述。
每个IO 口都有 5 个对应的寄存器,IO 的工作方式也由这 5 个寄存器控制,它们分别为:1、数据方向寄存器2、配置寄存器13、配置寄存器24、输出数据寄存器5、输入数据寄存器一个I/O 口工作在输入还是输出是取决于该口的数据方向寄存器的状态。
7.1.1 GPIO 主要功能1、端口的各个位可以被单独配置2、可选择的输入模式:浮动输入和带上拉输入3、可选择的输出模式:推挽式输出和开漏输出4、数据输入和输出采用独立的寄存器5、外部中断可以单独使能和关闭6、输出摆率控制用以减少EMC 噪声7、片上外设的I/O 功能复用8、当作为模拟输入时可以关闭输入施密特触发器来降低功耗9、在数据输出锁存时支持读-修改-写10、输入兼容5V 电压11、I/O 口工作电压范围为1.6 V 到VDDIOmaxGPIO 模块框图7.2 IO 口的配置和使用每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)。
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;。
所用芯片 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)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。
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 输出。