stm8自学l学习笔记
【精品博文】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,在一定的延时后产生一个内部唤醒事件,延迟时间是用户可编程的。
STM8L学习笔记:外部中断
External interrupt control register 1 (EXTI_CR1)
地址偏移量:0x00 复位值:0x00
7
6
5
4
3
2
1
0
RW
RW
RW
RW
RW
RW
RW
RW
P3IS[1:0]
P2IS[1:0]
P1IS[1:0]
P0IS[1:0]
每个端口的 bit3
每个端口的 bit2
每个端口的 bit1
P5IS[1:0]
P4IS[1:0]
每个端口的 bit7
每个端口的 bit6
每个端口的 bit5
每个端口的 bit4
的外部中断触发方式 的外部中断触发方式 的外部中断触发方式 的外部中断触发方式
设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存
I1 和 I0 都 被 置 1 时 I1 和 I0 都 被 置 1 时 都 被 置 1 时 (level 3-- 都 被 置 1 时 (level 3--
(level 3-- 软 件 优 先 级 (level 3--软 件 优 先 级 软件优先级使能,CCR 软件优先级使能,CCR
使能,CCR 寄存器复 使能,CCR 寄存器复 寄存器复位值两位都 寄存器复位值两位都
位值两位都是 1),这 位值两位都是 1),这 是 1),这些位只能被 是 1),这些位只能被
些位只能被写)。
些位只能被写)
写)
写)
需要注意的是,
需要注意的是,
需要注意的是,
需要注意的是,
在 Port F[3:0] 与 Port 在 Port E[3:0] 与 Port 在 Port D[3:0] 与 Port 在 Port B[3:0] 与 Port
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学习笔记——PWM模块
STM8学习笔记——PWM模块首先将管脚配置为推挽输出。
下面以向上计数模式为例来讲述PWM 产生的原理:TIMx 开始向上计数,TIMx_CNT 为计数值,计数一次加1,TIMx_ARR 确定了计数的上限,达到上限后计数器从0 开始重新计数,所以一次PWM 频率就由TIMx_ARR 来确定了,即计数器时钟*(TIMx_ARR-1),频率确定了,接下来就是占空比。
占空比是由TIMx_CCRx 来确定的,PWM模式1 下当TIMx_CNT=TIMx_CCRx 时,输出OCiREF 无效电平,至于有效电平是0 还是1,要设置TIMx_CCERx,这样产生了一个PWM 波形,可以说配置非常灵活,当TIMx_CCRx 为0 时,占空比就为0,当TIMx_CCRx 大于TIMx_ARR 时,就一直输出高电平(占空比100%)。
下图是个例子:以下是我写的一个参考程序,测试通过void TIM1_Init(void){//定时器1 初始化CLK_PCKENR1|=0x80;//开启定时器1 外设时钟TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x20;//重新初始化TIM1 TIM1_ARRH=0x00;//设定重装载值TIM1_ARRL=254; TIM1_PSCRH=0;//预分频TIM1_PSCRL=9; TIM1_CR1=0;//边沿对齐,向上计数} void TIM1_PWM_Init(){ //TIM1_CCER1=0x03;//低电平有效//TIM1_CCMR1=0x70;//PWM 模式2TIM1_CCER1=0x01;//高电平有效TIM1_CCMR1=0x60;//PWM 模式1TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车}tips:感谢大家的阅读,本文由我司收集整编。
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);注释已经写得很明白了。
STM8_TIM1_PWM输入捕获学习
K看图2 从左到右 依次配置完成检测通道: 根据输入信号 TIi 的特点,可通过配置 TIM1_CCMRi 寄存器中的 ICiF位来设置相应的输入滤波器的滤波时间。 假设输入信号在最多 5个时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时 钟周期;因此我们可以连续采样8次,以确认在TI1上一次真实的 边沿变换,即在TIMi_CCMR1寄存器中写入IC1F=0011,此时, 只有连续采样到 8 个相同的 TI1 信号,信号才为有效 ( 采样频率为 fMASTER)。 选择 TI1 通道的有效转换边沿,在 TIM1_CCER1 寄存器中写入 CC1P=0(上升沿)。 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效 的电平转换时刻, 因此预分频器被禁止(写TIM1_CCMR1寄存器的
IC1PS=00) 选择有效输入端:例如TIM1_CCMR1连接到TI1输入,所以写入 TIM1_CCMR1寄存器中的CC1S=01,此时通道被配置为输入,并 且TIM1_CCR1寄存器变为只读。 设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕 获寄存器中。 如果需要,通过设置TIM1_IER寄存器中的CC1IE位允许相关中断 请求。 以上便完成了 基本通道 如果有有效电平来 就产生事件或者中断。 配置很简单 诸如以下的例程:选择有效输入一般捕获的占空比是 PWM 输入捕获是普通捕获的一种特殊情况: 50%
它使用两个通道计算波形的周期和占空比: 看上图 我们使用 CH1 和 CH2 一起,不过我们配置信号只是 从 CH1 口输入,然后通过 TI1FP2 到 IC2 然后进入边沿检测,按照 手册的配置过程:
CC2S=10(选中TI1FP2)。 4. 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2): 置CC2P=1(下 降沿有效)。 5. 选择有效的触发输入信号: 置TIM1_SMCR寄存器中的TS=101(选 择TI1FP1)。触发信号为上升沿
STM8学习笔记——初步认识
STM8学习笔记——初步认识最近项目要求找个便宜又够用的单片机,本来是想选STC 的,但其实STC 也并不便宜,且调试比较麻烦,而且AD 不是很好,所以选择了STM8。
昨天买来了ST-LINK III,拿了一块STM8S105S4,此单片机有16K ROM,2K RAM,1K 的EEPROM,带10bitADC,定时器(ICOCPWM)和SPI I2C UART 通讯接口,看门狗等,封装为LQFP44。
这款单片机的供电分得很细,主电源、IO 口、模拟供电都分开,这样就可以非常灵活的配置,比如模拟供电可以选用5V 以扩大量程;IO 口可以配置位3.3 或5V 以适应一些设备。
上图中VDD/VSS 引脚用于给内部主电压调节器(MVR)和内部低功耗电压(LPVR)调节器供电。
这两个调节器的输出连接在一起,向MCU 的核(CPU,FLASH 和RAM)提供1.8V 电源(V18)。
在低功耗模式下,系统会将供电电源从MVR 自动切换到LPVR 以减少电流消耗。
为稳定MVR,在VCAP 引脚必须连接一个电容。
该电容应该拥有较低的等效串联电阻值(ESR),电容最小的推荐容值为470nF。
ST-LINK III 管脚定义及接法:ST-LINK III LED 灯三种状态含义:常亮:目标板与ST-LINK 在SWIM 模式或者JTAG/SWD 模式下已经通讯初始化。
闪烁:目标板与ST-LINK 正在进行数据交换。
熄灭:目标板与ST-LINK 没有通讯初始化。
开发平台:还是比较习惯用IAR,查了下果然有IAR for STM8,于是下了并和谐,然后随便写了个程序,下载调试,发现出错,更新ST-LINK III 的固件,无果。
难道是IAR 的问题?于是下载官方的STVD,安装后发现也无法下载,提示是。
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学习资料
第一节:心情和时钟说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用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学习笔记——定时器定时功能和中断相关
STM8学习笔记——定时器定时功能和中断相关
定时器都差不多,无非就是计数,溢出了标志置位,如果中断允许的话产
生一个中断。
说到中断,STM8S105 的中断向量表如下
时基单元:
在选用内部时钟的情况下,CK_PSC 是由fmaster 提供的,经过定时器预分频器分频产生CK_CNT 时钟,然后作为一次计数的时基,举个例子,16M 的
内部RC,经过16 分频,则CK_CNT 为1M,那么定时1ms 只需计数1000 次。
计数模式:
共有三种:向上,向下,中央对齐
以向上计数为例:计数器从0 计数到用户定义的比较值(TIMx_ARR 寄存器
的值),然后重新从0 开始计数并产生一个计数器溢出事件,同时,如果
TIM1_CR1 寄存器的UDIS 位是0,将会产生一个更新事件(UEV)。
关于IAR 中断函数的写法
asm(“sim”);//关全局中断
asm(“rim”);//开全局中断
#pragma vector=TIM2_OVR_UIF_vector (这里根据上面的中断向量表选择要进入的中断的向量)
__interrupt void TIM2_OVR_UIF(void)//__interrupt 关键字表示中断函数{ TIM2_SR1 &=~0x01; // 清除更新中断标记,这步不能漏掉,否则会连续进入中。
STM8L05X入门学习笔记
1、工程新建首先新建文件夹,在文件夹下建立四个文件(这个看个人喜好),我喜欢建立一个工程文件夹Project用于存放工程文件,Library文件用于存放库文件,App用于存放用户程序,Doc 用于存放说明文档,如图1所示。
图1二:将官方的库文件Libraries文件下STM8S_StdPeriph_Driver这个文件下的内容复制到自己新建的Library文件下,把官方Project文件下Template文件夹下main.c stm8s_conf.h stm8s_it.c 和stm8s_it.h复制到App文件夹下。
如图2,图3。
图2图3三:打开IAR 选择Project-> Create New Project –>ok,将文件保存到Project下,这时工程已经建好,右击工程选择Add Group,然后依次添加文件App,Libraries,Doc,BSP_CFG配置好如图所示四:给工程下APP添加App文件下的文件如图给Libraries添加Library文件下src文件下的所有文件、五配置Options,包括如下,1选择型号这里选STM8S903K32C++选项卡配置路经,和型号的宏定义。
六编译工程,这事会提醒对工程的保存,进行保存即可,这时会发现很多错误,这是因为这个库包含了所有的型号,有些这个单片机没有,将它移除即可。
再次编译就会发现没有错误了。
7HEX文件输出2、系统时钟四种不同的时钟源可以用来驱动系统时钟:●16 MHz 高速内部(HSI)工厂调整RC 时钟●1 到16 MHz 高速外(HSE)振荡器时钟●32.768 千赫低速外(LSE)振荡器时钟●38 千赫低速内部(LSI)低功耗时钟每个时钟源可以开启或关闭独立不使用时的功耗,优化。
这四个时钟可以用一个可编程分频器(因素1 至128)驱动系统时钟(系统时钟)。
该系统时钟用于时钟的核心,内存和外设。
复位后,该设备重新启动与HSI 时钟除以8 的违约。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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时钟源。
TIMER2
TIM时基单元,如下图所示:
计数器使用内部时钟(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
初始化IO
TxD 配置成输出上拉高速模式
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(); /* 开启总中断 */
}。