生活随笔
收集整理的這篇文章主要介紹了
Exynos4412裸机开发综合练习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面是一個案例需求:
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
[cpp]?view plaincopy
#ifndef?__ADC_H_?? #define?__ADC_H_?? ?? void?adc_init(int?temp);?? void?adc_collect(void);?? ?? #endif??
2) -- key.h
[cpp]?view plaincopy
#ifndef?_KEY_H_?? #define?_KEY_H_?? ?? void?key2_init(void);?? ?? #endif??
3) -- pwm.h
[cpp]?view plaincopy
#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
[cpp]?view plaincopy
#ifndef?_RTC_H_?? #define?_RTC_H_?? ?? void?rtc_init(void);?? void?rtc_tic(void);?? void?rtc_alarm(void);?? ?? #endif??
5) -- uart.h?
[cpp]?view plaincopy
#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
[cpp]?view plaincopy
? ? ? ? ? ?? #include?"exynos_4412.h"?? ?? ?? adc_init(int?temp)?? {?? ?????? ?????? ?????? ?????? ????ADCCON?=?(1?<<?16?|?1?<<?14?|?99?<<6?|?1?<<?1);?? ????ADCMUX?=?3;??? ????temp?=?ADCDAT?&?0xfff;??? ????????????????????????????? }?? ?? ?? adc_collect()?? {?? ????unsigned?int?temp;?? ????adc_init(temp);?? ?? ????while(!(ADCCON?&?(1?<<?15)));??? ????temp?=?ADCDAT?&?0xfff;??? ????temp?=?18?*?100?*?temp/0xfff;??? ???????????????????????????????????? ???????????????????????????????????? ????printf("電壓值?=?%d?mV\n",temp);?? ????if((temp?>?2000)||(temp?<?1000))??? ????{?? ????????printf("電壓異常!\n");?? ????????beep_on();??? ????}?? ????else?? ????{?? ????????beep_off();??? ????}?? }??
2) -- key.c
[cpp]?view plaincopy
? ? ? ? ? ?? ?? #include?"exynos_4412.h"?? ?? ?? key2_init()?? {?? ?????? ????GPX1.CON?=GPX1.CON?&?(~(0xf?<<?4))?|(0xf?<<?4);??? ????GPX1.PUD?=?GPX1.PUD?&?(~(0x3?<<?2));???? ?? ????EXT_INT41_CON?=?EXT_INT41_CON?&(~(0xf?<<?4))|(0x2?<<?4);??? ????EXT_INT41_MASK?=?EXT_INT41_MASK?&?(~(0x1?<<?1));???? ?? ?????? ?????? ????ICDDCR?=?1;?? ?????? ?????? ????ICDISER.ICDISER1?=?ICDISER.ICDISER1?|?(0x1?<<?25);?? ?????? ?????? ????ICDIPTR.ICDIPTR14?=?ICDIPTR.ICDIPTR14?&?(~(0xff?<<?8))|(0x1?<<?8);??? ?? ?????? ????CPU0.ICCPMR?=?255;??? ????CPU0.ICCICR?=?1;????? }??
3) -- pwm.c
[cpp]?view plaincopy
#include?"exynos_4412.h"?? #include?"pwm.h"?? ?? ?? void?pwm_init(void)?? {?? ????GPD0.CON?=?GPD0.CON?&?(~(0xf))|?(0x2?<<?0);??? ????GPD0.PUD?=?GPD0.PUD?&?(~(0xf))?;??? ?? ?????? ?????? ????PWM.TCFG0?=?PWM.TCFG0?&?(~(0xff))|0xf9;?? ?????? ?????? ????PWM.TCFG1?=?PWM.TCFG1?&?(~(0xf))?|?0x2;??? ?????? ?????? ?????? ?????? ?????? ?????? ????PWM.TCMPB0?=?50;?? ????PWM.TCNTB0?=?100;?? ?????? ????PWM.TCON?=?PWM.TCON?&?(~(0xff))?|?(1?<<?0)?|?(1?<<?1)?;?? }?? ?? ?? void?beep_on(void)?? {?? ????PWM.TCON?=?PWM.TCON?&?(~(0xff))?|?(1?<<?0)?|?(1?<<?3)?;??? }?? ?? ?? void?beep_off(void)?? {?? ????PWM.TCON?=?PWM.TCON?&?(~(1?<<?0))?;??? }?? ?? ?? void?beep_set_frequence(?unsigned?int?fre?)?? {?? ?????? ????if(?0==fre?)?? ????????return?;?? ?? ????PWM.TCMPB0?=??SYS_SET_FREQUENCE/(fre+fre);????? ????PWM.TCNTB0?=??SYS_SET_FREQUENCE/fre;?????????????? ?? }??
4) -- rtc.c
[cpp]?view plaincopy
? ? ? ? ? ?? #include?"exynos_4412.h"?? ?? ?? void?rtc_init(void)?? {?? ????RTCCON?=?1;??? ?????? ????RTC.BCDYEAR?=?0x16;?? ????RTC.BCDMON?=?0x2;?? ????RTC.BCDDAY?=?0x29;?? ????RTC.BCDHOUR?=?0x18;?? ????RTC.BCDMIN?=?0x24;?? ????RTC.BCDSEC?=?0x00;?? ????RTCCON?=?0;??? }?? ?? ?? void?rtc_tic(void)?? {?? ?????? ?????? ????RTCCON?=?RTCCON?&?(~(0xf?<<?4))?|?(1?<<?8);?? ?????? ????TICCNT?=?32768;?? ?? ????ICDDCR?=?1;???? ????ICDISER.ICDISER2?=?ICDISER.ICDISER2?|?(0x1?<<?13);??? ????ICDIPTR.ICDIPTR19?=?ICDIPTR.ICDIPTR19?&?(~(0xff?<<?8))|(0x1?<<?8);??? ????CPU0.ICCPMR?=?255;??? ????CPU0.ICCICR?=?1;????? }?? ?? ?? void?rtc_alarm(void)?? {?? ????int?i?=?20;?? ?????? ????RTCALM.ALM?=?(1?<<?6)|(1?<<?0);?? ????RTCALM.SEC?=?0x20;??? ????printf("請等待20s....\n");?? ????ICDDCR?=?1;???? ????ICDISER.ICDISER2?=?ICDISER.ICDISER2?|?(0x1?<<?12);??? ????ICDIPTR.ICDIPTR19?=?ICDIPTR.ICDIPTR19?&?(~(0xff?<<?0))|(0x1?<<?0);??? ????CPU0.ICCPMR?=?255;??? ????CPU0.ICCICR?=?1;????? ????while(i?!=?1)?? ????{?? ????????printf("還剩?%-2d?s\r",?--i);?? ????????mydelay_ms(1000);?? ????}?? ????printf("\n");?? }??
5) -- uart.c
[cpp]?view plaincopy
#include?"exynos_4412.h"?? ?? ?? void?uart_init()?? {?? ?????? ?????? ????GPA1.CON?=?(GPA1.CON?&?~0xFF?)?|?(0x22);??? ?? ?????? ????UART2.ULCON2?=?0x3;?? ?????? ????UART2.UCON2?=?0x5;?? ?? ????? ? ? ? ? ? ? ? ? ? ? ? ?? ????UART2.UBRDIV2?=?0x35;?? ????UART2.UFRACVAL2?=?0x4;?? }?? ?? void?putc(const?char?data)?? {?? ????while(!(UART2.UTRSTAT2?&?0X2));?? ????UART2.UTXH2?=?data;?? ????if?(data?==?'\n')?? ????????????putc('\r');?? }?? char?getc(void)?? {?? ????char?data;?? ????while(!(UART2.UTRSTAT2?&?0x1));?? ????data?=?UART2.URXH2;?? ????if?((data?==?'\n')||(data?==?'\r'))?? ????????{?? ????????????putc('\n');?? ????????????putc('\r');?? ????????}else?? ????????????putc(data);?? ????return?data;?? }?? void?puts(const??char??*pstr)?? {?? ????while(*pstr?!=?'\0')?? ????????putc(*pstr++);?? }?? void?gets(char?*p)?? {?? ????char?data;?? ????while((data?=?getc())!=?'\r')?? ????{?? ????????if(data?==?'\b')?? ????????{?? ????????????p--;?? ????????}?? ????????*p++?=?data;?? ????}?? ????if(data?==?'\r')?? ????*p++?=?'\n';?? ????*p?=?'\0';?? }??
3、main函數
[cpp]?view plaincopy
#include?"exynos_4412.h"?? #include?"adc.h"?? #include?"key.h"?? #include?"pwm.h"?? #include?"rtc.h"?? #include?"uart.h"?? ?? void?mydelay_ms(int?time)?? {?? ????int?i,?j;?? ????while(time--)?? ????{?? ????????for?(i?=?0;?i?<?5;?i++)?? ????????????for?(j?=?0;?j?<?514;?j++);?? ????}?? }?? ?? void?do_irq(void)?? {?? ????static?int?a?=?1;?? ????int?irq_num;?? ????irq_num?=?CPU0.ICCIAR&0x3ff;???? ????switch(irq_num)?? ????{?? ????????case?57:?????? ????????????beep_off();?? ????????????printf("請將電壓調到正常值!!\n");?? ????????????mydelay_ms(1000);??? ????????????EXT_INT41_PEND?=?EXT_INT41_PEND?|((0x1?<<?1));??? ????????????ICDICPR.ICDICPR1?=?ICDICPR.ICDICPR1?|?(0x1?<<?25);??? ????????break;?? ?? ????????case?76:?????? ????????????printf("20s已到,開始采集電壓值:\n");?? ????????????rtc_tic();??? ?? ????????????RTCALM.ALM?=?RTCALM.ALM?&?(~(1?<<?6));?? ????????????RTCINTP??=?RTCINTP?|?(1?<<?1);??? ????????????ICDICPR.ICDICPR2?=?ICDICPR.ICDICPR2?|?(0x1?<<?12);??? ????????????break;?? ?? ????????case?77:?????? ????????????adc_collect();???? ????????????RTCINTP??=?RTCINTP?|?(1?<<?0);?????? ????????????ICDICPR.ICDICPR2?=?ICDICPR.ICDICPR2?|?(0x1?<<?13);??? ????????????break;?? ????}?? ????CPU0.ICCEOIR?=?CPU0.ICCEOIR&(~(0x3ff))|irq_num;??? }?? ? ? ?? int?main?(void)?? {?? ????printf("\n");?? ????printf("------------------practice--------------------\n");?? ?? ????uart_init();?? ????pwm_init();?? ????rtc_init();?? ????key2_init();?? ?? ????rtc_alarm();?????? ?? ????while(1)?????? ????{?? ?? ????}?? ???return?0;?? }??
將程序下載到開發板中,執行結果如下:
[cpp]?view plaincopy
------------------practice--------------------?? 請等待20s....?? 20s已到,開始采集電壓值:?? ?? 電壓值?=?1219?mV?? 電壓值?=?1218?mV?? 電壓值?=?1219?mV?? 電壓值?=?1219?mV?? 電壓值?=?1222?mV?? 電壓值?=?1333?mV?? 電壓值?=?1391?mV?? 電壓值?=?1390?mV?? 電壓值?=?1403?mV?? 電壓值?=?1496?mV?? 電壓值?=?1800?mV?? 電壓值?=?1560?mV?? 電壓值?=?873?mV?? 電壓異常!?? 電壓值?=?825?mV?? 電壓異常!?? 電壓值?=?825?mV?? 電壓異常!?? 電壓值?=?826?mV?? 電壓異常!?? 電壓值?=?826?mV?? 電壓異常!?? 請將電壓調到正常值!!?? 電壓值?=?825?mV?? 電壓值?=?825?mV?? 電壓值?=?826?mV?? 電壓異常!?? 請將電壓調到正常值!!?? 電壓值?=?827?mV?? 電壓異常!?? 電壓值?=?825?mV?? 電壓異常!?? 電壓值?=?825?mV?? 電壓異常!?? 電壓值?=?684?mV?? 電壓異常!?? 電壓值?=?143?mV?? 電壓異常!?? 電壓值?=?364?mV?? 電壓異常!?? 電壓值?=?1114?mV?? 電壓值?=?1121?mV?? 電壓值?=?1120?mV?? 電壓值?=?1120?mV?? 電壓值?=?1121?mV?? 電壓值?=?1121?mV?? 電壓值?=?1120?mV?? 電壓值?=?1121?mV ?
總結
以上是生活随笔為你收集整理的Exynos4412裸机开发综合练习的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。