【STM8学习笔记1】 一步步学习 使用TIM1测量PWM波

【STM8学习笔记1】 一步步学习 使用TIM1测量PWM波
【STM8学习笔记1】 一步步学习 使用TIM1测量PWM波

STM8 库函学习笔记之GPIO

STM8库函数学习笔记之GPIO 相关的函数: 1 void GPIO_DeInit(GPIO_TypeDef* GPIOx); 2 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); 3 void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal); 4 void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); 5 void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); 6 void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); 7 u8 GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 8 u8 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 9 BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); 10 void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState); //--------------------------------------------------------------------------------------- void GPIO_DeInit(GPIO_TypeDef* GPIOx); 这个函数用来恢复指定端口的寄存器ODR、DDR、CR1及CR2到默认值0x00,即无中断功能的浮动输入,无返回值。 参数: GPIOx: GPIOA到GPIOI可选。 示例: 恢复GPIOB的相应寄存器为默认值 GPIO_DeInit(GPIOB); //--------------------------------------------------------------------------------------- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); 这个函数用来配置指定端口的各个引脚功能,无返回值。 参数: GPIOx: 端口GPIOA到GPIOI可选。 GPIO_Pin: 要初始化的引脚,可以用“或”方式选择多个引脚, 可选值: GPIO_PIN_0 选择 0 引脚 GPIO_PIN_1 选择 1 引脚 GPIO_PIN_2 选择 2 引脚 GPIO_PIN_3 选择 3 引脚 GPIO_PIN_4 选择 4 引脚 GPIO_PIN_5 选择 5 引脚 GPIO_PIN_6 选择 6 引脚 GPIO_PIN_7 选择 7 引脚

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 input interrupt 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 for enable the counter */ GPIO_Init( CTN_GPIO_PORT, CTN_CNTEN_GPIO_PIN, GPIO_Mode_Out_OD_HiZ_Slow); /* Wake up counter: for detect end of counter GPIO set in input interupt active mode */

STM8L探索套件学习笔记-EXTI外部中断(二)

STM8L探索套件学习笔记-EXTI外部中断(二) 上节讲到GPIO 口可以作为外部中断使用,今天我们就使用探索套件上的USER 按键,翻转LED1 灯。外部中断叙述如下图所示,USER KEY 连到的是PC.1 所以使用的是EXTI1 中断线,和STM32 的中断方式比较接近。 首先我们把KEY 的GPIO 设置为输入中断使能 GPIO_Init(KEY_PORT,KEY_PIN,GPIO_Mode_In_FL_IT); 然后配置中断1 为下降沿低电平触发 EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low); 设置中断的优先级 ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_1); 开全局中断 enableInterrupts(); 最后我们到中断文件里面STM8L15X_it.c 设置 INTERRUPT_HANDLER(EXTI1_IRQHandler, 9) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ GPIO_ToggleBits(GPIOE, GPIO_Pin_7); Delay(0xFFFF); EXTI_ClearITPendingBit(EXTI_IT_Pin1); } tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

stm8l 定时器

STM8L探索套件学习笔记-TIM定时器(五)2011-04-21 08:28 STM8L的定时器分:高级定时器TIM1,通用定时器TIM2/3/5,基础定时器TIM4。其中高级定时器和通用定时器都是16位定时器,不同之处高级定时器有DMA 功能,基础定时器是8位定时器,它们的更详细功能可以参考说明手册。 今天我们使用基础定时器TIM4做一个延时的任务,采用两种方式实现:查询和中断的方法。 1查询的方法就是查询状态寄存器中的UIF位(update interrupt flag)是否置位,主要代码: void delay_ms(u16 n_ms) { /* Init TIMER 4 */ CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE); /* Init TIMER 4 prescaler: / (2^6) = /64 */ TIM4->PSCR = 6; /* HSI div by 1 --> Auto-Reload value: 16M / 64 = 1/4M, 1/4M / 1k = 250*/ TIM4->ARR = 250; /* Counter value: 2, to compensate the initialization of TIMER*/ TIM4->CNTR = 2; /* clear update flag */ TIM4->SR1 &= ~TIM4_SR1_UIF;

/* Enable Counter */ TIM4->CR1 |= TIM4_CR1_CEN; while(n_ms--) { while((TIM4->SR1 & TIM4_SR1_UIF) == 0) ; TIM4->SR1 &= ~TIM4_SR1_UIF; } /* Disable Counter */ TIM4->CR1 &= ~TIM4_CR1_CEN; } 2 中断的方法,更有效率,具体看附件

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学习笔记——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 模式1 TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM8时钟树解析

STM8库函数学习笔记之时钟树解析 STM8库函数学习笔记之时钟管理 相关函数: void CLK_DeInit(void); void CLK_HSEC md(FunctionalState NewState); void CLK_HSIC md(FunctionalState N ewState); void CLK_LSICmd(FunctionalState NewState); void CLK_CCOCmd(FunctionalState NewState); void CLK_ClockSwitchC md(FunctionalState NewState); void CLK_FastHaltWakeUpCmd(FunctionalState N ewState); void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState); void CLK_PeripheralC lockConfig(CLK_Peripher al_TypeDef CLK_Peripheral, FunctionalState NewState); ErrorStatus CLK_C lockSwitchConfig(CLK_SwitchMode_TypeDef CLK_Sw itchMode, C LK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); void CLK_HSIPr escalerConfig(CLK_Prescaler_TypeDef HSIPrescaler); void CLK_CCOConfig(CLK_Output_TypeD ef CLK_CCO); void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState); void CLK_SYSCLKC onfig(CLK_Pr escaler_TypeDef CLK_Prescaler); void CLK_SWIMConfig(CLK_SWIMD ivider_TypeDef CLK_SWIMDivider); void CLK_CANConfig(CLK_C ANDivider_TypeD ef CLK_CANDivider); void CLK_ClockSecuritySystemEnable(void); void CLK_SYSCLKEmergencyClear(void); void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSIC alibrationValue); u32 CLK_GetC lockFreq(void); CLK_Source_TypeD ef CLK_GetSYSCLKSource(void); FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef C LK_FLAG); ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT); void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT); //----------------------------------------------------------------------------------------- void CLK_DeInit(void);

STM8S系列学习笔记

加入收藏 联系站长 . 网站首页 . 新品 . 新闻 . 方案 . 技术文库 . TI设计应用 . TI专家解答 . TI资源中心 . 移动开发 . 嵌入式厂商 . 前沿科技 . 下载 . 商城 . 邮购须知 . |技术文库首页|嵌入式系统| EDA工具与服务|可编程逻辑|通信技术|电源技术|模拟设计|测试测量|消费电子|汽车电子|医疗电子|工业电子|存储 | STM8S系列学习笔记★★★【字体:小大】 STM8S系列学习笔记 作者:Free 文章来源:Free 点击数: 482 更新时间: 2011-4-4 tuv移值寄存器7 6 5 4 3 2 1 0 0x00 Px_ODR 复位值ODR7 ODR6 ODR5 ODR4 ODR3 ODR2 ODR1 ODR0 0x01 Px_IDR 复位值IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0 0x02 Px_DDR 复位值DDR7 DDR6 DDR5 DDR4 DDR3 DDR2 DDR1 DDR0 0x03 Px_CR1 复位值C17 C16 C15 C14 C13 C12 C11 C10 0x04 Px_CR2 复位值C27 C26 C25 C24 C23 C22 C21 C20

到其他引脚。 Px_IDR: IDR[7:0]:端口输入数据寄存器位 不论引脚是输入还是输出模式,都可以通过该寄存器读入引脚状态值。该寄存器为只读寄存器。 0:逻辑低电平 1:逻辑高电平 Px_DDR: DDR[7:0]:数据方向寄存器位 ,这些位可通过软件置1或置0,选择引脚输入或输出 0: 输入模式 1: 输出模式 Px_CR1: C1[7:0]控制寄存器位 这些位可通过软件置1或置0,用来在输入或输出模式下选择不同的功能。在输入模式时(DDR=0): 0:浮空输入 1::带上拉电阻输入 在输出模式时(DDR=1): 0:模拟开漏输出(不是真正的开漏输出) 1:推挽输出, 由CR2相应的位做输出摆率控制 Px_CR2: C2[7:0]控制寄存器位相应的位通过软件置1或置0,用来在输入或输出模式下选择不同的功能。在输入模式下,由CR2相应的位使能中断。如果该引脚无中断功能,则对该引脚无影响。在输出模式下,置位将提高IO速度。此功能适用O3和O4输出类型。(参见引脚描述表) 在输入模式时(DDR=0): 0: 禁止外部中断 1: 使能外部中断 在输出模式时(DDR=1): 0:输出速度最大为2MHZ. 1:输出速度最大为10MHZ 在stm8的库里面已经将这些外设都进行了封装定义,并提供这些外设的SPI,也就是我们所说的stm8的库函数。下面我们看看任何结构化的定义这些IO的寄存器的。 typedef struct GPIO_struct { vu8 ODR; /*!< Output Data Register */ vu8 IDR; /*!< Input Data Register */ vu8 DDR; /*!< Data Direction Register */ vu8 CR1; /*!< Configuration Register 1 */ vu8 CR2; /*!< Configuration Register 2 */ }GPIO_TypeDef; 所有的IO通用寄存器,定义成GPIO_TypeDef这种类型的结构体,结构体中的每个寄存器都是u8类型,这个可以查看stm8库函数类型声明,其实等价于volatie unsigned char这种类型。那么我们就有了GPIO_TypeDef这种类型。下面是各个端口的结构化定义: #define GPIOA ((GPIO_TypeDef *) GPIOA_BaseAddress) #define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress) #define GPIOC ((GPIO_TypeDef *) GPIOC_BaseAddress) #define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress) #define GPIOE ((GPIO_TypeDef *) GPIOE_BaseAddress) #define GPIOF ((GPIO_TypeDef *) GPIOF_BaseAddress) 下面是各个端口的起始地址: #define GPIOA_BaseAddress 0x5000 #define GPIOB_BaseAddress 0x5005 #define GPIOC_BaseAddress 0x500A #define GPIOD_BaseAddress 0x500F #define GPIOE_BaseAddress 0x5014 #define GPIOF_BaseAddress 0x5019 #define GPIOG_BaseAddress 0x501E #define GPIOH_BaseAddress 0x5023 #define GPIOI_BaseAddress 0x5028 上面的部分是硬件的抽象成软件的部分,有了这些我们就可以进行对寄存器操作了,比如上面的PA_DDR的操作,现在就可以写成GPIO->DDR=VALUE; 这样进行每个端口设置时,肯定要设置使用哪个引脚,速度是多少,哪种模式,这几个对每组端口都是一样的,st有对他进行了封装,如下: typedef enum { GPIO_MODE_IN_FL_NO_IT = (u8)0b00000000, /*!< Input floating, no external interrupt */ GPIO_MODE_IN_PU_NO_IT = (u8)0b01000000, /*!< Input pull-up, no external interrupt */

STM8系列C语言入门指导

说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。 前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献, 可是我会什么?我会的大大们都写了,我不会的大大们也写了。一个星期前花项目经费买了***的kit三合一板,最近几天闲了下来,便动手调试一下。算是有点心得,我又想奉献,可是我会什么? 我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。 唠叨了这么多,现在开始吧。 配置:stvd,cosmic 我学单片机开门三砖总是要砸的。 第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下 第二砖:时钟系统,这等下再说。 第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。 现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。 1CLK_ECKR|=0X1;//开启外部时钟 2while(!(CLK_ECKR&0X2));//等待外部时钟rdy 3CLK_CKDIVR&=0XF8;//CPU无分频 4CLK_SWR=0XB4;//选择外部时钟 5CLK_SWCR|=0X2;//使能外部时钟 上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让c pu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。 就变成了下面的代码

转一篇学习STM8的好文章

第一节:心情和时钟 说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,可是我会什么?我会的大大们都写了,我不会的大大们也写了。一个星期前花项目经费买了***的kit三合一板,最近几天闲了下来,便动手调试一下。算是有点心得,我又想奉献,可是我会什么? 我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。唠叨了这么多,现在开始吧。 配置:stvd ,cosmic 我学单片机开门三砖总是要砸的。 第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下 第二砖:时钟系统,这等下再说。 第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。 现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。 1 CLK_ECKR |=0X1; //开启外部时钟 2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy 3 CLK_CKDIVR &= 0XF8; //CPU无分频 4 CLK_SWR = 0XB4; //选择外部时钟 5 CLK_SWCR |=0X2; //使能外部时钟 上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。 就变成了下面的代码 CLK_ECKR |=0X1; //开启外部时钟 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy CLK_CKDIVR &= 0XF8; //CPU无分频 CLK_SWR = 0XB4; //选择外部时钟 while(!(CLK_SWCR&0X8)); //这里要等

IAR FOR STM8例程要点

IAR+STM8——EXTI外部中断控制寄存器 2013-03-21 23:23:15| 分类:STM8|举报|字号订阅 这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。吸取前面UART3的教训,先看开发板的原理图吧。这个按键被接到了 STM8S207SB的PD7上,已做了上拉处理。为了简单明了,还是点LED1吧。按一下LED1亮,再按一下LED1灭。好了,写程序吧。 #i nclude #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 开发板上的LED1接在PD3上 void GPIO_init(void) { PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出 PD_CR1 = 0x08; // 设置PD3为推挽输出 PD_CR2 = 0x80; // 使能PD7外部中断 } void EXTI_init(void) { EXTI_CR1 = 0x80; // PD口下降沿触发中断 } #pragma vector=0x02 // 这里很关键!看下面说明。 __interrupt void EXTI_PD7_TLI(void) { LED1_FLASH; } void init_devices(void) { asm("sim"); // 关全局中断

GPIO_init(); EXTI_init(); asm("rim"); // 开全局中断 } void main( void ) { init_devices(); // 主循环里没有程序需要执行 while(1); } 这里着重要说明的一点是PD7的外部中断程序。看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。接下来只能另想办法,仔细翻了资料后发现,PD7和PD其他端口不一样,PD7后面拖了个小尾巴TLI,再看手册上的TLI描述,乖乖,TLI拥有芯片最高级别中断,享有独立专用的中断向量号0,这下就好办了,按IAR的规矩,向量号加2,程序改成#pragma vector=0x02,重新来一遍编译、下载、运行,按键终于听话了。 IAR+STM8——UART串口发送与中断接收 2013-03-21 23:22:34| 分类:STM8|举报|字号订阅 STM8的UART功能强大,除了常规的串口异步通讯外,还拥有LIN主模式、红外编解码器、智能卡模拟等功能。新手还是从基本的串口通讯入手,那些高级功能等熟练以后再慢慢研究吧。 #i nclude void CLK_init(void) {

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

STM8L探索套件学习笔记-AES硬件加密(十三)

STM8L探索套件学习笔记-AES硬件加密(十三) 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。对称密码体制的 发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解 密)算法两部分组成。密钥扩展算法将b 字节用户主密钥扩展成r 个子密钥。 加密算法由一个密码学上的弱函数f 与r 个子密钥迭代r 次组成。混乱和密钥 扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变 长密钥和分组是该体制的设计要点。AES 是美国国家标准技术研究所 NIST 旨在取代DES 的21 世纪的加密标准。AES 的基本要求是,采用对 称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128 位, 算法应易于各种硬件和软件实现。1998 年NIST 开始AES 第一轮分析、测试和 征集,共产生了15 个候选算法。1999 年3 月完成了第二轮AES2 的分析、测 试。2000 年10 月2 日美国政府正式宣布选中比利时密码学家Joan Daemen 和Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为AES.在应用方面,尽 管DES 在安全上是脆弱的,但由于快速DES 芯片的大量生产,使得DES 仍能 暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES 迟早要被AES 代替。流密码体制较之分组密码在理论上成熟且安全,但未被列 入下一代加密标准。AES 加密数据块和密钥长度可以是128 比特、192 比 特、256 比特中的任意一个。AES 加密有很多轮的重复和变换。大致步骤如下: 1、密钥扩展(KeyExpansion), 2、初始轮(Initial Round), 3、重复轮(Rounds),每一轮又包括: SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。STM8L 采用的是128 比特的AES 加密数据块和密钥

stm8学习笔记

所用芯片 stm8s105s4 开发环境:ST Visual Develop Stm8s的库为V1.1.1 CPU频率及所有外设频率/时钟 系统复位后,所有外设时钟均处于开的状态。用户可通过清除CLK_PCKENR1或CLK_PCKENR2中的PCKEN位来关闭相应的外设时钟。但是在关闭外设的时钟前,用户必须设置相应的位禁用该外设。 为了使能一个外设,用户必须先设置寄存器CLK_PCKENR中对应的PCKEN位,然后设置外设控制寄存器中的外设使能位。 AWU计数器是由独立于fMASTER的内部或外部时钟(LSI或HSE)驱动,因此,即使寄存器的时钟已被关掉,该外设依然可以继续运行。 例如禁用所有外设时钟: CLK_PCKENR1 = 0x00;// close all clks of Peripheral CLK_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个对应的寄存器如下表: 注意:初始复位时,所有引脚设置为浮空输入。

基于STM8的74HC759驱动数码管显示程序学习笔记

74HC759驱动数码管显示程序学习笔记本程序基于STM8S105K4 单片机学习程序。程序硬件就是STM8的最小开发板搭建,用的内部高速晶振1分频,数码管用595串联驱动输入四线。经测试可以正常显示。最终通过调试和实验。所有的程序如下:(程序中可能还有些其他没有发现的问题,或其他错误有问题再学习更改。) 具体注释见程序: //#ifndef __DISPLAY_595_H //#define __DISPLAY_595_H ///////********////// /*DS GPIOD4 串行数据输入*/ /*STCP GPIOD5 存储寄存器时钟*/ /*SHCP GPIOD6 移位寄存器时钟*/ /*OE GPIOD7 输出使能(低电平有效)可选择脉冲输出以调节亮度*/ /***显示数据调用方法, void init_595(); 输入实际数据,符号位(0为正,1为负),小数点位置(没有置0) //extern display_all(unsigned int display_data_int ,unsigned char flag ,unsigned char dot); ***/ ////**设置方向寄存器**//// #define DS_IO() GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST); #define STCP_IO() GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); #define SHCP_IO() GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST); #define OE_IO() GPIO_Init(GPIOD, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST); ////**设置数据输出0**//// #define DS_OUT0() GPIO_WriteLow(GPIOD, GPIO_PIN_4);

STM8L探索套件学习笔记-ADC_DMA(十五)

STM8L探索套件学习笔记-ADC_DMA(十五) 使用ADC 的DMA 功能,每次连续转换8 个数据,然后平均显示到LCD 上。主要代码如下:void main(void){/* Enable ADC1 clock */CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);/* Enable DMA1 clock */CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);LCD_GLASS_Init();/* Initialize and configure ADC1 */ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_2);ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 Channels 24 */ADC_ChannelCmd(ADC1, ADC_Channel_24, ENABLE);/* Connect ADC to DMA channel 0 */SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChann el0);DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,ADC1_DR_ADDRESS,BUFFER_SIZE,DMA_DIR_Periphera lToMemory,DMA_Mode_Circular,DMA_MemoryIncMode_Inc,DMA_Priority_Hig h,DMA_MemoryDataSize_HalfWord);/* DMA Channel0 enable */DMA_Cmd(DMA1_Channel0, ENABLE);/* Enable DMA1 channel0 Transfer complete interrupt */DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);/* DMA enable */DMA_GlobalCmd(ENABLE);/* Enable ADC1 DMA requests*/ADC_DMACmd(ADC1, ENABLE);/* Start ADC1 Conversion*/ADC_SoftwareStartConv(ADC1);enableInterrupts();/* Infinite loop */while (1){}}tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

第01讲STM8单片机应用

举一反三课堂笔记 STM8剑齿虎开发板课件文档 官方网站:https://www.360docs.net/doc/2f3763372.html, 官方店铺:https://www.360docs.net/doc/2f3763372.html, 关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。STM8技术交流QQ群【335123291】

第1讲单片机应用简介 目录 1.1概述 (3) 1.2单片机能做什么 (3) 1.3学习单片机应有的知识储备 (5) 1.4如何学习STM8单片机 (6) 1.5C语言发展过程 (8)

1.1概述 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术。把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代由当时的4位、8位单片机,发展到现在的32位、64位单片机。 1.2单片机能做什么 单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 1智能仪器 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、

相关主题
相关文档
最新文档