实例一:控制灯的亮灭(或者蜂鸣器响,只要连接相应端口就可以了): #include \头文件 #define ulong unsigned long
/////////////////////////////////////////////////////////////////////////////// void delay(ulong i) {ulong j;
for(j=0;j
}////////////延时函数
void main(void)////////////主函数 {
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); while(1) {
GPIO_WriteHigh(GPIOD, GPIO_PIN_1); delay(10000); delay(10000); delay(10000);
GPIO_WriteLow(GPIOD, GPIO_PIN_1); delay(10000); delay(10000); delay(10000); } }
第二步:控制灯按照一定的频率闪烁:频率可以使用时钟! Stm8启动时,主时钟默认为HSIRC时钟的8分频,HSIRC是可以提供一个低成本的16MHz时钟源,
#include \头文件 void CLK_Configuration(void); void main(void)////////////主函数 {
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); CLK_Configuration(); while(1) {
GPIO_WriteReverse(GPIOD, GPIO_PIN_1); } }
void CLK_Configuration(void) {
/* Fmaster = 16MHz */
CLK_HSIPrescalerConfig( CLK_PRESCALER_HISDIV1); }
例题三:灯闪亮的同时蜂鸣器响 #include \头文件 #define ulong unsigned long
/////////////////////////////////////////////////////////////////////////////// void delay(ulong i) {ulong j;
for(j=0;j
}////////////延时函数);
void main(void)////////////主函数 {
GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOB);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOB, GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_FAST ); while(1) {
GPIO_WriteHigh(GPIOD, GPIO_PIN_1); delay(10000); delay(10000);
GPIO_WriteLow(GPIOD, GPIO_PIN_1); delay(10000); delay(10000);
GPIO_WriteHigh(GPIOB, GPIO_PIN_0); delay(10000); delay(10000);
GPIO_WriteLow(GPIOB, GPIO_PIN_0); delay(10000); delay(10000); } }
时钟控制器功能强大而且灵活易用。其目的在于使用用户在获得最好性能的同时,亦能保证消耗的功率最低。
用户可以独立管理各个时钟源,并将它们分配到CPU或者各个外设。主时钟和CPU的时钟均带有分频器。 主时钟源:
四种时钟源可以作为主时钟源:
1.1—24MHz高速外部晶体振荡器(HSE)
2.最大24MHz高速外部时钟信号(HSE user-ext) 3.16MHz高速内部RC振荡器(HSI) 4.128KHz低速内部RC(LSI)
各个时钟源可独立打开或者关闭,从而优化功耗。
HSE:高速外部时钟信号,由两个时钟源产生:HSE外部晶体/陶瓷谐振器;HSE用户外部有源时钟。(为了最大限度的减少输出失真和减少启动失真的稳定时间,谐振器和负载电容应尽可能的靠近谐振器引脚。负载电容值应根据所选的谐振器进行调整。)
外部1至24MHz的振荡器其优点在于能够产生精确的占空比为50%的主时钟信号。 为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。 时钟设置的目的到底是什么?时钟设置肯定会出现中断?
貌似是这样的:运用合适的时钟配置可以使得功耗降低,有时候计数频率很大,需要很大的计数或者怎么样时,需要使用其他的时钟,即非默认的时钟!暂且这样解释!
例题四:利用中断
按键控制灯的亮灭。
#include \头文件 void main(void)////////////主函数 {
GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOB);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_IT); EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB ,
EXTI_SENSITIVITY_FALL_ONLY );///////定义端口的外部中断
enableInterrupts();//////////////////这个一定不能丢,中断使能 while(1) { } }
#pragma vector=6//中断编号+2
__interrupt void EXIT_PORTB_IRQHander(void) {
if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)==0x00)/////检查是否按下 {
GPIO_WriteReverse(GPIOD,GPIO_PIN_1); }
}
//////默认的时钟为HSI的8分频,即上电默认的频率。
中断设置为上升沿触发:则程序会有微小的变化: #include \头文件 void main(void)////////////主函数 {
GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOB);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_IT); EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB ,EXTI_SENSITIVITY_RISE_ONLY );///////定义端口的外部中断
enableInterrupts();//////////////////这个一定不能丢,中断使能 while(1) { } }
#pragma vector=6//中断编号+2
__interrupt void EXIT_PORTB_IRQHander(void) {
if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)==0x01)/////检查是否按下 {
GPIO_WriteReverse(GPIOD,GPIO_PIN_1); } }
时钟这里到底是怎么回事啊?LSI等如何配置,配置时钟做什么用的?
例题五:设计一个程序使得当按键按下后发光二极管按照不同的频率闪烁。 分析:不同的频率闪烁,可以设置为按照100,500,1000,2000Hz的频率闪烁。
定时器timer4的使用:
该定时器由一个带可编程预分频器的8位可位自动重载的向上计数器所组成,它可以用来做时基发生器,具有溢出中断功能。
Timer6同时钟/触发信号控制器一起用于定时器同步和级联。
Time4的主要功能包括:
1.8位向上计数的自动重载计数器(既然是向上计数,那么计算初值时?) 2.3位可编程的与分配器(可在运行中修改),提供1,2,4,8,16,32,64,和128这8种分频比例。 3.中断产生
——在计数器更新时:计数器溢出。 Timer6的主要功能:
1.8位向上计数的自动重载计数器 2.3位可编程的与分配器(可在运行中修改),提供1,2,4,8,16,32,64,和128这8种分频比例。 3.用于和外部信号相连和定时器级联的同步电路 4.中断产生:
——在计数器更新时:计数器溢出 ——在触发信号输入时。 Timer4和timer6中断:
该定时器的时钟源是内部时钟(Fmaster)。该时钟源是直接连接到CK_PSC时钟的,CK_PSC时钟通过预分频器分频后给定时器提供CK_CNT时钟。 预分频器功能如下:
1. 预分频器是基于由一个3位寄存器(在TIMX_PSCR寄存器中)来控制的一个7位的计数器。由于该控制寄存器是带缓冲的所以它可以在系统运行中被改变。可以分频计速器的时钟频率为1到128之间的2的任意次幂。预分频器的值是通过一个预装载寄存器来载入的。一旦LS字节被写入时,保存当前要被使用值影子寄存器的值就被立即载入。对TIMX_PSCR寄存器的读操作是访问预装载寄存器,因此在读的过程中没有什么特别要注意的地方。 中断使能寄存器:TIMx_IER 位7:保留,须保持清零
位6:TIE:触发中断使能:0:触发中断禁止;1:触发中断使能; 位5:1 保留,须保持清零
位0:UIE:更新中断使能:0:更新中断禁止;1:更新中断使能 状态寄存器1(TIMX_SR1) 位7:保留,须保持清零
位6:TIF:触发中断标志位(此位在触发事件发生时(检测到TRGI信号的有效沿,在选择门控模
式时硬件置位。可以由软件清零。
)0:无触发事件产生;1:触发事件发生,此位当寄存器更新时由硬件置位(在timer4中该位保留) 位5:1 保留,须保持清零 位0:UIF:更新中断标志(此位在更新事件发生时由硬件置位。可以由软件清零) 0:无更新事件产生;1:跟新事件发生。 此位当寄存器更新时由硬件置位。
1. 如果TIM4_CR1中的UDIS=0,则发生在计数器溢出时。 2. 如果TIM4_CR1中的UDIS=0和URS=0,则发生在通过设置TIM4_EGR的UG位产生软件重新初始化计数时。 时间产生寄存器(TIM4_EGR) 位7:保留,须保持清零
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库stm8s的c语言编程例程应用在线全文阅读。
相关推荐: