嵌入式软件开发培训笔记——基于S5PC100的课程设计

来源:互联网 发布:web编程包括哪些内容 编辑:程序博客网 时间:2024/04/29 19:06
1、温度、ADC、开关量数据采集与报警处理,功能如下
2、嵌入式系统硬件基本构成

3、软件系统
    1)、采集温度、模拟电压以及按键开关量(门禁)   
        get_temperture()温度
        get_adc()模拟量
        get_di()开关量
    2)、定时(间隔2秒)上报数据
        定时中断,每2秒触发一次上报任务
    3)、温度大于25度,峰鸣器报警
        if(get_temperture())    beep_on()
        else    beep_off()
    4)、接收UART指令,led 1 on 则把LED灯打开/反之led 1 off

    4、程序
//#include "s5pc100.h"
#include "uart.h"

extern void printf (const char *fmt, ...);
void uart0_send_char(char);

/***VIC0ADDRESS-REG***/
#define VIC0VECTADDR25*(volatile unsigned int*)0xE4000164
#define VIC1VECTADDR10*(volatile unsigned int*)0xe4100128
#define VIC0INTENABLE*(volatile unsigned int*)0xE4000010
#define VIC1INTENABLE*(volatile unsigned int*)0xe4100010
#define VIC0ADDRESS*(volatile unsigned int*)0xE4000F00
#define VIC1ADDRESS*(volatile unsigned int*)0xE4100F00
#define VIC2ADDRESS*(volatile unsigned int*)0xE4200F00
void do_irq(void)
{
((void (*)(void))VIC0ADDRESS)();
VIC0ADDRESS = 0;
VIC1ADDRESS = 0;
VIC2ADDRESS = 0;
}

/***Uart-REG***/
#define GPA0CON*(volatile unsigned int *)0xe0300000
#define ULCON0*(volatile unsigned int *)0xec000000
#define UCON0 *(volatile unsigned int *)0xec000004
#define UTRSTAT0*(volatile unsigned int *)0xec000010
#define UTXH0 *(volatile unsigned int *)0xec000020
#define URXH0 *(volatile unsigned int *)0xec000024
#define UBRDIV0*(volatile unsigned int *)0xec000028
#define UDIVSLOT0*(volatile unsigned int *)0xec00002c
#define UINTP0*(volatile unsigned int *)0xEC000030
#define UINTSP0*(volatile unsigned int *)0xEC000034
#define UINTM0*(volatile unsigned int *)0xEC000038
#define UART_RXD_MASK0x01
#define UART_ERR_MASK0x02
#define UART_TXD_MASK0x04
#define UART_MODEM_MASK0x08

/***Time1-REG***/
#define TCFG0 *(volatile unsigned int *)0xea000000
#define TCFG1 *(volatile unsigned int *)0xea000004
#define TCON  *(volatile unsigned int *)0xea000008
#define TCNTB1 *(volatile unsigned int *)0xea000018
#define TCMPB1 *(volatile unsigned int *)0xea00001c

/***Time4-REG***/
#define TCNTB4*(volatile unsigned int *)0xea00003c
#define TINT_CSTAT*(volatile unsigned int *)0xEA000044

/***IIC-REG***/
#define I2CCON0*(volatile unsigned int*)0xEC100000
#define I2CDS0*(volatile unsigned int*)0xEC10000C
#define I2CSTAT0*(volatile unsigned int*)0xEC100004
#define LM75_ADDR 0x48

/***ADC-REG***/
#define ADCCON*(volatile unsigned int*)0xf3000000
#define ADCDLY *(volatile unsigned int*)0xf3000008
#define ADCDAT0*(volatile unsigned int*)0xf300000c
#define ADCDAT1*(volatile unsigned int*)0xf3000010
#define ADCMUX*(volatile unsigned int*)0xf300001c

/***LED - REG***/
#define GPG3CON*(volatile unsigned int*)0xe03001c0
#define GPG3DAT*(volatile unsigned int*)0xe03001c4
#define LED_0 0x01
#define LED_1 0x02
#define LED_2 0x04
#define LED_3 0x08
#define LED_ALL0x0f
#define LED_ON0
#define LED_OFF1

/***KEEY - REG***/
#define GPH0CON *(volatile unsigned int*)0xe0300c00
#define GPH0DAT*(volatile unsigned int*)0xe0300c04

/***Beep - REG***/
#define GPDCON*(volatile unsigned int*)0xe0300080
#define GPDDAT*(volatile unsigned int*)0xe0300084

/***********************************************************************/
/***********************************************************************/
/***********************************************************************/

/***IIC-INIT***/
void s5pc100_i2c_init(void)
{
GPDCON &= ~((0x0f << 12) | (0x0f << 16));
GPDCON |= (0x02 << 12) | (0x02 << 16);
I2CCON0 = 0xe0;
}

int s5pc100_i2c_master_transfer(char saddr, char *buf, int len)
{
I2CDS0   = saddr;
I2CSTAT0 = 0xf0;
// wait ack
while ((I2CCON0 & (0x01 << 4)) == 0x00) {
}
while (len --) {
I2CDS0 = *buf++;
// clear pending
I2CCON0 &= ~(0x01 << 4);
// wait ack
while ((I2CCON0 & (0x01 << 4)) == 0x00) {
}
}
I2CSTAT0 = 0xd0;
// clear pending
I2CCON0 &= ~(0x01 << 4);
return len;
}

int s5pc100_i2c_master_receive(char saddr, char *buf, int len)
{
I2CDS0   = saddr;
I2CSTAT0 = 0xb0;
// wait ack
while ((I2CCON0 & (0x01 << 4)) == 0x00) {
}
while ((len --) > 0) {
I2CCON0 &= ~(0x01 << 4);// resume
// wait ack
while ((I2CCON0 & (0x01 << 4)) == 0x00) {
}
*buf ++ = I2CDS0;
}
I2CSTAT0 = 0x90;
// clear pending
I2CCON0 &= ~(0x01 << 4);
return len;
}

int lm75_read(void)
{
char buf[2];
buf[0] = 0;
s5pc100_i2c_master_transfer(LM75_ADDR << 1, buf, 1);
printf("\n");
s5pc100_i2c_master_receive((LM75_ADDR << 1) | 0x01, buf, 2);
// printf("%d - %d", buf[0], buf[1]);
return (buf[0] << 8) | buf[1];
}

/***ADC - INIT***/
void adc_init(void)
{
ADCCON  = (0x01 << 14)// prescaler enable
| (65 << 6) // prescaler value, clk = 66MHz / 66 = 1MHz
| (0x01 << 1);// read start
}

int adc_get(void)
{
int val;

val = ADCDAT0;
while ((ADCCON & (0x01 << 15)) == 0x00) {
}
val = ADCDAT0 & 0x3ff;
return val;
}

/***Led - INIT***/
void led_init(void)
{
GPG3CON = GPG3CON & 0xffff0000;
GPG3CON = GPG3CON | 0x00001111;// set gpio as output
}

void led_on(int index)
{
GPG3DAT |= index;
}

void led_off(int index)
{
GPG3DAT &= ~index;
}

/***Beep - INIT***/
void beep_init(void)
{
GPDCON = GPDCON & 0xffffff0f;
GPDCON = GPDCON | 0x00000010;// set gpio as output
}

void beep_on(void)
{
GPDDAT |= 0x01 << 1;
}

void beep_off(void)
{
GPDDAT &= ~(0x01 << 1);
}

/***KEY-INIT***/
void key_init()
{
GPG3CON = GPG3CON & 0xffff0000;
GPG3CON = GPG3CON | 0x00001111;// set gpio as output
GPH0CON &= ~((0x0f<<4) | (0x0f<<8) | (0x0f<<12) | (0x0f<<16) | (0x0f<<24) | (0x0f<<28));
}

/***Time1-INIT***/
void timer_init(void)
{
// 2. set prescaler
TCFG0 &= ~0xff;
TCFG0 |= 65; // PCLK = 66MHz, TCLK = 66 / (65 + 1) = 1MHz

// 3. set mux
TCFG1 &= ~(0x0f << 4);// set mux = 1/1

// 4. set TCMPB1 and TCNTB1
TCMPB1 = 100;
TCNTB1 = 500;

// 5. TCNT、CMPB
TCON &= ~(0x0f << 8);
TCON |= 0x01 << 9;// update to TCNT and TCMP

// 6. start timer
TCON &= ~(0x0f << 8);
TCON |= (0x09 << 8);
}

void stop_timer(void)
{
TCON &= ~(0x01 << 8);
}

void start_timer(void)
{
TCON |= 0x01 << 8;
}

/***Time4-INIT***/
volatile int cnt = 0;
volatile static int time4_flag = 0;
void timer4_isr(void)
{
cnt ++;
if (cnt == 1000) {
cnt = 0;
time4_flag = 1;
}
TINT_CSTAT |= 0x01 << 9;
}

void timer4_init(void)
{
// 2. set prescaler
TCFG0 &= ~(0xff << 8);
TCFG0 |= (65 << 8);// PCLK = 66MHz, TCLK = 66 / (65 + 1) = 1MHz

// 3. set mux
TCFG1 &= ~(0x0f << 16);// set mux = 1/1

// 4. set TCNTB
TCNTB4 = 1000;

// 5.TCNT
TCON &= ~(0x0f << 20);
TCON |= 0x01 << 21;// update to TCNT

// 6. start timer
TCON &= ~(0x0f << 20);
TCON |= (0x05 << 20);

/////////////////////////////////////////////////////////////////////////////
// Set interrupt
// 7. set VICxVECTADDRx
VIC0VECTADDR25= (unsigned int)timer4_isr;

// 8. enable interrupt in VIC0INTENABLE
VIC0INTENABLE |= 0x01 << 25;

// 9. Enable interrupt in timer
TINT_CSTAT    |= 0x01 << 4;
}

/***Uart-INIT***/
#define uart0_buf_lenth 32
#define CMD_NAME_LEN 8
#define CMD_COUNT 6
static char uart0_buf[uart0_buf_lenth];
int uart0_cnt;
int uart0_flag;

void uart0_enable_interrupt(int mask)
{
UINTM0 &= ~mask;
}

void uart0_disable_interrupt(int mask)
{
UINTM0 |= mask;
}

char uart0_receive(void)
{
char dat;
while ((UTRSTAT0 & 0x01) != 0x01) {
}
dat = URXH0;
return dat;
}

void uart0_send_char(char dat)
{
//while ((UTRSTAT0 & 0x02) != 0x02) {
//}
while ((UTRSTAT0 & 0x04) != 0x04) {
}
UTXH0 = dat;
}

void uart0_isr(void)
{
int  src;
char dat;
TINT_CSTAT    &= ~(0x01 << 4);
src = UINTSP0;
if (src & UART_RXD_MASK) {
dat = URXH0;
if (dat == '\r'){
TINT_CSTAT    |= 0x01 << 4;
uart0_flag = 1;
uart0_buf[uart0_cnt] = '\0';
uart0_cnt++;
uart0_send_char('\n');
}else{

uart0_buf[uart0_cnt++] = dat;
}
uart0_send_char(dat);
}
UINTP0 = 0xff; // !!! 閲嶈 !!!
}

void myuart0_init(void)
{
uart0_cnt = 0;
uart0_flag = 0;
// 1. Connect IO port to UART module
GPA0CON &= ~((0x0f << 0) | (0x0f << 4));
GPA0CON |= 0x02 | (0x02 << 4);

// 2. Set baudrate divider
UBRDIV0 = 34;
UDIVSLOT0 = 0xdddd; // bps = 115200 = 66MHz / (div + 1) / 16

// 3. Set Line Control
ULCON0 = 0x03;

// 4. Set Control register
UCON0 = (0x01 << 0) | (0x01 << 2);

// 5. Enable RXD interrupt
uart0_enable_interrupt(UART_RXD_MASK);

// Disable other interrupt
uart0_disable_interrupt(UART_ERR_MASK | UART_MODEM_MASK | UART_TXD_MASK);
//uart0_send_char(UINTM0);
//uart0_send_char(UINTP0);

// 6. init vector int VIC
VIC1VECTADDR10= (unsigned int)uart0_isr;

// 7. enable interrupt in VIC
VIC1INTENABLE  |= 0x01 << 10;
}

void delay(int dly)
{
volatile unsigned int i;
while (dly --)
for (i = 0; i < 1000; i ++);
}

int strlen(char *dest)
{
int len = 0;
while(*dest++ != '\0'){
len++;
}
return len;
}

void strncpy(char *dest, char *src, int len)
{
while((len--) > 0){
*dest++ = *src++;
}
}

int strcmp(char *dest, char *src)
{
int len;
if(strlen(dest) != strlen(src)){
return -1;
}
len = strlen(dest);
while(len > 0){
if(*dest++ != *src++){
return -1;
}
len--;
}
return 0;
}

void cmd_led(int argc, char *argv)
{
char index;
char *status;
index = argv[CMD_NAME_LEN]-'0';
printf("index = %x\n", index);
status = &argv[CMD_NAME_LEN*2];
printf("status = %s\n", status);
if(strcmp(status, "on") == 0){
led_on(0x01<<(index-1));
}else if(strcmp(status, "off") == 0){
led_off(0x01<<(index-1));
}else{
printf("Invalid Parameter\n");
}
}

void uart0_cmd_process()
{
char buf[uart0_buf_lenth];
char word[CMD_COUNT][CMD_NAME_LEN];
char *p;
int name_cnt;
int cmd_cnt;
if(uart0_flag != 1){
return;
}
uart0_flag = 0;

if(uart0_cnt <= 1){
uart0_cnt = 0;
return;
}
printf("%s---%d\n",uart0_buf,uart0_cnt);
strncpy(buf, uart0_buf, uart0_cnt);
uart0_cnt = 0;

//string process
p = buf;
cmd_cnt = 0;
while(*p != '\0'){
while(*p == ' '){
p++;
}
name_cnt = 0;
while((*p != ' ') && (*p != '\0')){
word[cmd_cnt][name_cnt++] = *p++;
}
word[cmd_cnt][name_cnt] = '\0';
printf("cmd_cnt = %d: name = %s\n", cmd_cnt, word[cmd_cnt]);
cmd_cnt++;
}
printf("lll---%s",word[0]);
if(strcmp(word[0], "led") == 0)
{
printf("led cmd..\n");
cmd_led(cmd_cnt, (char *)word);
}
else
{
printf("error cmd!\n");
}
}

int main()
{
int lm75_val;
int adc_val;
char key_val;
myuart0_init();
s5pc100_i2c_init();
adc_init();
timer_init();
timer4_init();
led_init();
beep_init();
key_init();

while(1)
{
uart0_cmd_process();
if(time4_flag)
{
time4_flag = 0;
lm75_val = lm75_read();
if (lm75_val & 0x80){
printf("Temperture = %d.5\n", lm75_val >> 8);
}else{ 
printf("Temperture = %d.0\n", lm75_val >> 8);
}
adc_val = adc_get();
printf("adc = %d mv\n", 3300 * adc_val / 1024);
key_val = GPH0DAT;
if((key_val & (0x01 << 1)) == 0x00 ){
printf("KEY = %d\n",1);
}else{
printf("KEY = %d\n",0);
}
}

if((lm75_val>>8) > 24)
{
beep_on();
start_timer();
delay(1);
stop_timer();
beep_off();
  delay(1);
}
}
return 0;
}
0 0
原创粉丝点击