2857|3

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

新手求救 [复制链接]

LPC21xx的简单的例子程序,可以给我一个到两个吗

包括基本的初始化,串口的设置,中断的使用之类的

我看着datasheet试到现在连串口的数据都看不到在发送啊....


救命啊

最新回复

唉...一个简单的例子就有这么长,希望你不会有困难 汇编是gnu格式,主要是提供 VIC 的初始化和 ISR 入口。  详情 回复 发表于 2007-5-8 06:38
点赞 关注

回复
举报

78

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

enum comm_tx_states {
    txs_idle, txs_send_text, txs_send_crlf
} comm_tx_state;

char buf_for_send[64];
char buf_for_recv[64];
char tx_busy;
char tx_ptr;
char rx_ptr;
char rx_ready;

char timer_tick;

char adc_ready;
short adc_result;

void gpio_init()
{
    PINSEL0 = 0x5;          // TXD0, RXD0 and gpios
    PINSEL1 = 0x10040000;   // AD04, AD03 and gpios
    IO0DIR  = 0xffffffff;   // all gpios are output
    IO1DIR  = 0xffffffff;
    IO0PIN  = 0xffffffff;   // gpios set to 1's
    IO1PIN  = 0xffffffff;
}

// UART configuration should be done
void uart0_init()
{
    // set baudrate to 115200 bps
    U0LCR = 0x83;
    U0DLM = 0;
    U0DLL = 0x2;    // 14.7456Mhz /4 /16 /2 = 115200
    U0LCR = 0x03;   // 8-bit frame

    U0IER = 0x07;   // RBR, THRE, RX line are all enabled
    U0FCR = 0xc1;   // rx/tx FIFO enabled, rx triggle at 14 bytes,
    U0TER = 0x80;   // this is reset-default value.

    tx_ptr  = rx_ptr   = 0;
    tx_busy = rx_ready = 0;
    comm_tx_state = txs_idle;
}

/* interrupt service routines */
void uart0_isr()
{
    unsigned char uart0_lsr = U0LSR;
    unsigned char uart0_iir = U0IIR;
    int i;

    if (uart0_lsr & 0x20)   // THRE - transmitter holding register empty
    {
        switch (comm_tx_state)
        {
        case txs_send_text:
            for (i=0; buf_for_send && i<16; i++) U0THR = buf_for_send[tx_ptr + i];

            if (!buf_for_send[tx_ptr + i])
            {
                comm_tx_state = txs_send_crlf;
            }

            tx_ptr += i;
            break;

        case txs_send_crlf:
            U0THR = 0xd;
            U0THR = 0xa;
            comm_tx_state = txs_idle;
            tx_busy = 0;                // finished.
            break;

        case txs_idle:
            break;
        }
    }

    if (uart0_lsr & 1)      // RDR - receiver data ready
    {
        // raed bytes from RBR FIFO until its empty, update rx buffer pointer
        rx_ready = 0;
        buf_for_recv[rx_ptr] = U0RBR;
        if (rx_ptr < 63) rx_ptr++;
        while ((uart0_lsr = U0LSR) & 1)
        {
            buf_for_recv[rx_ptr] = U0RBR;
            if (rx_ptr < 63) rx_ptr++;
        }

        // if "CRLF" read, stop read and report
        if (rx_ptr > 1 && buf_for_recv[rx_ptr-2] == 0xd && buf_for_recv[rx_ptr-1] == 0xa)
        {
            rx_ready    = 1;
            rx_ptr      = 0;
        }
    }
}

 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

/* for gnu as */
/* created by geweidog, 2005-11-06 */

.extern     uart_isr, timer0_isr, adc0_isr

.global     vic_init

.data
flag_undefined_instr:
    .space 1
flag_data_abort:
    .space 1
flag_prefetch_abort:
    .space 1

.equ    stack_size_usr, 0x200
.equ    stack_size_svc, 0x100
.equ    stack_size_irq, 0x100
.equ    stack_size_und, 0x10
.equ    stack_size_abt, 0x10
.equ    stack_size_fiq, 0x10

.align 4
stack_usr:
    .space stack_size_usr
stack_svc:
    .space stack_size_svc
stack_irq:
    .space stack_size_irq
stack_und:
    .space stack_size_und
stack_abt:
    .space stack_size_abt
stack_fiq:
    .space stack_size_fiq

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

.text
.arm

.global _start
.global _vic_init

.org  0x0
_start:
    ldr pc, =mcu_init
    ldr pc, =handle_undefined_instr
    ldr pc, =handle_swi
    ldr pc, =handle_prefetch_abort
    ldr pc, =handle_data_abort
    nop
    ldr pc, [PC, #-0xff0]
    ldr pc, =handle_fiq


handle_undefined_instr:
    ldr     r0,     =flag_undefined_instr
    mov     r1,     #1
    strb    r1,     [r0]
trap_und:
    b       trap_und            /* endless loop */

handle_prefetch_abort:
    ldr     r0,     =flag_prefetch_abort
    mov     r1,     #1
    strb    r1,     [r0]
trap_pref_abort:
    b       trap_pref_abort     /* endless loop */

handle_data_abort:
    ldr     r0,     =flag_data_abort
    mov     r1,     #1
    strb    r1,     [r0]
trap_data_abort:
    b       trap_data_abort     /* endless loop */

handle_swi:
    stmfd   sp!,    {r0-r3, lr}
    ldmfd   sp!,    {r0-r3, lr}
    subs    pc,     lr, #4

handle_fiq:
    stmfd   sp!,    {r0-r3, lr}
    ldmfd   sp!,    {r0-r3, lr}
    subs    pc,     lr, #4

mcu_init:
    ldr     r0,     =flag_undefined_instr
    mov     r1,     #0x55
    strb    r1,     [r0]
    strb    r1,     [r0,#1]!
    strb    r1,     [r0]        /* set these flags to 0 */

    /* initialize stacks... */
    .equ    Mode_USR,   0x10
    .equ    Mode_FIQ,   0x11
    .equ    Mode_IRQ,   0x12
    .equ    Mode_SVC,   0x13
    .equ    Mode_ABT,   0x17
    .equ    Mode_UND,   0x1B
    .equ    Mode_SYS,   0x1F

    .equ    I_Bit,      0x80    /* when I bit is set, IRQ is disabled */
    .equ    F_Bit,      0x40    /* when F bit is set, FIQ is disabled */

/* Enter Undefined Instruction Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit
    ldr     sp,     =stack_und + stack_size_und - 4

/* Enter Abort Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit
    ldr     sp,     =stack_abt + stack_size_abt - 4

/* Enter FIQ Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit
    ldr     sp,     =stack_fiq + stack_size_fiq - 4

/* Enter IRQ Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit
    ldr     sp,     =stack_irq + stack_size_irq - 4

/* Enter Supervisor Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit
    ldr     sp,     =stack_svc + stack_size_svc - 4

/* Enter User Mode and set its Stack Pointer */
    MSR     CPSR_c, #Mode_USR                       /* IRQ and FIQ are enabled */
    ldr     sp,     =stack_usr + stack_size_usr - 4

    b main                      /* goto c code */

    .equ    VICVectAddr,    0xfffff030

entry_for_uart_intr:
    sub     lr, lr, #4
    stmfd   sp!,    {r0-r3, lr}

    bl      uart0_isr               /* uart0 interrupt service routine */
    ldr     r0, =VICVectAddr
    str     r1, [r0]                /* write to VICVectAddr - service finished */

    ldmfd   sp!,    {r0-r3, pc}^    /* restore registers and return */

entry_for_timer0_intr:
    sub     lr, lr, #4
    stmfd   sp!,    {r0-r3, lr}

    bl      timer0_isr              /* timer0 interrupt service routine */
    ldr     r0, =VICVectAddr
    str     r1, [r0]                /* write to VICVectAddr - service finished */

    ldmfd   sp!,    {r0-r3, pc}^    /* restore registers and return */

entry_for_adc0_intr:
    sub     lr, lr, #4
    stmfd   sp!,    {r0-r3, lr}

    bl  adc0_isr                    /* adc0 converter completion isr */
    ldr     r0, =VICVectAddr
    str     r1, [r0]                /* write to VICVectAddr - service finished */

    ldmfd   sp!,    {r0-r3, pc}^    /* return */

    .equ    VICIntSelect,   0xfffff00c
    .equ    VICIntEnable,   0xfffff010
    .equ    VICDefVectAddr, 0xfffff034
    .equ    VICVectAddr0,   0xfffff100
    .equ    VICVectAddr1,   0xfffff104

    .equ    VICVectCntl0,   0xfffff200
    .equ    VICVectCntl1,   0xfffff204

vic_init:
    ldr     r0, =VICIntSelect
    mov     r1, #0                      /* no interrupt is fiq */
    str     r1, [r0]
    ldr     r0, =VICDefVectAddr         /* set default vector address for safety */
    ldr     r1, =def_isr
    str     r1, [r0]

    ldr     r0, =VICVectAddr0           /* set vectors */
    ldr     r1, =entry_for_uart_intr
    str     r1, [r0]                    /* slot 0 - uart0 */
    ldr     r1, =entry_for_timer0_intr
    str     r1, [r0, #4]!               /* slot 1 - timer0 */
    ldr     r1, =entry_for_adc0_intr
    str     r1, [r0, #4]!               /* slot 2 - adc0 */

    ldr     r0, =VICVectCntl0
    mov     r1, #0x26                   /* slot 0 for uart0 */
    str     r1, [r0]
    mov     r1, #0x24                   /* slot 1 for timer0 */
    str     r1, [r0, #4]!
    mov     r1, #0x32                   /* slot 2 for adc0 */
    str     r1, [r0, #4]!

    ldr     r0, =VICIntEnable
    ldr     r1, =0x00040050             /* enables AD0, UART0 and Timer0 */
    str     r1, [r0]

    mov     pc, lr                      /* finished, return */


def_isr:
    subs    pc, lr, #4                  /* return immediately */

/* code for security */
/* .org 0x1fc*/
/* .long 0x87654321*/

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

not_use_01:
    mrs     r0,     spsr
    stmfd   sp!,    {r0}        /* store spsr then enable IRQ */

    mrs     r0, cpsr
    bic     r0, r0, #I_Bit      /* I bit cleared, enable IRQ */
    msr     cpsr_c, r0

    bl      vic_init            /* replace with an service function */

    mrs     r0, cpsr
    orr     r0, r0, #I_Bit      /* disable IRQ for spsr restore */

    ldmfd   sp!,    {r0}
    msr     spsr_cxsf,  r0      /* restore spsr */

.ltorg

.end

 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
唉...一个简单的例子就有这么长,希望你不会有困难

汇编是gnu格式,主要是提供 VIC 的初始化和 ISR 入口。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表