STM8L05X入门学习笔记.docx
- 文档编号:20212639
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:18
- 大小:1.61MB
STM8L05X入门学习笔记.docx
《STM8L05X入门学习笔记.docx》由会员分享,可在线阅读,更多相关《STM8L05X入门学习笔记.docx(18页珍藏版)》请在冰豆网上搜索。
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、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM8L05X 入门 学习 笔记