一起学mini2440裸机开发(十二)--mini2440的串口中断实验
mini2440调试进不了中断解决方案
ldr r0,=SRCPND str r1,[r0] ldr r0,=INTPND str r1,[r0] ldr r0,=INTSUBMSK ldr r1,=0x7fff @all sub interrupt disable, 2002/04/10 str r1,[r0] @@@设置频率 mov r1, #CLK_CTL_BASE ldr r2, clock_locktime str r2, [r1, #oLOCKTIME] mov r1, #CLK_CTL_BASE ldr r2, clkdivn_value str r2, [r1, #oCLKDIVN] mrc p15, 0, r1, c1, c0, 0 @ read ctrl register orr r1, r1, #0xc0000000 @ Asynchronous mcr p15, 0, r1, c1, c0, 0 @ write ctrl register mov r1, #CLK_CTL_BASE ldr r2, mpll_value @ clock default str r2, [r1, #oMPLLCON] @@@@初始化串口 InitUART: @set GPIO for UART mov r1, #GPIO_CTL_BASE add r1, r1, #oGPIO_H ldr r2, gpio_con_uart str r2, [r1, #oGPIO_CON] ldr r2, gpio_up_uart str r2, [r1, #oGPIO_UP] ldr r1, SerBase mov r2, #0x0 str r2, [r1, #oUFCON] str r2, [r1, #oUMCON] mov r2, #0x3 str r2, [r1, #oULCON] ldr r2, =0x245 str r2, [r1, #oUCON] .equ UART_BRD , ((UART_PCLK / (UART_BAUD_RATE*16)) - 1) mov r2, #UART_BRD str r2, [r1, #oUBRDIV] mov r3, #100 InitUART1:
裸机定时器中断控制LED灯程序设计实验报告
裸机定时器中断控制LED灯程序设计一、实验要求:基于mini2440开发板,设计裸机定时器中断控制LED灯闪烁的程序。
二.设计目的1,巩固学习嵌入式软件方面的基本知识,进一步熟悉基本概念。
2,熟练常用控件,文件,图形等方面的操作了解基本的流程。
3,运用所用学的嵌入式知识,编写出较为实用的小软件,增进对一些实际问题的软,硬件知识的掌握。
4,培养查阅资料,独立思考问题的能力。
三. 实验步骤:四.基本思路及关键问题的解决方法;基本思路:1. 按照步骤程序设计原理说明,使用”CodeWarrior for ARM Developer Suite”软件编写程序并进行编译,建立一个新的文件单击【File】菜单中的【New File】选项,然后出现下面的对话框,输入文件名(加上后缀“.c”),单击保存按钮,在编译过程中如果出现错误,修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。
程序编写完成后,将程序所在文件保存到2440test.mcp中,如图所示:2.用开发板测试程序代码:(1)首先设置开发板的拨动开关S2 为Nor Flash 启动,连接好附带的USB 线和电源(可以不必连接串口线)。
(2)设置超级终端(3)开机进入BIOS 模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面,如下图:输入”d”(4)安装USB 下载驱动(5)点击DNW 程序的“USB Port” “Transmit”,选择这个2440test.mcp文件,接着点“打开”,这样就开始下载了五.流程图及电路原理图1.绘制所需的流程图,如图所示:六.课程设计心得体会此次课程设计中我们的收获:我了解到了和小组成员合作的愉快,我意识到了知识的乐趣性,并感觉到当知识运用于实践的时候是一件多么幸福的事情。
我也发现自己的知识功底还远远不够。
平时不仅要将知识点理解掌握,还得勤动手做实验。
在以后的学习中我会更努力,在掌握理论知识的基础上,提高自己的动手能力。
中断实验实验报告
中断实验实验报告本实验是关于中断的学习和实验。
我们需要掌握中断的概念、分类、使用方法、实现过程等知识,并通过实际操作来理解中断的工作原理。
实验环境:硬件:STM32F103C8T6开发板、OLED显示屏、按键开关软件:Keil5、ST-LINK调试工具实验过程:1、准备工作首先,我们需要在Keil中新建一个STM32F103C8T6项目,然后将要使用到的头文件和驱动程序添加到项目中。
2、了解中断中断是指当CPU执行某个程序时,由于硬件或软件的干预而打断原来的程序执行,转而执行指定的中断服务程序(ISR),完成相应的工作后再回到被打断的程序。
中断可以提高系统响应速度,增强系统的可靠性和稳定性。
中断可分为外部中断和内部中断。
外部中断是由硬件引脚上的信号产生的中断请求。
内部中断是由软件产生的中断请求,例如软件中断、定时器中断等。
3、编写程序首先,我们要在程序中使能系统滴答定时器(SysTick)。
SysTick是STM32系统内置的一个定时器,可以在一定的时间周期内产生一次中断请求。
在这里,我们将SysTick的中断周期设置为1秒,以便后续实验中查看效果。
然后,我们编写一个中断服务程序,用来处理按键开关产生的中断请求。
当按键按下时,将在OLED屏幕上显示按键按下的次数,并通过串口向PC端发送按键按下的消息。
需要注意的是,为避免中断服务程序中使用延时函数(例如HAL_Delay),我们在程序中使用了定时器来延时。
最后,我们需要在程序中启用外部中断,以便可以检测到按键开关的中断请求。
在此实验中,我们使用了外部中断1,其对应的引脚为PA1。
4、实验结果当按键按下时,OLED屏幕上的数字会自动加1,并通过串口向PC端发送按键按下的消息。
可以看到,此实验中使用的中断机制可以在不占用CPU资源的情况下,实现对按键事件的响应和处理。
通过这次实验,我们对中断有了更深入的认识,了解了中断的工作原理、分类、使用方法和实现过程,掌握了在STM32中使用中断的具体操作方法。
中断实验报告实验步骤
一、实验目的1. 了解中断的基本概念和作用。
2. 掌握中断处理程序的设计方法。
3. 熟悉中断控制器的工作原理。
4. 通过实验验证中断系统的功能。
二、实验原理中断是一种处理程序,当系统需要处理某个事件时,暂时中断当前程序的执行,转而执行中断处理程序。
中断处理程序执行完毕后,返回到被中断程序的原点继续执行。
中断系统由中断控制器、中断处理程序和中断请求源组成。
三、实验设备1. PC机一台2. 开发板一块3. 示波器一台4. 编译器一套四、实验步骤1. 实验环境搭建(1)将开发板插入PC机的USB接口。
(2)打开编译器,新建一个C语言项目。
(3)编写实验代码。
2. 编写中断处理程序(1)定义中断服务例程(ISR)函数。
(2)编写ISR函数,实现中断处理功能。
(3)在主函数中调用ISR函数。
3. 编写主函数(1)初始化中断控制器。
(2)设置中断向量表。
(3)启动中断控制器。
4. 编译与调试(1)将编写好的代码编译成可执行文件。
(2)将可执行文件烧写到开发板中。
(3)打开示波器,观察中断信号。
5. 实验验证(1)通过按键、串口或其他方式触发中断。
(2)观察示波器上的中断信号,验证中断处理程序是否正确执行。
五、实验结果与分析1. 实验结果通过实验,成功实现了中断系统的功能。
在触发中断后,示波器上出现了中断信号,表明中断处理程序已正确执行。
2. 实验分析(1)中断控制器初始化正确,中断向量表设置正确。
(2)ISR函数编写正确,能够正确处理中断事件。
(3)主函数调用ISR函数,实现了中断处理。
六、实验总结通过本次实验,掌握了中断的基本概念和作用,熟悉了中断处理程序的设计方法,了解了中断控制器的工作原理。
实验结果表明,中断系统能够正常工作,达到了实验目的。
七、实验改进与展望1. 在实验中,可以尝试使用不同类型的中断源,如定时器中断、串口中断等,以进一步验证中断系统的功能。
2. 可以研究中断嵌套处理,实现更复杂的中断处理流程。
MINI2440串口测试代码分析
串口接收中断实验报告
#### 一、实验目的1. 理解串口通信的基本原理和配置方法。
2. 掌握使用中断方式接收串口数据的方法。
3. 学习如何在中断服务程序中处理接收到的数据。
4. 熟悉嵌入式开发环境下的程序调试技巧。
#### 二、实验环境1. 主控芯片:STM32F103C8T62. 开发环境:STM32CubeIDE3. 串口通信线:USB转串口线4. 连接设备:PC(上位机)#### 三、实验原理串口通信是计算机与外部设备之间进行数据交换的一种常见方式。
在嵌入式系统中,串口通信常用于设备之间的数据传输。
本实验采用中断方式接收串口数据,即在数据到来时,由硬件中断触发中断服务程序,从而实现数据的接收。
#### 四、实验步骤1. 硬件连接将STM32F103C8T6开发板通过USB转串口线连接到PC,确保串口线正确连接至开发板的USART1接口。
2. 软件配置1. 打开STM32CubeIDE,创建一个新的STM32CubeMX项目。
2. 在STM32CubeMX中配置USART1,设置波特率为9600,数据位为8位,停止位为1位,无校验位。
3. 使能USART1的中断,包括接收中断(RXNE)和空闲中断(IDLE)。
4. 配置NVIC,设置USART1的中断优先级。
3. 程序编写1. 在STM32CubeIDE中添加C语言程序文件。
2. 编写初始化函数,配置USART1的GPIO引脚、USART1的寄存器以及NVIC中断。
3. 编写中断服务程序,在中断服务程序中处理接收到的数据。
4. 编写主函数,用于启动串口通信。
4. 程序调试1. 在PC端打开串口调试助手,设置波特率、数据位、停止位和校验位,与STM32F103C8T6开发板配置保持一致。
2. 编译并下载程序到开发板。
3. 在PC端发送数据,观察开发板是否能够正确接收并处理数据。
#### 五、实验结果与分析1. 实验结果在PC端发送数据,开发板能够通过中断方式正确接收数据,并在串口调试助手中显示接收到的数据。
s3c2440,adc实验心得体会
竭诚为您提供优质文档/双击可除s3c2440,adc实验心得体会篇一:一起学mini2440裸机开发(十三)--adc原理与实验一起学mini2440裸机开发(十三)--adc原理与实验概述s3c2440的cmos模拟数字转换器adc可以对8通道模拟输入信号进行循环检测,s3c2440的adc和触摸屏公用一个adc转换器,所以学习adc也是学习触摸屏的基础。
s3c2440adc的主要特性如下:●分辨率:10位●最大转换速率:500ksps●微分线性度误差:±1.0lsb●积分线性度误差:±2.0lsb●供电电压:3.3V●模拟输入电压范围:0~3.3Vadc原理adc是一种将模拟信号转化为数字信号的方法,一般要经过采样、保持、量化、编码4个步骤。
在实际电路中,有些过程是合并进行的,如采样和保持,量化和编码在转换过程中时同时实现的。
由奈奎特采样定理可知,当采样频率大于模拟信号中最高频率的2倍时,采样值才能不失真地反映原来模拟信号。
主要技术指标如下:●分辨率通常以输出二进制的位数表示分辨率的高低,一般位数越多,量化单位越小,对输入信号的分辨能力就越高。
例如,输入模拟电压的变化范围为0±~3.3V、分辨率为12位时,可以分辨的最小模拟电压为3.3V/2^12≈0.8mV;而分辨率为10位时,可以分辨的最小模拟电压为3.3V/2^10≈3.2mV。
●转换误差它是指在零点和满度都校准以后,在整个转换范围内,分别测量各个数字量所对应的模拟输入电压实测范围与理论范围之间的偏差,取其中的最大偏差作为转换误差的指标。
它通常以相对误差的形式出现,并以lsb为单位表示。
●转换速度完成一次模数转换所需要的时间称为转换时间。
在大多数情况下,转换速度是转换时间的倒数。
adc的转换速度主要取决于转换电路的类型,并联比较型adc的转换速度最高,逐次逼近型adc次之,双积分型adc转换速度最低。
s3c2440处理器adc功能图如图1所示,其中虚线框是与触摸屏有关的功能模块,可以暂不考虑,学完adc基本实验后,再学触摸屏部分也可以。
一起学mini2440裸机开发(四)--S3C2440定时器学习
一起学mini2440裸机开发(四)--S3C2440定时器学习S3C2440定时器原理概述s3c2440有5个16位定时器,定时器0、1、2和3有脉冲宽度调制(PWM)功能,因此这4个定时器也被称为PWM定时器。
定时器4是一个内部的定时器,没有外部输出引脚。
定时器的时钟源是PCLK,定时器工作所需频率并不等于PCLK,还要进一步将PCLK 通过内部的分频器分频才能得到。
这里也可以看出外部设备所需的工作频率不一定等于它的时钟源。
其中,定时器0、1公用一个分频器,另外3个定时器公用一个分频器。
分频器输入信号经过第2级分频器进一步降低时钟频率,然后输出作为定时器工作的时钟。
下图为由PCLK得到定时器工作时钟的框图:虽然S3C2440定时器有5个,但是它们的工作原理都是相同的,只需要理解一个定时器的工作原理即可。
对于某一个定时器,其内部结构原理如图2所示。
寄存器TCMPBn和TCNTBn用于缓存定时器n的比较值和初始值;TCON用于控制定时器的开启与关闭;可以通过读取寄存器TCNTOn得到定时器的当前计数值。
注意图2所示的是PWM定时器,也就是定时器0-3,不包含定时器4,定时器4也没有外部输出引脚。
定时器工作原理概述:●首先,将定时器的比较值和初始值装入寄存器TCMPBn和TCNTBn中●然后,设置定时器控制寄存器TCON,启动定时器。
此时,TCMPBn和TCNTBn 中的值会加载到寄存器TCMPn和TCNTn中●此时,定时器会减1计数,即TCNTn进行减1计数,当TCMPn=TCNTn时,TOUTn引脚输出取反。
S3C2440定时器相关寄存器●定时器控制寄存器TCON由于各个定时器的工作原理相似,下面以定时器0为例进行讲解。
在定时器控制寄存器TCON中,位[3:0]用于控制定时器0,其含义如表1所示:位功能简述描述0开启/停止0:停止定时器1:开启定时器1手动更新0:未使用1:TCMPB0和TCNTB0中的值会加载到寄存器TCMP0和TCNT0中2输出控制0:当TCMP0=TCNT0时,TOUTO0引脚输出不翻转1:当TCMP0=TCNT0时,TOUTO0引脚输出翻转3自动加载0:自动加载1:当TCNTO0的值减到0时,TCMPB0中的值会加载到寄存器TCMPB0和TCNTB0中●定时器比较值缓存寄存器TCMPBn、计数值缓存寄存器TCNTBn这两个寄存器用于存储定时器的比较值初始值和计数值初始值。
ARM裸机开发222440中断原理
ARM裸机开发222440中断原理
1CPU与外设之间的数据传送控制方式(I/O控制方式)通常有以下三种方式
1.查询方式
2.中断方式
3.DMA方式(在独立开辟的一个空间不由CPU控制,有DMA自己进行管理。
实现存储器与外设的高速的数据传输方式)
主要讲中断:
中断请求---->中断仲裁---->中断响应---->中断处理---->中断返回(要保存现场)
中断处理流程:
1.中断控制器捕获当前外设发出的中断信号,通知SOC(中央处理芯片:片上系统)
2.SOC保存当前程序的运行环境,调用中断服务程序(ISR:一小段代码)进行处理中断
3.在ISR中通过读取中断控制寄存器、外设的相关寄存器来识别那一个中断触发,获取硬件中断号IRQ,跳转到相应的处理程序(详细完整的处理程序)来完成中断处理
4.清除中断:通过读写相关寄存器
5.恢复被中断的环境,继续执行(现场)
2440有60个中断源
一级中断源,二级中断源等的概念。
Mini2440开发板学习记录2
Mini2440学习22、H—JTAG的利用说明当前由友善之臂推出的的ARM学习开发超级滴流行,由于此刻的ARM调试与开发相较以前的单片机罢了加倍复杂,硬件上的考虑也更多了,因此选择一个好的开发方式无疑是学习ARM的最好起点。
此刻的市面上有很多出售,可是一样都比较贵,而且仿真器一样都有自己的配套的软硬件,在速度和Flash编程方面都各有优缺。
但是这些关于初学者罢了都太贵了,而简易仿真器的显现让初学者们能够利用乃至自制简易仿真器来调试ARM程序。
有了调试硬件部份,还得有调试代理软件,调试代理软件运行在宿主机上,帮忙宿主机上的前端调试软件(如AXD,Keil)利用JTAG接口(能够是简单的JTAG或是J-Link)完成与该开发板的硬件的交互。
目前能够免费利用的调试代理软件有很多,不同也专门大,要紧表此刻易用程度,支持的CPU类型,调试速度方面。
H-JTAG是最新出来的简易仿真器调试代理软件,其支持的器件较多,支持的前端调试软件业较多,专门是支持Keil,其调试速度也很有优势。
H-JTAG是有twentyone推出的免费代理软件,其官方主页为:。
目前官网上的最新的H-JTAG版本为V1.1 Release(2020.10.11)。
其支持特性有:支持RDI1.5.0和RDI1.5.1,支持ARM7和ARM9(包括ARM9E-S和ARE9EJ-S),支持Thumb和ARM指令集,支持大端方式和小端方式,支持(半主机机制),支持,和用户自概念的简易调试器硬件接口,支持Flash器件的编程。
依照上面提供的连接,用户能够自行下载某个版本的H-Jtag。
下载安装后运行界面如以下图所示:上图是没有找到硬件时的显示。
工具栏的快捷图标与菜单中图标一样的选项功能一样,下面详细介绍。
1)File停止运行H-Jtag,关闭该运行界面只会使H-JATG最小化托盘,并非会退出。
2)Operations这是以前的版本显示,此刻的不是叫Operatons,而是Control,可是一样的道理。
一起学mini2440裸机开发(九)--ARM中断控制系统
一起学mini2440裸机开发(九)--ARM中断控制系统ARM处理器程序的执行流程种类●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。
这一过程描述了应用程序顺序执行的状态。
●跳转执行:通过B、BL跳转执行,实现程序在一定范围内的跳转执行。
这一过程描述了ARM处理器程序执行过程中的过程调用。
●中断处理:在应用程序执行过程中,发生中断后,ARM处理器在执行完当前指令后,跳转到上述中断对应的中断处理程序处去执行,执行完中断处理程序后,再返回到发生中断的指令的下一条执行处接着执行。
这一过程描述了ARM处理器对异常中断的响应情况。
S3C2440中断系统概述在ARM处理器运行过程中,需要与系统的各类外部设备进行通信,包括发出控制信息、读取外部设备的状态信息以及采集数据等。
完成上述功能有以下两种实现方法。
●查询方式:处理器不断地查询外部设备的状态,一般是每隔一段时间查询一次或者是始终在查询,这样做的缺点是实时性差、浪费处理器时间。
●中断方式:当外设状态发生变化时发送一个信号给处理器,处理器通过内部的控制逻辑找到具体的外部设备,然后对请求信息进行响应。
在这种情况下,处理器的利用率大大提高,同时也提高了系统的实时性。
ARM处理器对中断第处理流程基本符合下面的流程。
①中断发生后,中断控制器将中断请求发送给CPU②CPU将当前程序的运行环境(程序的运行环境包括程序执行过程中使用的寄存器以及程序的返回地址等信息)保存,调用相应的中断处理程序。
③在中断处理程序中,识别具体是哪个中断发生,并进行相应的处理④从中断处理程序返回,恢复被中断程序的运行环境,接着执行。
ARM处理器有7种工作模式,如下表所示表1 ARM处理器工作模式处理器模式说明用户模式(User) 程序正常执行的模式快速中断模式(FIQ) 用于高速数据传输外部中断模式(IRQ) 用于普通的中断处理特权模式(Supervisor) 操作系统使用的一种保护模式数据访问终止模式(Abort) 用于虚拟存储及存储保护未定义指令终止模式(Udefined) 用于支持通过软件仿真硬件的协处理器系统模式(System) 用于运行特权级的操作系统任务ARM处理器的工作模式分为用户模式和特权模式,除用户模式外的其他6种工作模式为特权模式。
Mini 2440 LED、按键和蜂鸣器裸机测试程序(C语言)
Parameter : 无
Description : 按下按键 1(key1)将会点亮 led1,并且蜂鸣器将发出响声,按键 1-4 依次对应,按
下按键 5(key5)点亮所有的 led,按下按键 6(key6)关闭所有的 led
Return
:无
Argument : 无
Autor & date : Hyfeng
} }
但是对应蜂鸣器来说 1 代表发出声音,而 0 则代表不出声音。
在此程序中并没有使用到按键的中断,而是使用了一个死循环去实现的。并且这个程序
保护两个部分,一个是汇编程序编写的引导部分,因为这是一个裸机的程序,即没有操作系
统的程序,因此想要在板子上运行 C 程序必须进行相应的初始化的工作,这个就是汇编程序
**************************************************/
//将按键的状态设置为输入的状态
void key_init(void)
{
rGPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22));}
/*************************************************
rGPBCON &= ~((3<<0)); rGPBCON |= (1<<0); }
/*************************************************
Function name: delay
Parameter : times
串口调试实训报告心得体会
随着科技的发展,嵌入式系统在各个领域得到了广泛的应用。
串口通信作为嵌入式系统中一种常见且重要的通信方式,其在系统调试和运行过程中的重要性不言而喻。
为了提高我对嵌入式系统串口通信的理解和调试能力,近期我参加了串口调试实训。
以下是我对本次实训的心得体会。
一、实训背景本次实训以Mini2440开发板为基础,使用JLink V8仿真器和MKD4.54串口调试助手进行串口通信调试。
实训过程中,我学习了串口通信的基本原理、硬件配置、软件编程以及调试方法。
二、实训内容1. 串口通信原理首先,我对串口通信的基本原理进行了深入学习。
串口通信是指通过串行数据线进行数据传输的方式,其通信过程包括数据帧的发送和接收。
数据帧由起始位、数据位、校验位和停止位组成。
在发送端,CPU将数据转换为串行数据,通过串行口发送出去;在接收端,CPU通过串行口接收串行数据,将其转换为并行数据。
2. 硬件配置实训中,我学习了如何配置Mini2440开发板的串口硬件。
主要包括以下步骤:(1)配置数据格式的寄存器ULCON0:设置数据位、奇偶校验位和停止位。
(2)配置波特率的寄存器UBRDIV0:根据UART CLOCK和期望的波特率计算UBRDIV 值。
(3)配置GPHCON寄存器:将GPH0-3功能复用为nCTS0、nRTS0、TXD0和RXD0。
3. 软件编程在软件编程方面,我学习了如何使用C语言编写串口通信程序。
主要包括以下步骤:(1)初始化串口:配置串口参数,如波特率、数据位、校验位和停止位。
(2)发送数据:将数据写入发送缓冲区,并通过串口发送出去。
(3)接收数据:从接收缓冲区读取数据,并处理接收到的数据。
4. 调试方法在调试过程中,我学习了以下几种方法:(1)轮询方式:不断检测UTRSTAT0寄存器的[1]位,当其为1时,表示发送缓冲区为空,可以向UTXH0写入数据。
(2)中断方式:设置中断,当有数据发送或接收时,CPU会自动进入中断服务程序,处理数据。
一起学mini2440裸机开发(一)--第一个led灯点亮
一起学mini2440裸机开发(一)--第一个led灯点亮开发板:mini2440,NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A 。
开发环境:MDK4.11仿真器:Jlink v8这是我用csdn发表的第一个文章,之前使用过arm-linux-gcc裸机开发mini2440,但是很多函数什么的不能直接调用(我的技术问题),准备重新整理一下ARM裸机,整理好之后准备下一阶段学习。
关于软件MDK4.11和它的注册机,我传不上去,说是由于文件太大,又想要的直接加Q470868560要就行了。
下面开始我们的第一个LED灯的点亮程序吧!1、新建一个项目工程双击MDK图标进入开发环境,如下图,单击Project/New uVision Project,选择你要创建文档的位置,文档名为test,单击保存选择CPU为Samsung/S3C2440A,单击OK单击完OK按钮后,咱们先看一下原来的空test文件夹里多了什么文件,当然你也可以不用看,我是看看MDK到底是默认给咱们提供了什么方便,下图为单击OK后多出的文档很容易看出多出来一个test工程文档。
在上一步单击完OK后,会弹出下图,该图是为了让你选择是不是将Samsung S3C2440的启动代码复制添加的你的工程文档。
这段启动代码咱们以后分析,在这里先选择“是”选择“是”后,一个工程文档建好了,如下图所示。
你看上图,可以看到工程文档自动添加了S3C2440.s,这就是上一步选择“是”后自动添加的启动代码,咱们再看看test文件夹里多了什么文件。
很容易可以看出多了三个文件,其中一个就是S3C2440.s,这个代码很重要啊。
咱们现在先不管他,接着下一步。
2、新建一个文件。
选择File/New,新建一个文件。
将该文件保存并命名为test1,注意后面要加后缀.c,单击保存将test1.c文件添加到你的工程,对着Source Group1右击,选择“Add Files to Group "Source Group 1"...”选择刚才建立的test1.c,单击Add,该文件就被加到了工程中。
一起学mini2440裸机开发(六)--UART原理与基础实验
一起学mini2440裸机开发(六)--UART原理与基础实验我个人感觉UART也不算是很难,学过单片机的相信都用过UART,在这里还是说说它吧,并且在写基础实验并调试的时候,出现了一个问题,就是我们平时使用jlink调试程序都是基于在sdram中运行的,由于ram的掉电易失性,所以咱们的裸机程序根本就不能脱机工作,也即是说复位之后程序就没有了,当然,我知道可以利用以后学的知识将它下载到NAND Flash中去,这个以后再说。
貌似还有一个办法,就是使用mdk直接Download到flash,不过需要什么算法之类的,这个算法我还不懂,先不管他了,先把UART的原理实验弄清楚了再说,以后学了nand flash就可以脱机工作了。
UART概述S3C2440通用异步收发器(UART)提供3个独立的异步串行I/O(UART0、UART1、UART2),每个端口都可以在中断或DMA模式下。
也就是说,在CPU和UART之间传输数据时,UART可以产生中断或DMA请求。
使用UART的最简单情况是只使用3根线:Tx用于数据发送,Rx用于数据接收,GND 是双方地线,提供通信双方的参考电平,如图1所示:其中电平转换器的作用是完成通信双方之间的电平转换,这又牵扯到RS232电平和CMOS电平,咱可以不管它,可以直接假设PC机的Rx、Tx粉笔用两根线直接与SC2440的Tx、Rx相连就行了,即,PC机发送端Tx发送一个数据,S3C2440接收端Rx就能接收到该数据,反之亦然。
S3C2440处理器UART工作原理:S3C240的3个UART包括可编程的波特率,红外(IR)发射/接收,一个或两个停止位,5位、6位、7位或8位的数据宽度,和奇偶校验位。
(不很懂是吧,其实我开始也不懂,这是什么玩意儿)每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,如图2所示。
波特率发生器的输入时钟有3种:PCLK、FCLK/n、UEXTCLK(外部输入时钟)。
一起学mini2440裸机开发(十二)--mini2440的串口中断实验
一起学mini2440裸机开发(十二)--mini2440的串口中断实验这一节实现利用中断实现串口的中断功能,关于串口的原理我就不再讲述了,如果不明白,就请查看我的另一篇博客/mybelief321/article/details/8931064下面我还是贴出自己的实验代码,我上传到了网站,可以自行下载,下载后,打开工程文档,直接编译后,利用Flash/Dowmload功能下载到nor flash,关于下载到nor flash如果有不会的请看:/mybelief321/article/details/8954788本实验实现的功能是:利用串口中断功能,通过串口调试工具接收到字符后再显示。
下图为我的工程文档main.c文件#include"isrservice.h"#include"uart.h"#include"led.h"#include"interrupt.h"int main(){Uart0_Init(115200); //初始化并设置波特率为115 200Uart0_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);#endifled.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);#endifuart.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--RXD0GPHCON|=((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);#endifinterrupt.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);#endifisrservice.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;}}。
06-mini2440之定时器中断
#define GLOBAL_CLK 1#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"void led_port_init(void);void timer0_init(void);void __irq timer0_handle(void);int Main(void){led_port_init();MMU_Init();timer0_init();while (1);return 0;}void led_port_init(void){rGPBCON = 0x00015400; //设置LED口为输出rGPBDA T = 0xe<<5; //初始化为全暗}void timer0_init(void){/*系统时钟初始化在其它文件中已经完成*/rTCFG0 = 99; //预分频的值为(199 + 1)rTCFG1 = 0x3; //1/16的再分频50MHz/100/16 = 31250Hz rTCNTB0 = 31250;// rTCMPB0 = 0; 默认值就是0,所以没必要设置rTCON = 1<<1; //第一次需要手动更新。
把初值填入rTCNT0rTCON = 0x9; //三个功能:自动加载,清除手动更新,启动定时器pISR_TIMER0 = (unsigned int)timer0_handle; //注册中断ClearPending(BIT_TIMER0); //清除原来可能有的中断EnableIrq(BIT_TIMER0); //总掩码打开。
中断使能}void __irq timer0_handle(void){static unsigned char count;ClearPending(BIT_TIMER0);switch(++count % 4){case 0:rGPBDA T |= (1<<8);rGPBDA T &= ~(1<<5);break;case 1:rGPBDA T |= (1<<5);rGPBDA T &= ~(1<<6);break;case 2:rGPBDA T |= (1<<6);rGPBDA T &= ~(1<<7);break;case 3:rGPBDA T |= (1<<7);rGPBDA T &= ~(1<<8);break;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一起学mini2440裸机开发(十二)--mini2440的串口中断实验这一节实现利用中断实现串口的中断功能,关于串口的原理我就不再讲述了,如果不明白,就请查看我的另一篇博客/mybelief321/article/details/8931064下面我还是贴出自己的实验代码,我上传到了网站,可以自行下载,下载后,打开工程文档,直接编译后,利用Flash/Dowmload功能下载到nor flash,关于下载到nor flash如果有不会的请看:/mybelief321/article/details/8954788本实验实现的功能是:利用串口中断功能,通过串口调试工具接收到字符后再显示。
下图为我的工程文档main.c文件#include"isrservice.h"#include"uart.h"#include"led.h"#include"interrupt.h"int main(){Uart0_Init(115200); //初始化并设置波特率为115 200Uart0_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);#endifled.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);#endifuart.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--RXD0GPHCON|=((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);#endifinterrupt.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);#endifisrservice.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;}}。