STM8学习笔记——时钟和GPIO

合集下载

STM8 低功耗模式 STM8应用笔记

STM8 低功耗模式 STM8应用笔记

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,在一定的延时后产生一个内部唤醒事件,延迟时间是用户可编程的。

stm8自学l学习笔记

stm8自学l学习笔记

#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。

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 闪烁速度明显加快、、。

STM8_GPIO学习笔记

STM8_GPIO学习笔记

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,即無中斷功能的浮動輸入,無返回值。

STM8S学习笔记

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模块及其应用

STM8教程-第七章-STM8S207-GPIO模块及其应用

第七章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特性分析

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学习笔记

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)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。

STM8时钟系统详解

STM8时钟系统详解

STM8时钟系统详解就我个⼈看来,研究⼀块单⽚机,分为新⼿和⽼⼿两种模式,新⼈迫切的想先⽤,你得告诉他们怎么样最快的写出⼀个能跑起来的程序,告诉他们每⼀个外设的使⽤⽅式,⽼⼿不同,⽤的单⽚机多了外设对于他们⽽⾔没太多好奇的,中断,⽆⾮配置中断,连接中断,打开中断,中断模式,中断函数,定时器,⽆⾮打开时钟,设置分频率,设置值,等中断到来计数,千篇⼀律,没什么花样但是⽼⼿关注的是不同,这个和那个的差异是什么,这样就能避免惯性思维,不会⽤错,学起来差不多,都是对着⼿册读呗,但是学的⼼态不⼀样,更加的举重若轻闲话少叙,下⾯说说STM8的时钟系统STM8时钟系统看起来是这样的,有⼀个外部输⼊时钟OSC,⼀个外部输出时钟CCO,CCO可选输出内部的时钟五⼤块,CPU时钟,外设时钟,看门狗时钟,CAN总线时钟以及⾃动唤醒时钟CPU时钟的来源包括外部晶振,外部振荡器输⼊,内部⾼速振荡器输⼊,三种输⼊经过主时钟选择,再经过主时钟分频输出CPU以及内部窗⼝看门狗外设时钟和CPU时钟来源⼀样,并不经过主时钟分频,⼆⼗有⼀个外设使能控制,输⼊到各个外设,从这⾥我们可以判断,外设⾥⾯肯定还有分频器⾃动唤醒时钟直接来源于内部低速振荡器或者直接来源于外部始终,经过选项字节选择输⼊独⽴看门狗的时钟只可能来⾃于内部⾼速振荡器⽽CAN总线的时钟也是直接从晶振上获取的,同时内部低速振荡器是可以关掉的接下来我们看看寄存器控制内部低速振荡器和内部⾼速振荡器的开关以及开关状态标识,细节是什么,观察这个复位值,0x01,也就是说,复位的时候内部低速振荡器使能这代表着系统复位的时候肯定是使⽤内部低速振荡器的,不⽤看⽂档的其他部分这⼀点⼏乎就能确定外部时钟使能以及时钟状态⼋个位都是只读,标识当前我们选⽤的系统主时钟是谁,也就是框图中master clock switch的标识让你来选择哪⼀个做主时钟对时钟切换的过程进⾏监控时钟分频,⼀是内部⾼速时钟的分频,⼆是外部⾼速时钟的分频还有⼀个2,⽤来确定各个外设是否连接到时钟上,相当于外设使能,外设没有时钟是跑不起来的时钟安全系统配置时钟输出的配置,也就是刚才说的CCO的来源CAN总线的时钟分频剩下来的⼀个是HIS的始终修正,另⼀个是SWIM时钟的配置,都是不需要我们去关注的初始化时钟的流程包括1. 想要选择的主时钟使能,等待稳定2. 选择主时钟并进⾏切换,等待切换完成3. 选择系统时钟分频数4. 选择相应的外设时钟代码如下Clock.c#include "clock.h"void ClockInit(u8 clockSel){if(clockSel == HSE_CLOCK){//切换到外部始终之前,因为我使⽤的是24M时钟,所以需要修改插⼊flash等待时间 //此处讲解选项字节再补上//注意,下⾯这⼀段只能在使⽤16M⼀下时钟的时候有⽤CLK->ECKR |= 0x01;//使能外部晶振while(!(CLK->ECKR & 0x02));//等待时钟准备就绪CLK->SWCR &= ~((1<<2)|(1<<3));//时钟切换中断禁⽌并清除中断标志CLK->SWR = 0xB4;//时钟选择为HSEwhile(CLK->SWCR & 0x01);//等待时钟切换慢的结束CLK->SWCR |= 0x01;//使能时钟切换while(CLK->CMSR != 0xB4);//等待系统时钟切换到0xb4CLK->CKDIVR = 0x00;//设置时钟预分频,设置为fmaster = fclockCLK->CCOR &= ~(1<<0);//禁⽌CCO输出//此时,应当关闭内部始终CLK->ICKR &= ~0x01;}else if(clockSel == HSI_CLOCK){CLK->ICKR |= 0x01;//使能内部⾼速时钟while(!(CLK->ICKR | 0x02));//等待准备就绪CLK->SWCR &= ~((1<<2)|(1<<3));//时钟切换中断禁⽌并清除中断标志CLK->SWR = 0xE1;//时钟选择为HSIwhile(CLK->SWCR & 0x01);//等待时钟切换慢的结束CLK->SWCR |= 0x01;//使能时钟切换while(CLK->CMSR != 0xE1);//等待系统时钟切换到0xb4CLK->CKDIVR = 0x00;//设置时钟预分频,设置为fmaster = fclockCLK->CCOR &= ~(1<<0);//禁⽌CCO输出//此时,应当关闭外部时钟CLK->ECKR &= ~0x01;//使能外部晶振}}Clock.h#ifndef __CLOCK_H_#define __CLOCK_H_#include "stm8s.h"#define HSE_CLOCK 0#define HSI_CLOCK 1//初始化系统时钟,有两个选择,⼀个hse⼀个是hsivoid ClockInit(u8 clockSel);#endif另外,有⼀个时钟安全系统,这是⼀个什么机构也就是,当系统晶振由于外部⼲扰或者电路故障断开的时候,⾃动切换到内部⾼速时钟,这样能够保证实际的单⽚机电路系统不会失控,防⽌造成不良影响。

stm8学习资料

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,是不是觉得看东西要仔细一下~~。

STM8的C语言编程(3) ―― GPIO输出和输入

STM8的C语言编程(3) ―― GPIO输出和输入

STM8的C语言编程(3)―― GPIO输出和输入今天要进行的实验,是利用GPIO进行输入和输出。

在ST的三合一开发板上,按键接在GPIO的PD7上,LED接在GPIO的PD3上,因此我们要将GPIO的PD7初始化成输入,PD3初始化成输出。

关于GPIO的引脚设置,主要是要初始化方向寄存器DDR,控制寄存器1(CR 1)和控制寄存器2(CR2),寄存器的每一位对应GPIO的每一个引脚。

具体的设置功能定义如下:DDR CR1 CR2 引脚设置0 0 0 悬浮输入0 0 1 上拉输入0 1 0 中断悬浮输入0 1 1 中断上拉输入1 0 0 开漏输出1 1 0 推挽输出1 X 1 输出(最快速度为10MHZ)另外,输出引脚对应的寄存器为ODR,输入引脚对应的寄存器为IDR。

下面的程序是检测按键的状态,当按键按下时,点亮LED,当按键抬起时,熄灭LED。

同样也是利用ST的开发工具,先生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。

编译通过后,下载到开发板,运行程序,按下按键,LED就点亮,抬起按键,L ED就熄灭了。

另外,要注意,将STM8S207C_S.h拷贝到当前项目的目录下。

// 程序描述:检测开发板上的按键,若按下,则点亮LED,若抬起,则熄灭LE D// 按键接在MCU的GPIO的PD7上// LED接在MCU的GPIO的PD3上#include "STM8S207C_S.h"main(){PD_DDR = 0x08;PD_CR1 = 0x08; // 将PD3设置成推挽输出PD_CR2 = 0x00;while(1) // 进入无限循环{if((PD_IDR & 0x80) == 0x80) // 读入PD7的引脚信号{PD_ODR = PD_ODR & 0xF7; // 如果PD7为1,则将PD3的输出设置成0,熄灭LED}else{PD_ODR = PD_ODR | 0x08; // 否则,将PD3的输出设置成1,点亮L ED}}}。

STM8L探索套件学习笔记-GPIO端口操作(一)

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-。

STM8时钟配置笔记

STM8时钟配置笔记
void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT);
//-----------------------------------------------------------------------------------------
void CLK_DeInit(void);
参数:
NewState: 新的状态值
DISABLE 禁用
ENABLE 启用
返回值:无
//-----------------------------------------------------------------------------------------
DISABLE 禁用
ENABLE 启用
返回值:无
如果为了能快速从活跃停机模式中唤醒,进入活跃停机前则调用CLK_SlowActiveHaltWakeUpCmd(ENABLE);但功耗较大。
如果进入活跃停机模式前没有调用CLK_SlowActiveHaltWakeUpCmd(ENABLE);或调用了CLK_SlowActiveHaltWakeUpCmd(DISABLE);即默认的情况下
CLK_PERIPHERAL_UART2
CLK_PERIPHERAL_UART3
CLK_PERIPHERAL_TIMER6
CLK_PERIPHERAL_TIMER4
CLK_PERIPHERAL_TIMER5
CLK_PERIPHERAL_TIMER2
恢复相关的时钟寄存器到默认值
参数:无
返回值:无
注意:
当要复位CCOR寄存器时,如果CCOEN位被置位,则需要先复位CCOEN位,然后再复位CCOSEL位,复位CCOEN位和复位CCOSEL位的操作必须连续。

STM8S学习——操作单个IO口

STM8S学习——操作单个IO口

STM8S学习——简单操作单个IO口刚接触STM8系列单片机,学习了简单端口的操作,今天就来分享我的成果。

因为是刚接触,各位见笑了。

STM8系列单片机每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)。

寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。

任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。

下面是我截取的STM8教程里的部分配置表格:大家根据上表对端口进行配置应该没有问题,但是对某一个端口进行配置时可能会遇上麻烦。

那怎么对单个端口进行配置呢?我再附上一个表格,以便说明假设同名端口(PA端口、PB端口等等)都有8个IO口7~0,因此对应上表我们发现正好一个IO口对应一列,比如7所在的列对应7号IO口,0所在的列对应0号IO口,于是单个IO口(假设是PB1)配置程序可写为:PB_DDR = 0x02; // 配置PB端口的方向寄存器,PB1为输出模式PB_CR1 = 0x02; // 设置PB1为推挽输出PB_CR2 = 0x00;下面附上PB1口控制LED闪烁的程序#include "stm8s.h"void GPIO_init(void){PB_DDR = 0x02; // 配置PB端口的方向寄存器,PB1为输出模式PB_CR1 = 0x02; // 设置PB1为推挽输出PB_CR2 = 0x00;}void delay (void){unsigned char i,j,k;for(i=10;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}main(){GPIO_init();//端口初始化CLK_DeInit();//恢复时钟寄存器CLK_HSICmd(ENABLE);//启用内部高速振荡器(HSI 16MHz)CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//主时钟=16MHZ/1=16MHz CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//CPU时钟=主时钟/1=18MHZ while (1){PB_ODR = 0x02;//PB1输出高电平,LED亮delayms();PB_ODR = 0x00; //PB1输出低电平,LED灭delayms();}}。

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

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 输出。

相关文档
最新文档