STM8 库函学习笔记之CLK
- 格式:pdf
- 大小:77.66 KB
- 文档页数:10
【精品博文】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 低功耗模式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 的时钟,那还真是个杯具,用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单片机入门V3.0》安装软件。
建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。
(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。
下面开始编写程序
硬件中PE5口有一个LED。
做一个闪烁灯。
在线
使用标准库:
和上面一样建立普通的工程。
从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。
可以建立如下的结构
添加文件为
编译后成功。
当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。
#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,即无中断功能的浮动输入,无返回值。
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库函数之中断计时STM8库函数之中断计时作者:carloszo原理分析中断计时的原理是基于时间片轮转理论。
按照顺序结构的写法,有时候避免不了沉重冗长的时间等待。
例如键盘扫描,你就给我弄了一个delay_20ms()函数,而在这延时的过程,其实MCU可以做很多事情的。
通过中断计时,给每个任务分配一个时间片,这样就可以避免因为使用delay造成的mcu等待,合理分配资源。
中断计时的具体实施步骤为,首先配置主时钟频率,配置计时器计时周期,使能中断,设置计时变量及初始值,如time_250ms_flag = 0,进中断后修改计时变量值等于1。
在main函数判断time_250ms_flag的值是否为1,如果为1,进行相应任务。
代码1.定义时间变量unsigned char time_250us_flag;unsigned char time_1ms_cnt;unsigned char time_10ms_cnt;unsigned char time_20ms_cnt;unsigned char time_100ms_cnt;unsigned char time_1s_cnt;2.配置主时钟void clk_init(void){CLK_DeInit();CLK_HSICmd(ENABLE);//内部高速时钟:16MCLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//时钟频率:16M/2=8M }3.配置计时器void tim_init(void){TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_8,249);//计时周期:250usTIM2_ARRPreloadConfig(ENABLE);TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);TIM2_Cmd(ENABLE);}4.中断设置@near @interrupt void TIM2_UPD_OVF_BRK_IRQHandler (void){/* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */TIM2_ClearITPendingBit(TIM2_IT_UPDATE);time_250us_flag =1;return;}5.main函数调用main(){sys_init();enableInterrupts();//使能总中断while(1){if(time_250us_flag==1) {time_250us_flag =0; time_1ms_cnt++;}if( time_1ms_cnt >=4) {time_1ms_cnt =0;time_10ms_cnt++;}if( time_10ms_cnt >=10) { time_10ms_cnt =0;time_20ms_cnt++;}if( time_20ms_cnt >=2) { time_20ms_cnt =0;time_100ms_cnt++;}if( time_100ms_cnt >=5) { time_100ms_cnt =0; time_1s_cnt++;}if( time_1s_cnt >=10) {time_1s_cnt =0;}}}。
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的IIC库的使⽤⼀.前⾔stm8是⼀款低功耗的MCU芯⽚,它具备stm32库函数和资源丰富的优势。
也同时具有价格便宜,低功耗的特点。
在⼀些项⽬中,能起到很好的作⽤。
下⾯我介绍⼀下stm8的IIC硬件库函数驱动代码及实现。
⼆.IIC基本操作iic基本操作分为读操作和写操作,这两个操作就可以对设备进⾏⼀些基本的操作了。
还要知道设备的地址就ok了,具体的IIC时序⼤家可以上⽹看看。
三.实现代码1.先要启动IIC的时钟,保证可以正常⼯作。
CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//开启IIC1时钟2.再对IIC进⾏初始化的操作void Init(void){I2C_DeInit(I2C1);I2C_Init(I2C1,IICSPEED, host_address, I2C_Mode_I2C,I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);I2C_Cmd(I2C1,ENABLE);}可以⽤来对IIC的通信时间和主机地址以及从机地址等参数进⾏设置。
IICSPEED最好不要超过400K,会造成通信的不稳定,最好在100K 左右就可以了,host_address是主机的地址,可以⾃⼰设定。
3.IIC的写操作/***************************************************************************** 名称:I2C_WriteByte(uint8_t addr,uint8_t data)* 功能:进⾏IIC的写操作。
* ⼊⼝参数: uint8_t addr 寄存器的地址* uint8_t data 写⼊的数据* 出⼝参数:⽆* 说明:对触摸屏的寄存器进⾏写⼊操作,变量都是16进制****************************************************************************/void I2C_WriteByte(uint8_t addr,uint8_t data){while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //等待空闲I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/I2C_Send7bitAddress(I2C1, I2C1_WRITE_ADDRESS7, I2C_Direction_Transmitter);//器件地址 -- 默认0xD0while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, addr);//寄存器地址while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_SendData(I2C1, data);//发送数据while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_AcknowledgeConfig(I2C1,ENABLE);I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线}上⾯的代码是IIC的写函数,可以对设备的寄存器进⾏写操作。
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,安装后发现也无法下载,提示是。
一时钟管理1 恢复相关的时钟寄存器到默认值void CLK_DeInit()2 启用或关闭外部高速振荡器(HSE)void CLK_HSECmd(FunctionState NewState)启用CLK_HSECmd(ENABLE)关闭CLK_HSECmd(DISABLE)3启用或关闭内部高速振荡器(HSI)void CLK_HSICmd(FunctionState NewState)启用CLK_HSICmd(ENABLE)关闭CLK_HSICmd(DISABLE)4启用或关闭内部低速振荡器(LSI)void CLK_LSICmd(FunctionState NewState)关闭CLK_LSICmd(DISABLE);启用CLK_LSICmd(ENABLE);5 启用或关闭时钟输出功能void CLK_CCOCmd(FunctionState NewState)关闭CLK_CCOCmd(DISABLE);启用CLK_CCOCmd(ENABLE);6 启用或关闭时钟切换void CLK_ClockSwitchCmd(FunctionState NewState)关闭CLK_ClockSwitchCmd(DISABLE);启用CLK_ClockSwitchCmd(ENABLE);7 启用或关闭快速唤醒void CLK_FastHaltWakeUpCmd(FunctionState NewState)关闭CLK_FastHaltWakeUpCmd(DISABLE);启用CLK_FastHaltWakeUpCmd(ENABLE);8 启用或关闭活跃停机模式下的电压调节器CLK_SlowActiveHaltWakeUpCmd(FunctionState NewState)关闭CLK_SlowActiveHaltWakeUpCmd(DISABLE);启用CLK_SlowActiveHaltWakeUpCmd(ENABLE);9 启用或关闭指定的时钟中断CLK_PeripheralClockConfig(CLK_IT_TypeDef CLK_IT, FunctionState NewState)参数1:I2C 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);参数1:SPI 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);参数1:UART1 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);参数1:UART2 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2, ENABLE);参数1:UART3 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART3, ENABLE);参数1:TIMER1 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);参数1:TIMER2 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);参数1:TIMER3 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER3, ENABLE);参数1:TIMER4 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);参数1:TIMER5 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER5, ENABLE);参数1:TIMER6 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER6, ENABLE);参数1:AWU 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, ENABLE);参数1:ADC 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);参数1:CAN 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_CAN, ENABLE);10 系统时钟切换配置CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock,FunctionState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState)参数1:手动切换参数2:内部高速振荡器参数3:关闭参数4:继续启用ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL, CLK_SOURCE_HSI, ENABLE, CLK_CURRENTCLOCKSTATE_ENABLE);参数1:自动切换参数2:内部低速振荡器参数3:关闭参数4:关闭ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);参数1:自动切换参数2:外部高速振荡器参数3:关闭参数4:关闭ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);11 配置内部高速振荡器(HSI)的分频器void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler)1分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);2分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);4分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);8分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);12 配置时钟输出脚(CCO)的时钟源Void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO)参数1:内部高速振荡器/分频值CLK_CCOConfig(CLK_OUTPUT_HSI);参数1:内部低速振荡器CLK_CCOConfig(CLK_OUTPUT_LSI);参数1:外部高速振荡器CLK_CCOConfig(CLK_OUTPUT_HSE);参数1:CPU时钟1分频CLK_CCOConfig(CLK_OUTPUT_CPU);参数1:CPU时钟2分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV2);参数1:CPU时钟4分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV4);参数1:CPU时钟8分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV8);参数1:CPU时钟16分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV16);参数1:CPU时钟32分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV32);参数1:CPU时钟64分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV64);参数1:fHSI CLK_CCOConfig(CLK_OUTPUT_HSIRC);参数1:fMASTER CLK_CCOConfig(CLK_OUTPUT_MASTER);参数1:其它/fCPU CLK_CCOConfig(CLK_OUTPUT_OTHERS);13 启用或关闭指定的外设时钟Void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral,FunctionalState NewState)参数1:时钟安全系统检测标志参数2:启用CLK_ITConfig(CLK_IT_CSSD, ENABLE);参数1:时钟切换中断标志参数2:关闭CLK_ITConfig(CLK_IT_SWIF, DISABLE);14 配置系统时钟分频器Void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescale)参数1:内部高速振荡器1分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);参数1:内部高速振荡器2分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV2);参数1:内部高速振荡器4分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV4);参数1:内部高速振荡器8分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV8);参数1:CPU时钟1分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);参数1:CPU时钟2分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);参数1:CPU时钟4分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);参数1:CPU时钟8分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);参数1:CPU时钟16分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);参数1:CPU时钟32分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32);参数1:CPU时钟64分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64);参数1:CPU时钟128分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);15 配置SWIM时钟分频器void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider)参数1:2分频CLK_SWIMConfig(CLK_SWIMDIVIDER_2);参数1:不分频CLK_SWIMConfig(CLK_SWIMDIVIDER_OTHER); 16配置CAN时钟频率Void CLK_CANConfig((CLK_CANDivider_TypeDef CLK_CANDivider)参数1:时钟频率=HSE/1 CLK_CANConfig(CLK_CANDIVIDER_1);参数1:时钟频率=HSE/2 CLK_CANConfig(CLK_CANDIVIDER_2);参数1:时钟频率=HSE/3 CLK_CANConfig(CLK_CANDIVIDER_3);参数1:时钟频率=HSE/4 CLK_CANConfig(CLK_CANDIVIDER_4);参数1:时钟频率=HSE/5 CLK_CANConfig(CLK_CANDIVIDER_5);参数1:时钟频率=HSE/6 CLK_CANConfig(CLK_CANDIVIDER_6);参数1:时钟频率=HSE/7 CLK_CANConfig(CLK_CANDIVIDER_7);参数1:时钟频率=HSE/8 CLK_CANConfig(CLK_CANDIVIDER_8);17 启用时钟安全系统Void CLK_ClockSercuritySystemEnable(void)18 清除时钟切换忙标志Void CLK_SYSCLKEmergencyClear(void)19 修正内部高速振荡器频率Void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSITrimValue)参数1:校准值为0 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_0);参数1:校准值为1 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_1);参数1:校准值为2 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_2);参数1:校准值为3 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_3);参数1:校准值为4 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_4);参数1:校准值为5 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_5);参数1:校准值为6 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_6);参数1:校准值为7 CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_7);20 获得系统时钟频率u32 CLK_GetClockFreq()21 获得系统时钟源CLK_GetSYSCLKSource(void)22 获得时钟标志状态CLK_GetFlagStatus(CLK_FLAG_TypeDef CLK_FLAG)参数1:内部低速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_LSIRDY);参数1:内部高速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_HSIRDY);参数1:外部高速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_HSERDY);参数1:时钟切换中断标志位CLK_GetFlagStatus(CLK_FLAG_SWIF);参数1:时钟切换忙标志位CCLK_GetFlagStatus(CLK_FLAG_SWBSY);参数1:时钟安全系统检测标志位CLK_GetFlagStatus(CLK_FLAG_CSSD);参数1:辅助振荡器开关状态位CLK_GetFlagStatus(CLK_FLAG_AUX);参数1:时钟输出忙标志位CLK_GetFlagStatus(CLK_FLAG_CCOBSY);参数1:时钟输出就绪标志位CLK_GetFlagStatus(CLK_FLAG_CCORDY);23 获得时钟中断标志状态CLK_GetITStatus(CLK_IT_TypeDef CLK_IT)参数1:时钟安全系统监测标志CLK_GetITStatus(CLK_IT_CSSD);参数1:时钟切换中断标志CLK_GetITStatus(CLK_IT_SWIF);24 清除中断标志状态Void CLK_ClearITPendingBit(CLK_IT_ TypeDef CLK_IT);参数1:时钟安全系统检测标志CLK_ClearITPendingBit(CLK_IT_CSSD);参数1:时钟切换终端标志CLK_ClearITPendingBit(CLK_IT_SWIF);。
所用芯片 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)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。
第一节:心情和时钟说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用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,是不是觉得看东西要仔细一下~~。