datasheet

Tiny210裸机之按键中断

2018-10-12来源: eefocus 关键字:Tiny210裸机  按键中断

start.S源码:

.global _start

_start:

    ldr sp, =0xD0030000  // 初始化栈,因为后面要调用C函数 

    bl clock_init                // 初始化时钟 

    bl ddr_init                   // 初始化内存 

    bl nand_init                // 初始化NAND 

    ldr r0, =0x36000000   // 要拷贝到DDR中的位置 

    ldr r1, =0x0                 // 从NAND的0地址开始拷贝 

    ldr r2, =bss_start         // BSS段的开始地址 

    sub r2,r2,r0                  // 要拷贝的大小 

    bl nand_read              // 拷贝数据 

clean_bss:

    ldr r0, =bss_start

    ldr r1, =bss_end

    mov r3, #0

    cmp r0, r1

    ldreq pc, =on_ddr

clean_loop:

    str r3, [r0], #4

    cmp r0, r1    

    bne clean_loop        

    ldr pc, =on_ddr

on_ddr:

    mrs  r0, cpsr

    bic    r0,r0,#0x1f  // 清M4~M0 

    orr    r0,r0,#0x12

    msr    cpsr,r0        // 进入irq 

    ldr sp, =0x3e000000    // 初始化普通中断模式的栈,指向内存 

    bl irq_init

    mrs  r0, cpsr

    bic    r0,r0,#0x9f  // 开总的中断开关,清M4~M0 

    orr    r0,r0,#0x10

    msr    cpsr,r0      // 进入user mode 

    ldr sp, =0x3f000000    // 初始化用户模式的栈,指向内存 

    ldr pc, =main

halt:

    b halt    

.global key_IRQ

key_IRQ:

    sub lr, lr, #4                   // 1.计算返回地址 

    stmdb sp!, {r0-r12, lr}  // 2.保护现场 

    // 3. 处理异常 

    bl do_irq

    

    // 4. 恢复现场 

    ldmia sp!, {r0-r12, pc}^  // ^表示把spsr恢复到cpsr 

===================================================================

irq.c源码:

#include "lib.h"

#define GPH2CON        (*(volatile unsigned int *)0xE0200C40)

#define GPH2DAT        (*(volatile unsigned int *)0xE0200C44)

#define GPH3CON        (*(volatile unsigned int *)0xE0200C60)

#define GPH3DAT        (*(volatile unsigned int *)0xE0200C64)

#define EXT_INT_2_CON        (*(volatile unsigned int *)0xE0200E08)

#define EXT_INT_3_CON        (*(volatile unsigned int *)0xE0200E0C)

#define EXT_INT_2_MASK        (*(volatile unsigned int *)0xE0200F08)

#define EXT_INT_3_MASK        (*(volatile unsigned int *)0xE0200F0C)

#define VIC0INTSELECT        (*(volatile unsigned int *)0xF200000C)

#define VIC0INTENABLE        (*(volatile unsigned int *)0xF2000010)

#define VIC0VECTADDR16        (*(volatile unsigned int *)0xF2000140)

#define VIC0ADDRESS          (*(volatile unsigned int *)0xF2000F00)

#define EXT_INT_2_PEND        (*(volatile unsigned int *)0xE0200F48)

#define EXT_INT_3_PEND        (*(volatile unsigned int *)0xE0200F4c)

int i = 0;

void do_irq(void)

{

    // 清中断 

    EXT_INT_2_PEND |= 1<<3;

    EXT_INT_3_PEND |= 1<<0;

    // 清中断向量 

    VIC0ADDRESS = 0;

    if(!(GPH2DAT & (1<<3)))

    {

        wy_printf("counter(k4) : %d \n",i++);

    }

    if(!(GPH3DAT & (1<<0)))

    {

        wy_printf("counter(K5) : %d \n",i--);

    }

}

extern void key_IRQ(void);

void irq_init(void)

{

    // 设置GPH2_3(K4),GPH3_0(K5)用于中断 

    GPH2CON |= 0xf<<12;

    GPH3CON |= 0xf<<0;

    // 设置触发方式为下降沿触发 

    EXT_INT_2_CON |= 0x2<<12;

    EXT_INT_3_CON |= 0x2<<0;

    // 使能中断(GPIO里面的) 

    EXT_INT_2_MASK &= ~(1<<3);

    EXT_INT_3_MASK &= ~(1<<0);

    // 设置为IRQ中断 

    VIC0INTSELECT &= ~(1<<16);

    // 使能中断(中断控制器里面的) 

    VIC0INTENABLE |= 1<<16;

    // 设置中断向量 

    VIC0VECTADDR16 = (int)key_IRQ;

}

==================================================================

main.c源码:

#include "command.h"

#include "clock.h"

#include "led.h"

#include "uart.h"

#include "lib.h"

#include "nand.h"

#define    CFG_PROMPT        "WY_BOOT # "    // Monitor Command Prompt    

#define    CFG_CBSIZE        256        // Console I/O Buffer Size    

char *argv[10];

int readline (const char *const prompt)

{

    char console_buffer[CFG_CBSIZE];        // console I/O buffer    

    char *buf = console_buffer;

    int argc = 0;

    int state = 0;

    //puts(prompt);

    wy_printf("%s",prompt);

    gets(console_buffer);

    

    while (*buf)

    {

        if (*buf != ' ' && state == 0)

        {

            argv[argc++] = buf;

            state = 1;

        }

        

        if (*buf == ' ' && state == 1)

        {

            *buf = '\0';

            state = 0;

        }

        

        buf++;    

    }

    

    return argc;

}

void message(void)

{

    wy_printf("\nThis bootloader support some command to test peripheral:\n");

    wy_printf("Such as: LCD, IIS, BUZZER \n");

    wy_printf("Try 'help' to learn them \n\n");    

}

int main(void)

{

    char buf[6];

    int argc = 0;

    int i = 0;

    led_init(); // 设置对应管脚为输出 

    uart_init(); // 初始化UART0 

    nand_read_id(buf);

    wy_printf("\n**********************************************************\n");

    wy_printf("                     wy_bootloader\n");

    wy_printf("                     vars: %d \n",2012);

    wy_printf("                     nand id:");

    putchar_hex(buf[0]);

    putchar_hex(buf[1]);

    putchar_hex(buf[2]);

    putchar_hex(buf[3]);

    putchar_hex(buf[4]);

wy_printf("\n********************************************

[1] [2]

关键字:Tiny210裸机  按键中断

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news101241714.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Tiny210裸机IIC之at24cxx操作
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32学习笔记---基于UCOSII的EXTI外部按键中断实验

继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。//EXTI按键任务----------------------------------------static  void Task_EXTI(void* p_arg){     (void) p_arg;     while(1)   
发表于 2018-10-10
STM32学习笔记---基于UCOSII的EXTI外部按键中断实验

STM32之LED按键中断

****************************************************************************************************************************************前言:本文主要是通过按键中断,实现当按下按键时,LED灯灭,释放按键时,LED灯亮。(不过我设置LED的起始状态为亮,也就是上电就点亮了LED灯。)下面看main.c#include "stm32f10x.h"#include "led.h"#include "exti.h"  int main(void) {     init_led_gpio();  turn_led(LED1,ON);    /*exti line
发表于 2018-07-21

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题开发板:奋斗V5这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环..好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6ok,剩下的就是配置工作了.. 先来理一理思路:(1)初始化系统时钟(2)初始化外部时钟(你所用到的东西)(3)配置LED(4)配置中断优先级(5)配置外部中断线(6)中断处理函数恩,差不多就是这样了..然后再来一条一条的看:(1)和(2)都属于RCC配置,可以放在一个功能模块里面:<pre name="
发表于 2018-07-21

STM32_按键中断

****************************************************************************************************************************************前言:本文主要是通过按键中断,实现当按下按键时,LED灯灭,释放按键时,LED灯亮。(不过我设置LED的起始状态为亮,也就是上电就点亮了LED灯。)    我的开发板按键,LED所对应的GPIO管脚原理图如下:我写的按键中断程序实现的功能是:按下按键K2,LED3由亮变灭,释放按键LED3又变亮。(按键K2对应PC2管脚,LED3对应PD3管脚)。测试代码:#include "misc.h"#include "stm32f10x_gpio.h"#include "stm32f10x_exti.h"
发表于 2018-07-21

STM32通过按键中断点亮led灯

= GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8  GPIO_Init(GPIOC, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz} 之后是中断的头文件#ifndef _EXTI_H_#define _EXTI_H_#include "sys.h"void EXTI_KEY_Init(void);//³õʼ»¯       
发表于 2018-07-21

【stm32f407】外部中断实现按键中断方式

线和GPIO映射关系,然后又设置好了中断的触发模式等初始化参数。既然是外部中断,涉及到中断我们当然还要设置NVIC中断优先级。这个在前面已经讲解过,这里我们就接着上面的范例, 设置中断线2的中断优先级。NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel= EXTI2_IRQn;    //使能按键外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0x02;  //抢占
发表于 2018-07-20

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved