STM8自学笔记
【精品博文】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 库函学习笔记之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自学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单片机基础入门
速度达20 MIPS的高性能内核 抗干扰能力强,品质安全可靠 领先的130纳米制造工艺,优异的性价比 程序空间从4K到128K, 芯片选择从20脚到80脚,宽范围产品系列 系统成本低,内嵌EEPROM和高精度RC振荡器 开发容易,拥有本地化工具支持
STM8S主要应用:
STM8L主要特点:
STM8 16 MHz CPU 内置 4-32 KB 闪存,多达 2KB SRAM 三个系列:跨系列的引脚对引脚兼容、软件相互兼容、外设相互兼容 电源电压:1.8 V-3.6 V (断电时,最低 1.65 V) 超低功耗模式:保持 SRAM 内容时,最低功耗 350nA 运行模式动态功耗低至 150μA/MHz 最先进的数字和模拟外设接口 工作温度范围:-40°C 到+85 °C,可高达 125 °C 免费的触感固件库
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-7-
1.3 STM8A 系列
意法半导体公司推出的 STM8A 是一款专门用于满足汽车应用的特殊需求的 8-位 Flash 微控制器。这些模块化产品提供了真数据 EEPROM 以及软件和引脚兼容性,适用的程序存 储器尺寸范围为 8KB 至 256KB 和 20 至 128-引脚封装。所有器件的工作电压均为 3V 至 5V, 并且其工作温度扩展到了 145°C。
监控、紧急求助
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-4-
STM8S 产品分为“Access Line(入门级)”和“Peroformance Line(增强型)”,如 下图所示。
王志杰 Email: iewangzhijie@ QQ:411238869
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 系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。
举个例子,做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来源地址:/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,即無中斷功能的浮動輸入,無返回值。
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)。触发信号为上升沿
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学习笔记——初步认识
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时钟配置笔记
//-----------------------------------------------------------------------------------------
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位的操作必须连续。
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; // 清除更新中断标记,这步不能漏掉,否则会连续进入中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM8 实战篇
一、参考文档《STM8单片机入门V3.0》安装软件。
建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。
(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。
下面开始编写程序
硬件中PE5口有一个LED。
做一个闪烁灯。
在线
使用标准库:
和上面一样建立普通的工程。
从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。
可以建立如下的结构
添加文件为
编译后成功。
当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。