STM8L05X入门学习笔记.docx

上传人:b****2 文档编号:20212639 上传时间:2023-04-25 格式:DOCX 页数:18 大小:1.61MB
下载 相关 举报
STM8L05X入门学习笔记.docx_第1页
第1页 / 共18页
STM8L05X入门学习笔记.docx_第2页
第2页 / 共18页
STM8L05X入门学习笔记.docx_第3页
第3页 / 共18页
STM8L05X入门学习笔记.docx_第4页
第4页 / 共18页
STM8L05X入门学习笔记.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

STM8L05X入门学习笔记.docx

《STM8L05X入门学习笔记.docx》由会员分享,可在线阅读,更多相关《STM8L05X入门学习笔记.docx(18页珍藏版)》请在冰豆网上搜索。

STM8L05X入门学习笔记.docx

STM8L05X入门学习笔记

1、工程新建

首先新建文件夹,在文件夹下建立四个文件(这个看个人喜好),我喜欢建立一个工程文件夹Project用于存放工程文件,Library文件用于存放库文件,App用于存放用户程序,Doc用于存放说明文档,如图1所示。

图1

二:

将官方的库文件Libraries文件下STM8S_StdPeriph_Driver这个文件下的内容复制到自己新建的Library文件下,把官方Project文件下Template文件夹下main.cstm8s_conf.hstm8s_it.c

和stm8s_it.h复制到App文件夹下。

如图2,图3。

图2

图3

三:

打开IAR选择Project->CreateNewProject–>ok,将文件保存到Project下,

这时工程已经建好,右击工程选择AddGroup,然后依次添加文件App,Libraries,Doc,BSP_CFG

配置好如图所示

四:

给工程下APP添加App文件下的文件如图

给Libraries添加Library文件下src文件下的所有文件、

五配置Options,包括如下,1选择型号这里选STM8S903K3

2C++选项卡配置路经,和型号的宏定义。

六编译工程,这事会提醒对工程的保存,进行保存即可,这时会发现很多错误,这是因为这个库包含了所有的型号,有些这个单片机没有,将它移除即可。

再次编译就会发现没有错误了。

7HEX文件输出

2、系统时钟

四种不同的时钟源可以用来驱动系统时钟:

●16MHz高速内部(HSI)工厂调整RC时钟

●1到16MHz高速外(HSE)振荡器时钟

●32.768千赫低速外(LSE)振荡器时钟

●38千赫低速内部(LSI)低功耗时钟

每个时钟源可以开启或关闭独立不使用时的功耗,优化。

这四个时钟可以用一个可编程分频器(因素1至128)驱动

系统时钟(系统时钟)。

该系统时钟用于时钟的核心,内存和外设。

复位后,该设备重新启动与HSI时钟除以8的违约。

该分频器分频比

时钟源可以改变应用程序尽快执行代码起点。

staticvoidCLK_Config(void)

{

/*SelectHSEassystemclocksource*/

CLK_SYSCLKSourceSwitchCmd(ENABLE);

CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);

/*systemclockprescaler:

1*/

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

while(CLK_GetSYSCLKSource()!

=CLK_SYSCLKSource_HSE)

{}

}

staticvoidRTC_Config(void)

{

/*EnableRTCclock*/

CLK_RTCClockConfig(CLK_RTCCLKSource_LSE,CLK_RTCCLKDiv_1);

/*WaitforLSEclocktobeready*/

while(CLK_GetFlagStatus(CLK_FLAG_LSERDY)==RESET);

/*waitfor1secondfortheLSEStabilisation*/

LSE_StabTime();

CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);

/*ConfigurestheRTCwakeuptimer_step=RTCCLK/16=LSE/16=488.28125us*/

RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);

/*EnablewakeupunitInterrupt*/

RTC_ITConfig(RTC_IT_WUT,ENABLE);

/*EnablegeneralInterrupt*/

enableInterrupts();

}

/*RTCwake-upeventevery500ms(timer_stepx(1023+1))*/

RTC_SetWakeUpCounter(1023);

RTC_WakeUpCmd(ENABLE);

3、看门狗

voidIWDG_Config(void)

{

/*EnableIWDG(theLSIoscillatorwillbeenabledbyhardware)*/

IWDG_Enable();

/*IWDGtimeoutequalto214ms(thetimeoutmayvariesduetoLSIfrequency

dispersion)*/

/*EnablewriteaccesstoIWDG_PRandIWDG_RLRregisters*/

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

/*IWDGconfiguration:

IWDGisclockedbyLSI=38KHz*/

IWDG_SetPrescaler(IWDG_Prescaler_32);

/*IWDGtimeoutequalto214.7ms(thetimeoutmayvariesduetoLSIfrequencydispersion)*/

/*IWDGtimeout=(RELOAD_VALUE+1)*Prescaler/LSI

=(254+1)*32/38000

=214.7ms*/

IWDG_SetReload((uint8_t)RELOAD_VALUE);

/*ReloadIWDGcounter*/

IWDG_ReloadCounter();

}

/*ReloadIWDGcounter*/

IWDG_ReloadCounter();

4、Eeprom

__no_init__eepromunsignedcharnum@0x1001;

FLASH_Unlock(FLASH_MemType_Data);

FLASH_ProgramByte(0x1001,temp1);//eeprommemory:

addressis0x1001=temp1

FLASH_WaitForLastOperation(FLASH_MemType_Data);

5、Sleep

1、WAITmode

在等待模式,CPU的时钟是停止的,被选择的外设继续运行。

WAITmode分为两种方式:

WFE,WFI。

WFE是等待事件发生,才从等待模式中唤醒。

WFI是等待中断发生,才从等待模式中唤醒。

2、lowpowerrunmode

在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。

电压被配置成UltraLowPower模式。

进入此模式可以通过软件配置,退出此模式可以软件配置或者是复位。

3、lowpowerwaitmode

这种模式进入是在lowpowerrunmode下,执行wfe。

在此模式下CPU时钟会被停止,其他的外设运行情况和lowpowerrunmode类似。

在此模式下可以被内部或外部事件、中断和复位唤醒。

当被事件唤醒后,系统恢复到lowpowerrunmode。

4、Active-Haltmode

在此模式下,除了RTC外,CPU和其他外设的时钟被停止。

系统唤醒是通过RTC中断、外部中断或是复位。

5、Haltmode

在此模式下,CPU和外设的时钟都被停止。

系统唤醒是通过外部中断或复位。

关闭内部的参考电压可以进一步降低功耗。

通过配置ULP位和FWU位,也可以6us的快速唤醒,不用等待内部的参考电压启动。

voidGPIO_LowPower_Config(void)//进入低功耗前,配置端口输出

{

/*PortAinoutputpush-pull0*/

GPIO_Init(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode_Out_PP_Low_Slow);

/*PortBinoutputpush-pull0*/

GPIO_Init(GPIOB,GPIO_Pin_All,GPIO_Mode_Out_PP_Low_Slow);

/*PortCinoutputpush-pull0exceptButtonpins*/

GPIO_Init(GPIOC,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_Out_PP_Low_Slow);

/*PortDinoutputpush-pull0*/

GPIO_Init(GPIOD,GPIO_Pin_All,GPIO_Mode_Out_PP_Low_Slow);

/*PortEinoutputpush-pull0*/

GPIO_Init(GPIOE,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5,GPIO_Mode_Out_PP_Low_Slow);

/*PortFinoutputpush-pull0*/

/*NotPF0becauseInputforICCmeasurement*/

GPIO_Init(GPIOF,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode_Out_PP_Low_Slow);

GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);

}

6、AD

void adc_init(void)

GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4IO设置为上拉输入

  ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2

  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发

  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);

  //禁止AIN2AIN4的施密特触发器,降低IO静态功耗

  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!

  

ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE,//单次转换

                        ADC1_CHANNEL_4,//只能选择一个通道!

                        ADC1_ALIGN_RIGHT);//右对齐

 ADC1_Cmd(ENABLE);//开启ADC

}

---------------------

while

(1)

  {

ADC1_StartConversion();//开启一次转换一次

while(!

ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成

    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除

    value=(u16)ADC1_GetConversionValue();//从ADC_DR中读取ADC值

}

单次扫描模式:

该模式是用来转换从AIN0到AINn之间的一连串模拟通道,‘n’是在ADC_CSR寄存器的CH[3:

0]位中指定的通道编号(即CH[3:

0]里配置第n个通道,就从通道0顺序递增逐个通道进行转换,直到第n个通道结束。

例如,CH[3:

0]里配置为AIN4,则对AIN0、AIN1、AIN2、AIN3、AIN4进行转换,其他通道不转换)。

在扫描转换的过程中,序号CH[3:

0]位的值是被硬件自动更新的,它总保存当前正在被转换的通道编号。

单次转换模式可以在在SCAN位被置位且CONT位以被清零时通过置位ADON位来启动。

注意:

当使用扫描模式时,不可以将AIN0到AINn之间通道对应的I/O口设为输出状态,因为ADC的多路选择器已经将这些I/O口的输出模块禁用了。

对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR中(例如,CH[3:

0]里配置为AIN4,则ADC_DB0R存放AIN0的转换结果,ADC_DB1R存放AIN1的转换结果,以此类推。

),当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当EOCIE位已被置位时将产生一个中断。

可以从缓冲寄存器中读取各个通道的转换结果值。

如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。

在转换序列正在进行过程中不要清零SCAN位;单次扫描模式可通过清零ADON位来立即停止。

为了开启一次新SCAN扫描转换,可以通过对ADC_CR1寄存器的EOC位清零和ADON位置位来实现。

示例程序:

void adc_init(void)

GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);//AIN2 IO设置为上拉输入

  GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4IO设置为上拉输入

 

ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2

  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发

  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);

  //禁止AIN2AIN4的施密特触发器,降低IO静态功耗

  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!

  

ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE,//单次转换

                        ADC1_CHANNEL_4,//配置通道号最大的那个

                        ADC1_ALIGN_RIGHT);//右对齐

  ADC1_Cmd(ENABLE);//开启ADC

ADC1_ScanModeCmd(ENABLE);//开启扫描模式

}

voidmain(void)

u16value1=0;

u16value2=0;

  adc_init();

  while

(1)

  {

ADC1_StartConversion();//开启一次转换

while(!

ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成

    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除

    value1=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL2)//读取AIN2的值

value2=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL4)//读取AIN4的值

}

}

7、LCD

80引脚封装:

LCD控制器可以通过48驱动44x4或40x8像素

可用的液晶引脚。

COM4..7信号和SEG40信号共享相同的43。

四引脚和多路复用是通过在lcd_cr4duty8位控制寄存器:

如果duty8=0,该SEG40..43分别映射到PF4..pf7端口。

如果duty8=1,COM4..7分别映射到PF4..pf7端口。

64引脚封装●:

LCD控制器可以驱动40x4或36x8像素

(1)通过44

可用的液晶引脚。

COM4..7信号和39信号共享相同的seg36..

四引脚和多路复用是通过在lcd_cr4duty8位控制寄存器:

如果duty8=0,该seg36..39分别映射到PF4..pf7端口。

如果duty8=1,COM4..7分别映射到PF4..pf7端口。

48引脚封装●:

LCD控制器可以驱动28x4或24x8像素

(1)通过32

可用的液晶引脚。

COM4..7信号和27信号共享相同的seg24..

四引脚和多路复用是通过在lcd_cr4duty8位控制寄存器:

如果duty8=0,该seg24..27分别映射PC4,陵,Pe6和pe7上

港口。

如果duty8=1,COM4..7分别映射到PC4,陵,Pe6和pe7

港口

======================================================================

设置在lcd_cr4的duty8点当(激活8COMS),LCD的RAM

通过两页访问,每个被在lcd_cr4注册page_com点激活:

page_com=0时,地址0x0c到0x21给访问的第一个页面,

对应于1,2和3的COM0。

指的是page_com点描述。

page_com=1时,地址0x0c到0x21获得第二页,

对应于5,6和7COM4。

指的是page_com点描述

8、

9、

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1