嵌入式 > 技术百科 > 详情

ST 3合一开发板stm8学习之 led

发布时间:2023-06-28 发布时间:
|

ST3合一开发板stm8学习之led

这个例程使用了adctim和gpio三种外设,程序功能是根据adc输入的模拟量改变led
灯闪烁的频率和灯的亮度。


配置过程:

Adc相关程序:
voidADC_Init(void)
{
ADC_CR2=0x00;配置寄存器2配置外部触发是否使能选择外部触发方式数据对齐位扫描模式是否使能位这里配置为禁止外部触发转换数据左对齐禁止扫描模式?
ADC_CR1=0x00;配置寄存器1配置预分频位转换模式是单词还是连续ad转换开关。这里配置为fadc=fmaster/2,单次转换,禁止adc
ADC_CSR=0x03;控制状态寄存器:配置各种中断使能转换完成标志和转换通道。这里配置了禁止各种中断选择通道3pb3
ADC_TDRL=0x20;ADC_TDRH和ADC_TDRL寄存器可以用来禁止AIN模拟输入引脚中的施密特触发器工作。禁止施密特触发器工作可以降低I/O引脚的功耗。


还有很多寄存器具体用到可以看相关说明
}

Gpio相关

voidGPIO_Init(void)
{
/*LEDIOConfiguration*/
/*LD3:PD3*/请看gpio讲解部分
/*LD2:PD1*/
/*LD1:PD0*/
PD_DDR|=0x0D;/*前面*/
PD_CR1|=0x0D;/*已经*/
PD_CR2=0x00;/**/讲过

/*外部中断pd7*/
EXTI_CR1=0x00;配置触发方式这里配置为下降沿和低电平触发
EXTI_CR2=0x00;中断触发方式下降沿和低电平触发
PD_DDR&=~0x80;pd7输入模式
PD_CR2|=0x80;使能pd7外部中断
}

Tim相关:

voidTIM_Init(void)
{
/*TIM2CC2控制亮度*/
TIM2_CCMR2|=0x70;配置为pwm2模式,PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR2时通道2为有效电平,否则为无效电平。
TIM2_CCER1|=0x30;/*选择通道2输出低电平有效*/
TIM2_ARRH=0x00;
TIM2_ARRL=0xff;/*配置重装载数值ARRH默认值是ff*/
TIM2_CCR2=0x00;/*输出比较2的值用来和cnt比较这
里开始为零输出到引脚的电平是零
(有效电平)pwm2模式*/

TIM2_PSCR=0x00;/*预分频器的值值+1*/
TIM2_CR1|=0x01;使能计数cr1最高位使能预装载功能
此处禁止
以上配置了tim2通道2为pwm2模式(在向上计数时,一旦TIMx_CNTTIMx_CCR2时通道2为有效电平,否则为无效电平。)
并配置了重装载数值和预分频值,开启计数。关于计数模式应该只有向上计数模式。

下面是配置tim3通道1
*/
/*TIM3CC1控制闪烁*/
TIM3_CCMR1|=0x78;配置为pwm2模式开启预装载功能
TIM3_CCER1|=0x03;/*选择通道1*/
TIM3_ARRH=0x03;
TIM3_ARRL=0xff;
TIM3_CCR1H=0x02;
TIM3_CCR1L=0x00;

TIM3_PSCR|=0x0d;
TIM3_CR1|=0x81;

}

配置tim3和tim2一样不再多说。
定时器用得最多的就是定时和产生不同的波形,基本的定时我们就可以直接设成计数模式就ok了。输出比较和pwm如初一折

以上设置开启输出捕获功能并打开相应通道,设置低电平为有效电平
voidADC_Init(void)
{
ADC_CR2=0x00;
ADC_CR1=0x00;
ADC_CSR=0x03;选择模拟通道3输入
ADC_TDRL=0x20;关闭相应管教施密特触发器
}
设置adc位单次转换转换数据左对齐存储。选择模拟通道3输入,关闭相应管教施密特触发器(整波的),



Ok以上配置了led的gpio端口以及外部触发中断的端口,定时器两个比较输出。和adc单次转换输入。看一下主程序:
voidLED_Control(unsignedcharduration)
{
inti=0;
unsignedcharuc=0;
unsignedlongTemp;

ADC_CR1|=0x01;
i=6;
while(i--);
ADC_CR1|=0x01;
while(!(ADC_CSR&0x80));/*WaitingforADconvertfinished(EOP=1).

开启adc需要给ADON两次赋值,第一次开启adc的供电,等到电源稳定,则再赋值,开始转换
/*StoreADCvaluetoAD_Value*/
AD_Value=((((unsignedint)ADC_DRH)<<2)+ADC_DRL);

/*ThenewdutycyclevalueiswritteninCCR.*/
TIM2_CCR2H=0x00;
TIM2_CCR2L=(unsignedchar)(AD_Value>>2);
根据adc的值改变比较寄存器的值,因为tim2用来改变亮度所以低电平时间要短

if(AD_Value>0x10)
{
Temp=(unsignedchar)(AD_Value>>8);

if((TIM3_ARRH>Temp+0x05)||(TIM3_ARRH{
TIM3_ARRH=Temp;
TIM3_ARRL=(unsignedchar)(AD_Value&0xff);
TIM3_CCR1H=(unsignedchar)(AD_Value>>9);
TIM3_CCR1L=(unsignedchar)((AD_Value>>1)&0xff);
}
}

当转换值大于0x10时,灯闪烁并一直变化。
/*Delaytime=duration*Y*/
while(uc{
while(i{
i++;
}
i=0;
uc++;
}
上面是延时函数
}

Ok关于led例程到此为止


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
汽轮机旁路控制策略的研制与应用