ST 3合一开发板stm8学习之 led
这个例程使用了adc tim 和 gpio三种外设,程序功能是 根据adc输入的模拟量改变led
灯闪烁的频率和灯的亮度。
配置过程:
Adc相关程序:
void ADC_Init(void)
{
ADC_CR2 = 0x00; 配置寄存器2 配置外部触发是否使能 选择外部触发方式 数据对齐位 扫描模式是否使能位 这里配置为禁止外部触发 转换数据左对齐 禁止扫描模式?
ADC_CR1 = 0x00; 配置寄存器1 配置预分频位 转换模式是单词还是连续 ad转换开关。这里配置为fadc=fmaster/2,单次转换,禁止adc
ADC_CSR = 0x03; 控制状态寄存器:配置各种中断使能 转换完成标志和转换通道。这里配置了 禁止各种中断 选择通道3 pb3
ADC_TDRL = 0x20; ADC_TDRH和ADC_TDRL寄存器可以用来禁止 AIN 模拟输入引脚中的施密特触发器工作。禁止施密特触发器工作可以降低I/O引脚的功耗。
还有很多寄存器 具体用到可以看相关说明
}
Gpio相关
void GPIO_Init(void)
{
/* LED IO Configuration */
/* 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相关:
void TIM_Init(void)
{
/* TIM2 CC2控制亮度 */
TIM2_CCMR2 |= 0x70; 配置为pwm2模式,PWM模式2- 在向上计数时,一旦TIMx_CNT
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_CNT
并配置了重装载数值和预分频值,开启计数。关于计数模式 应该只有向上计数模式。
下面是配置tim3 通道1
*/
/* TIM3 CC1 控制闪烁*/
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如初一折
以上设置开启输出捕获功能并打开相应通道,设置低电平为有效电平
void ADC_Init(void)
{
ADC_CR2 = 0x00;
ADC_CR1 = 0x00;
ADC_CSR = 0x03; 选择模拟通道3输入
ADC_TDRL = 0x20; 关闭相应管教施密特触发器
}
设置adc位 单次转换 转换数据左对齐存储。选择模拟通道3输入,关闭相应管教施密特触发器(整波的),
Ok 以上配置了led的gpio端口以及外部触发中断的端口,定时器两个比较输出。和adc单次转换输入。看一下主程序:
void LED_Control(unsigned char duration)
{
int i = 0;
unsigned char uc = 0;
unsigned long Temp;
ADC_CR1 |= 0x01;
i = 6;
while(i--);
ADC_CR1 |= 0x01;
while(!(ADC_CSR & 0x80));/* Waiting for AD convert finished (EOP=1).
开启adc需要给ADON两次赋值,第一次开启adc的供电,等到电源稳定,则再赋值,开始转换
/* Store ADC value to AD_Value */
AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL);
/* The new duty cycle value is written in CCR. */
TIM2_CCR2H=0x00;
TIM2_CCR2L=(unsigned char)(AD_Value>>2);
根据adc的值改变比较寄存器的值,因为tim2 用来改变亮度 所以低电平时间要短
if (AD_Value>0x10)
{
Temp=(unsigned char)(AD_Value>>8);
if ((TIM3_ARRH>Temp+0x05)||(TIM3_ARRH
TIM3_ARRH = Temp;
TIM3_ARRL = (unsigned char)(AD_Value&0xff);
TIM3_CCR1H = (unsigned char)(AD_Value>>9);
TIM3_CCR1L = (unsigned char)((AD_Value>>1)&0xff);
}
}
当转换值大于0x10时,灯闪烁 并一直变化。
/* Delay time = duration * Y */
while ( uc < duration ) /* The following loop is run "duration" times. */
{
while ( i < 1200 ) /* This loop "Y" waits approximately 4.3ms. */
{
i++;
}
i = 0;
uc++;
}
上面是延时函数
}
Ok 关于led例程 到此为止
上一篇:3合一套件 stm8 学习笔记之css
下一篇:stm8s的assert_param()的说明
推荐阅读最新更新时间:2024-11-09 10:53