下面是一个案例需求:
1、编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警;
2、其具体要求如下;
a) 程序下载20s后,进入电压采集状态(使用RTC ALARM功能完成), 要求1s采集1次电路板电压值;(采用RTC TIME TICK完成)
b) 每次电压采集完成后,通过COM2将采集到的电压值发送到PC,在PC端可通过串口调试助手查看当前的电压值;
c) 每次电压采集完成后,比较当前的电压值是否正常正常的电压值为(1V~2V),若当前采集的电压值异常,则通过蜂鸣器发出报警信号;
d) 报警信号的解除通过电路板上的KEY2控制( 通过按下KEY2使蜂鸣器停止鸣叫);
下面是具体实现:
1、头文件定义
0) -- exynos_4412.h
内容过多,这里不予以展示了,在前面的文章中均可找到相关寄存器定义
1) -- adc.h
#ifndef __ADC_H_
#define __ADC_H_
void adc_init(int temp);
void adc_collect(void);
#endif
2) -- key.h
#ifndef _KEY_H_
#define _KEY_H_
void key2_init(void);
#endif
3) -- pwm.h
#ifndef __PWM_H__
#define __PWM_H__
void pwm_init(void);
void beep_on(void);
void beep_off(void);
#define SYS_SET_FREQUENCE 25000
void beep_set_frequence( unsigned int fre );
#endif
4) -- rtc.h
#ifndef _RTC_H_
#define _RTC_H_
void rtc_init(void);
void rtc_tic(void);
void rtc_alarm(void);
#endif
5) -- uart.h
#ifndef _UART_H
#define _UART_H
void putc(const char data);
void puts(const char *pstr);
void uart_init(void);
extern void putc(const char data);
extern void puts(const char *pstr);
extern void uart_init(void);
#endif
2、具体函数实现:
1) -- adc.c
/*
* adc.c
*
* Created on: 2016-2-29
* Author: Administrator
*/
#include "exynos_4412.h"
//ADC初始化函数
adc_init(int temp)
{
// 初始化A/D控制寄存器
// ADCCON [16]位置1,12bit输出;[14]位置1,允许预分频; [13:6] = 99,预分频值为99;
// [1]位置1,采用读启动方式启动ADC;
// A/D转换时间计算: PCLK = 100 MHZ,PRESCALER = 99,则 12 位转换时间为 100MHz/(99+1) = 1 MHZ
ADCCON = (1 << 16 | 1 << 14 | 99 <<6 | 1 << 1);
ADCMUX = 3; //电压输入通道选择,查看原理图,ADC连接 XadcAIN3,这里将ADCMUX = 3;
temp = ADCDAT & 0xfff; // temp用于存放转换的数据值,由于是读启动方式启动ADC,第一次读是读不到正确值的,
// 所以这里先读取依次进行初始化。
}
//ADC 采集函数
adc_collect()
{
unsigned