一起学mini2440裸机开发(十二)--mini2440的串口中断实验

转载 2015年11月21日 11:11:39

这一节实现利用中断实现串口的中断功能,关于串口的原理我就不再讲述了,如果不明白,就请查看我的另一篇博客

   http://blog.csdn.net/mybelief321/article/details/8931064

   下面我还是贴出自己的实验代码,我上传到了网站,可以自行下载,下载后,打开工程文档,直接编译后,利用Flash/Dowmload功能下载到nor flash,关于下载到nor flash如果有不会的请看:http://blog.csdn.net/mybelief321/article/details/8954788

   本实验实现的功能是:利用串口中断功能,通过串口调试工具接收到字符后再显示。

   下图为我的工程文档

   

   main.c文件

#include"isrservice.h"
#include"uart.h"
#include"led.h"
#include"interrupt.h"

int main()
{    
    Uart0_Init(115200);    
 //初始化并设置波特率为115 200
    Uart0_Interrupt_Init();  //Uart0中断初始化
    Led_Init();                   //Led初始化
    while(1)                      //循环,等到中断发生
    {
        ;
    }      
}

      led.h文件

#ifndef __LED_H__
#define __LED_H__

#include<s3c2440.h>
#define Led1_On()  {GPBDAT&=(~(1<<5));}
#define Led1_Off()  {GPBDAT|=(1<<5);}
#define Led2_On()  {GPBDAT&=(~(1<<6));}
#define Led2_Off()  {GPBDAT|=(1<<6);}
#define Led3_On()  {GPBDAT&=(~(1<<7));}
#define Led3_Off()  {GPBDAT|=(1<<7);}
#define Led4_On()  {GPBDAT&=(~(1<<8));}
#define Led4_Off()  {GPBDAT|=(1<<8);}
/****************************************************
* 函数名称:void Led_Init(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:设置GPN5-8为输出功能,初始化4个LED灯灭
*****************************************************/

void Led_Init(void);

#endif

     led.c文件

/****************************************************
* 我的mini2440开发板上4个LED灯对应的GPIO口
* LED1---GPB5    LED2---GPB6
* LED3---GPB7    LED4---GPB8
*****************************************************/

#include<s3c2440.h>

/****************************************************
* 函数名称:void Led_Init(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:设置GPB5-8为输出功能,初始化4个LED灯灭
*****************************************************/
void Led_Init(void)
{
  GPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));
  GPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));    
//设置GPB5-8口为输出功能
  GPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));          //上拉电阻使能
  GPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);            //令GPBDAT5-8均为高电平,即令4个led灯全灭
}

     uart.h文件

#ifndef __UART_H__
#define __UART_H__

/***********************************************
*函数名称:void Uart0_Init(unsigned int baudrate)
*参数说明:baudrate:波特率
*返 回 值:无
*全局变量: 无
*功    能:对UART0进行初始化                          
************************************************/

void Uart0_Init(unsigned int baudrate);

#endif

      uart.c文件

#include<s3c2440.h>
#include<stdarg.h>
#include"uart.h"

#define PCLK   50000000
#define UART_BRD     (int)((PCLK/(baudrate*16))-1)

/***********************************************
*函数名称:void Uart0_Init(unsigned int baudrate)
*参数说明:baudrate:波特率
*返 回 值:无
*全局变量: 无
*功    能:对UART0进行初始化                          
************************************************/

void Uart0_Init(unsigned int baudrate)
{
 GPHCON&=~((3<<4)|(3<<6));  //GPH2--TXD0;GPH3--RXD0
 GPHCON|=((2<<4)|(2<<6));    //设置GPH2、GPH3为TXD0、RXD0功能
 GPHUP=0x00;                 //上拉电阻使能
 ULCON0|=0x03;              //设置数据发送格式:8个数据位,1个停止位,无校验位
 UCON0=0x05;                //发送模式和接收模式都使用查询模式
 UBRDIV0=UART_BRD;         //设置波特率,其中波特率作为一个参数传递到该初始化函数
 URXH0=0;                        //将URXH0清零
}


     interrupt.h文件

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__


/****************************************************
* 函数名称:void Uart0_Interrupt_Init(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:将UART0中断屏蔽位设为无效
*****************************************************/

void Uart0_Interrupt_Init(void);

#endif

      interrupt.c文件

#include<s3c2440.h>
#include"interrupt.h"


/****************************************************
* 函数名称:void Uart0_Interrupt_Init(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:将UART0中断屏蔽位设为无效
*****************************************************/

void Uart0_Interrupt_Init(void)

 INTMSK&=~(1<<28);     //Uart0中断带有子中断,所以需要将
                                       //Uart0总中断屏蔽位置为无效,然后将发送
                                        //中断和接收中断屏蔽位置设为无效,

 INTSUBMSK&=~((1<<0)|(1<<1));   //这样程序才能顺利地响应发送中断和接收
      
}   
   

     isrservice.h文件

#ifndef __ISRSERVICE_H__
#define __ISRSERVICE_H__

/****************************************************
* 函数名称:void __irq IRQ_Handler(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:Uart0中断服务函数,必须加__irq
*****************************************************/

void __irq IRQ_Handler(void);

#endif

     isrservice.c文件

#include<s3c2440.h>
#include"isrservice.h"
#include"led.h"

extern unsigned int flag; //声明外部变量flag,该变量是在main.c文件中定义的
        //当1s到来时,中断响应函数将该变量值取反,在主
        //程序中通过检测该变量的值来实现不同的操作

/****************************************************
* 函数名称:void __irq IRQ_Handler(void)
* 全局变量:无 
* 参数说明:无
* 返 回 值;无
* 功    能:Uart0中断服务函数,必须加__irq
*****************************************************/

void __irq IRQ_Handler(void)  //注意这个函数名字要和S3C2440.s处的跳转标号相同    
{
 unsigned char buf;
 if(SUBSRCPND&(1<<0))     //接收中断
 {
  buf=URXH0;  
//将接收到的字符存放在buf中

  Led1_On();
  SUBSRCPND|=1<<0; //清除接收中断
  SRCPND|=1<<28;
  INTPND|=1<<28;
  UTXH0=buf;         //PC机将接收的字符通过串口调试工具显示在屏幕上      
 }
 if(SUBSRCPND&(1<<1)) //发送中断
 {
  Led2_On();
  SUBSRCPND|=1<<1; //清除发送中断
  SRCPND|=1<<28;
  INTPND|=1<<28;
 }
}

相关文章推荐

一起学mini2440裸机开发(十二)--mini2440的串口中断实验

这一节实现利用中断实现串口的中断功能,关于串口的原理我就不再讲述了,如果不明白,就请查看我的另一篇博客    http://blog.csdn.net/mybelief321/article/det...

一起学mini2440裸机开发(六)--UART原理与基础实验

我个人感觉UART也不算是很难,学过单片机的相信都用过UART,在这里还是说说它吧,并且在写基础实验并调试的时候,出现了一个问题,就是我们平时使用jlink调试程序都是基于在sdram中运行的,由于r...

一起学mini2440裸机开发(七)--UART高级实验,可变参函数

概述:     在C语言中,使用printf()进行格式化输出非常方便,例如,printf("%d\n",a)可以将a的值以十进制的格式输出,然后换行。printff()函数的原型为:int p...

一起学mini2440裸机开发(九)--ARM中断控制系统

ARM处理器程序的执行流程种类   ●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。这一过程描述了应用程序顺序执行的状态。   ●跳转执行:通过B、BL跳转执行,实现程序在一...

一起学mini2440裸机开发(九)--ARM中断控制系统

ARM处理器程序的执行流程种类   ●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。这一过程描述了应用程序顺序执行的状态。   ●跳转执行:通过B、BL跳转执行,实现程序在一定范围内...

一起学mini2440裸机开发(十)--mini2440外部中断实验

我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表,...

一起学mini2440裸机开发(十一)--mini2440定时器0中断实验

在前边讲解系统时钟和定时器时,曾给出一个实验,实现的功能是:使用定时器0的功能,使LED每秒钟闪烁一次,当时是使用查询方式实现的,现在使用中断方式实现上述功能。    下图为我的工程文件布局: ...

一起学mini2440裸机开发(一)--第一个led灯点亮

开发板:mini2440, NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A  。     开发环境:MDK4.11     仿真器:Jlink v8     这是我用...

uart串口发送---那些年我们一起玩mini2440(arm9)裸机

Uart工作原理: 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送。 它的特点是:传输速度快,是用于短距离通信; §串行通信:利用一条数据线将数据一位...

按键中断---那些年我们一起玩mini2440(arm9)裸机

ARM中断控制系统 按键驱动程序设计 一.Arm中断控制系统 1.查询方式 程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一起学mini2440裸机开发(十二)--mini2440的串口中断实验
举报原因:
原因补充:

(最多只允许输入30个字)