STM8 库函学习笔记之CLK
【精品博文】stm8自学笔记2016312

【精品博文】stm8自学笔记2016312【流水灯例程】*基本语言*1,LED1_Open(); //点亮LED2,LED2_Close(); //熄灭LED3,LED1_Toggle(); //闪烁LED4,delay(); //延迟函数*代码组成*1,定义延迟函数void delay(){int i,j;for(i=0;i<1000;i++){for(j=0;j<1000;j++);}}//如果没有定义的话会有一个警告和一个错误提示(Warning[Pe223]: function "delay" declared implicitly;Error[Li005]: no definition for "delay" )2,定义主函数int main(void){CLK_CKDIVR&= (uint8_t)(~0x18);/*时钟复位*//*设置内部高速时钟16M为主时钟*/CLK_CKDIVR|= (uint8_t)0x00;/*!<Set High speed internal clock */LED_Init();while(1231){LED1_T oggle();delay();}}//貌似while()里面的这个数字可以输入任意大于1的整数;LED_Init()的作用是初始化然后后面的状态什么的都是在它初始化的基础上弄得;3,定义头文件void LED_Init(void){PF_DDR|=0xe0; // 设置数据方向寄存器 1为输出,0为输入*/ PF_CR1|=0xe0; //设置推挽输出 */PF_CR2|=0xe0; //设置输出频率 1为10M,0为2M}//定义LED_Init函数,并且设置相关数据;void LED1_T oggle(void){PF_ODR_ODR5=!PF_ODR_ODR5;}//定义LED1_T oggle函数;*程序执行*此时LED1在不停的闪烁 LED2和LED2处于点亮状态;*代码变形*1,将while循环里面的 delay();去掉即while(1231){LED1_T oggle();}3个LED灯均处于点亮状态无闪烁现象2,在while循环里面添加多个LED1_T oggle();delay();程序运行正常闪烁频率等现象均无变化3,将while里面改成LED1_T oggle();delay();LED2_T oggle();delay();LED3_T oggle();delay();LED1闪烁频率变慢 LED2和LED3闪烁 3个LED灯依次闪烁出现传说中的流水灯现象闪烁形式为1-2-3-1-2-3-循环4,给上述代码末尾加入 LED2_Close(); 即LED1_T oggle();delay();LED2_T oggle();delay();LED3_T oggle();delay();LED2_Close();LED2闪烁频率明显变快出现新的流水灯现象闪烁形式为1-2-3-2-1-2-3-循环其中1-2-3比3-2-1“走”的快些5,给上述代码末尾加入 delay(); 即LED1_T oggle();delay();LED2_T oggle();delay();LED3_T oggle();delay();LED2_Close();delay();LED2闪烁频率比LED1和LED3快比3中代码慢依旧是上述闪烁方式但是由于频率变慢会显得有点别扭6,将上述代码 LED2_Close();-->LED2_Open(); 即LED1_T oggle();delay();LED2_T oggle();delay();LED3_T oggle();delay();LED2_Open();delay();LED2闪烁频率和4中相同程序执行时LED2和LED3先亮LED1先熄灭后点亮实现闪烁此时已无流水灯现象7,上述代码取消末尾 delay(); 即LED1_T oggle();delay();LED2_T oggle();delay();LED3_T oggle();delay();LED2_Open();3个LED灯闪烁频率均增快依旧是LED2闪烁频率最快*疑惑之处*1,怎样通过CLK_CKDIVR&= (uint8_t)(~0x18);实现时钟复位的?2,while()里面的数字含义是什么可以任意输入吗?3,怎样设置LED闪烁频率?4,delay()函数对上述实验的影响原理是什么?*温馨备注*1,上述实验现象均为肉眼观测与实际可能会有些许误差;2,本人刚开始入门stm8 有说明错误的地方欢迎大家指出;3,希望各位前辈在有幸看到此篇文章时能够多多指教不胜感激;。
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 低功耗模式 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学习笔记——时钟和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的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。
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。
stm8 cosmic基本教程

...
MCD Application
16
关于flash 操作(IAP)
#pragma section (FLASH_CODE) void FlashWrite(void) { ... } void FlashErase(void) { ... } //set back code section to default placement #pragma section ()
From On-chip Peripherals
M外部中断
Filtering Edge Detection Trigger selection Capture Selection Dividing
MCD Application
21
采用输入捕获方式获得外部中断
MCD Application
9
Memory Models>64k (FLASH>32K)
Stack Short (mods) 全局变量默认为是短寻址方式( 全局变量默认为是短寻址方式(位置存放在 小于256的空间 0page) 在变量前 @near 或用指针方式长寻址 Stack Long (modsl) 全局变量默认为是长寻址方式( 全局变量默认为是长寻址方式(位置存放在 大于256的空间) 的空间) 在变量前 @tiny 或用指针方式长寻址 一般来讲,变量放在<256的空间内效率更高
MCD Application
8
Memory Models<64k(FLASH<32K)
Stack Short (mods0) 全局变量默认为是短寻址方式 ( @tiny 存放 在zero page ,8位地址) 位地址) 超出zero page范围须的变量须用 @near定义 Stack Long (modsl0) 全局变量默认为是长寻址方式( 全局变量默认为是长寻址方式( @near 存放 在0x100开始的地址16位空间 ) zero page内定义变量需要加 @tiny 强制定义 一般来讲,变量放在zero page的空间内效率 更高
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 void CLK_LSICmd(FunctionalState NewState);
启用或禁用内部低速振荡器(LSI 128KHz)
参数: NewState: 新的状态值 DISABLE 禁用 ENABLE 启用
返回值:无
//-----------------------------------------------------------------------------------------
,唤醒时间比较长,但功耗较低。
关于 AWU(自动唤醒功能的详细说明请查看手册)
//-----------------------------------------------------------------------------------------
9 void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState); 启用或禁用指定的外设时钟,默认所有的外设时钟都是启用的。
参数: NewState: 新的状态值 DISABLE 禁用 ENABLE 启用
返回值:无
//-----------------------------------------------------------------------------------------
3 void CLK_HSICmd(FunctionalState NewState);
CLK_SwitchMode,
CLK_Source_TypeDef
ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); 系统时钟切换配置
参数:
CLK_SwitchMode, 切换模式 可选值: CLK_SWITCHMODE_MANUAL 手动切换 CLK_SWITCHMODE_AUTO 自动切换
CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); 11 void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler); 12 void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO); 13 void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState); 14 void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescaler); 15 void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider); 16 void CLK_CANConfig(CLK_CANDivider_TypeDef CLK_CANDivider); 17 void CLK_ClockSecuritySystemEnable(void); 18 void CLK_SYSCLKEmergencyClear(void); 19 void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSICalibrationValue); 20 u32 CLK_GetClockFreq(void); 21 CLK_Source_TypeDef CLK_GetSYSCLKSource(void); 22 FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef CLK_FLAG); 23 ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT); 24 void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT);
参数: CLK_Peripheral 外设类型 可选值: CLK_PERIPHERAL_I2C CLK_PERIPHERAL_SPI CLK_PERIPHERAL_UART1 CLK_PERIPHERAL_UART2 CLK_PERIPHERAL_UART3 CLK_PERIPHERAL_TIMER6 CLK_PERIPHERAL_TIMER4 CLK_PERIPHERAL_TIMER5 CLK_PERIPHERAL_TIMER2 CLK_PERIPHERAL_TIMER3 CLK_PERIPHERAL_TIMER1 CLK_PERIPHERAL_AWU CLK_PERIPHERAL_ADC CLK_PERIPHERAL_CAN
//----------------------------------------------------------------------------------------7 void CLK_FastHaltWakeUpCmd(FunctionalState NewState); 使能或禁止从停机模式(Halt)或活跃停机模式(Active Halt)中快速唤醒。 停机模式(Halt):CPU 和片上设备完全停止工作,定时唤醒单元 AWU 也停止,仅由外部中断及复位唤醒。 活跃停机模式(Active Halt):保留一个定时唤醒单元 AWU 工作,CPU 和片上设备全停止工作,AWU 和外部中断及复位均可唤 醒 使能后内部高速振荡器(HSI)会自动打开,且作为主时钟源(fMASTER)(CKM=SWI=HSI),然后从停机模式(Halt)或活跃停机模式 (Active Halt)中 快速唤醒。 返回值:无
//----------------------------------------------------------------------------------------1 void CLK_DeInit(void);
1 / 10
STM8 库函数学习笔记之时钟树解析
2012-12.12
恢复相关的时钟寄存器到默认值
STM8 库函数学习笔记之时钟树解析
2012-12.12
STM8 库函数学习笔记之时钟树解析
STM8 库函数学习笔记之时钟管理
相关函数:
1 void CLK_DeInit(void); 2 void CLK_HSECmd(FunctionalState NewState); 3 void CLK_HSICmd(FunctionalState NewState); 4 void CLK_LSICmd(FunctionalState NewState); 5 void CLK_CCOCmd(FunctionalState NewState); 6 void CLK_ClockSwitchCmd(FunctionalState NewState); 7 void CLK_FastHaltWakeUpCmd(FunctionalState NewState); 8 void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState); 9 void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState); 10 ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef
3 / 10
STM8 库函数学习笔记之时钟树解析
2012-12.12
如 果 进 入 活 跃 停 机 模 式 前 没 有 调 用 CLK_SlowActiveHaltWakeUpCmd(ENABLE); 或 调 用 了 CLK_SlowActiveHaltWakeUpCmd(DISABLE);即默认的情况下
//-----------------------------------------------------------------------------------------
2 void CLK_HSECmd(FunctionalState NewState);
启用或禁用外部高速振荡器(HSE)
参数:无 返回值:无
注意: 当要复位 CCOR 寄存器时,如果 CCOEN 位被置位,则需要先复位 CCOEN 位,然后再复位 CCOSEL 位,复位 CCOEN 位和 复位 CCOSEL 位的操作必须连续。
这个理解不知对不对,是根据库函数的帮助来理解的,但测试结果,无论 CCOEN 是否置位,调用后都能恢复 CCOR 寄存器。
4 / 10
STM8 库函数学习笔记之时钟树解析
CLK_NewClock,新的时钟源 可选值: CLK_SOURCE_HSI 内部 16MHz 高速振荡器 CLK_SOURCE_LSI 内部 128KHz 低速振荡器 CLK_SOURCE_HSE 外部时钟