资源描述
2.8_C语言程序实验
#define uint8 unsigned char
#define uint32 unsigned int
#define N 100
uint32 sum;
// 使用加法运算来计算1+2+3+...+(N-1)+N的值。(N>0)
void Main(void)
{ uint32 i;
sum = 0;
for(i=0; i<=N; i++)
{ sum += i;
}
while(1);
}
2.9_C语言调用汇编程序实验
#define uint8 unsigned char
#define uint32 unsigned int
extern uint32 Add(uint32 x, uint32 y);
uint32 sum;
// 调用汇编程序Add实现加法运算
void Main(void)
{ sum = Add(555, 168);
while(1);
}
2.10_GPIO输出控制实验1
/****************************************************************************
* 文件名:main.c
* 功 能:蜂鸣器控制。对蜂鸣器B1进行控制,采用软件延时方法。
* 使用I/O口直接控制,采用灌电流方式。
* 说 明:将跳线器JP22短接,JP20断开。
****************************************************************************/
#include "config.h"
#define BEEPCON 0x00000080 // P0.7引脚控制B1,低电平蜂鸣
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************
* 名 称:main()
* 功 能:控制蜂鸣器蜂鸣。
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置I/O为输出
while(1)
{
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(15);
IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(15);
}
return(0);
}
2.11_GPIO输出控制实验2
/ /****************************************************************************
* 文 件 名:main.c
* 功 能:LED显示控制。
* 通过GPIO直接控制8个LED产生流水灯效果
* 说 明:将跳线JP23全部短接,JP15跳线全部断开。
* 这个警告可忽略,C2892E: signed constant overflow
****************************************************************************/
#include "config.h"
#define LED1 1<<16 // P2.16
#define LED2 1<<17 // P2.17
#define LED3 1<<18 // P2.18
#define LED4 1<<19 // P2.19
#define LED5 1<<20 // P2.20
#define LED6 1<<21 // P2.21
#define LED7 1<<22 // P2.22
#define LED8 1<<23 // P2.23
#define LEDCON 0x00ff0000
const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,
0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************
* 名 称:main()
* 功 能:根据表DISP_TAB来控制LED显示。
****************************************************************************/
int main(void)
{ uint8 i;
/* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰 */
IO2DIR = LEDCON; // 配置LED控制I/O方向
while(1)
{
for(i=0; i<8; i++)
{
IO2CLR = DISP_TAB[i]; // 输出LED显示数据
DelayNS(10); // 延时
IO2SET = 0xffffffff;
}
}
return(0);
}
2.12_GPIO输入实验
****************************************************************************
* 文 件 名:main.c
* 功 能:读取I/O引脚值,并输出控制蜂鸣器。
* 使用I/O口输入方式对P0.20口进行扫描,对蜂鸣器控制。
* 说 明:将跳线器JP9、JP22短接,JP20断开。按下KEY1观察BUZZER效果。
****************************************************************************/
#include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣
#define KEY 1<<20 // 定义按键
/****************************************************************************
* 名 称:main()
* 功 能:读取P0.20口的值,并输出控制蜂鸣器B1。
****************************************************************************/
int main(void)
{ uint32 i;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入
while(1)
{
if( (IO0PIN&KEY)!=0 )
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
for(i=0; i<1000; i++);
}
return(0);
}
2.13_存储器重映射实验/****************************************************************************
* 文 件 名:main.c
* 功 能:将存储器重映射到片内RAM(0x40000000~0x4000003F),然后更改
* 0x40000000~0x4000003F的内容。
* 说 明:观察0x00000000~0x0000003F地址上的数据有何变化
****************************************************************************/
#include "config.h"
#define VECTOR_RAM ((unsigned char *) 0x40000000)
/****************************************************************************
* 名 称:main()
* 功 能:存储器重映射。
****************************************************************************/
int main(void)
{ uint8 i;
uint8 *addr;
MEMMAP = 0x02; // 中断向量从静态RAM重映射(用户RAM模式)
addr = VECTOR_RAM;
for(i=0; i<64; i++) // 用0x55填充0x40000000~0x4000003F
{
*addr = 0x55;
addr++;
}
addr = VECTOR_RAM;
for(i=0; i<64; i++) // 用0xAA填充0x40000000~0x4000003F
{
*addr = 0xAA;
addr++;
}
MEMMAP = 0x00; // 中断向量从Boot Block重映射(Boot装载程序模式)
while(1);
return(0);
}
2.14_外部中断实验1/****************************************************************************
* 文 件 名:main.c
* 功 能:使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,
* 使用非向量中断方式。
* 说 明:将跳线器JP9、JP22短接,JP20断开。按下KEY1观察BUZZER效果。
****************************************************************************/
#include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣,1<<7 等价于 0x80
/****************************************************************************
* 名 称:IRQ_Eint3()
* 功 能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:无
* 出口参数:无
PINSEL0 是选择引脚功能
IO0DIR 是选择引脚 做 输入 还是做 输出功能
IO0SET 是让引脚输出1
IO0CLR 是让引脚输出0
****************************************************************************/
void __irq IRQ_Eint3(void)
{ uint32 i;
i = IO0SET; // 读取当前B1控制值
if( (i&BEEPCON)==0 ) // 控制B1输出取反
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
/* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
while( (EXTINT&1<<3)!=0 )
{
EXTINT = 1<<3; // 清除EINT3中断标志,1<<3 等价于 0x08
}
VICVectAddr = 0; // 向量中断结束
}
/****************************************************************************
* 名 称:main()
* 功 能:初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。
* 说 明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
IRQEnable(); // 开IRQ中断
PINSEL1 = 3<<8; // 设置管脚连接,P0.20设置为EINT3
IO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入
/* 打开EINT3中断(使用非向量IRQ) */
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICDefVectAddr = (int)IRQ_Eint3; // 设置中断服务程序地址
EXTMODE = 0x00; // 设置EINT3中断为电平触发模式
EXTINT = 1<<3; // 清除EINT3中断标志 1000
VICIntEnable = 1<<17; // 使能EINT3中断,EINT3在Bit17上
while(1); // 等待中断
return(0);
}
2.15_外部存储器接口实验1
/****************************************************************************
* 文 件 名:main.c
* 功 能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
* 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说 明:无。
****************************************************************************/
#include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣
#define FLASH_ADDR 0x80000000 // FLASH的起始地址(分配为Bank1块)
/* 转换地址。将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。*/
/* 由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。 */
#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************
* 名 称:WordProgram()
* 功 能:半字(16位)数据编程。
* 入口参数:Addr 编程地址(SST39VF160内部地址)
* Data 编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 WordProgram(uint32 Addr, uint16 Data)
{ volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555); // 转换地址0x5555
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0xa0a0; // 第三个写周期,地址0x5555,数据0xA0
ip = (volatile uint16 *)(FLASH_ADDR|(Addr&0x1FFFFF));
*ip = Data; // 第四个写周期,地址Addr,数据Data
while (1) // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
{
temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{
if (temp1 != Data)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名 称:ChipErase()
* 功 能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 ChipErase(void)
{
volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x1010; // 第六个写周期,地址0x5555,数据0x10
while (1) // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
{
temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{
if (temp1 != 0xffff)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名 称:main()
* 功 能:SST39VF160擦除、编程操作。
****************************************************************************/
int main(void)
{ uint8 i;
uint8 err = 0;
volatile uint16 *addr;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置I/O为输出
ChipErase(); // FLASH全片擦除
// 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1
addr = (volatile uint16 *)FLASH_ADDR + 0;
for(i=0; i<100; i++)
{
if(0xFFFF != (*addr)) err = 1;
addr++;
}
WordProgram(0x0, 0x55AA); // 向FLASH的0地址写入0x55AA
addr = (volatile uint16 *)FLASH_ADDR + 0;
if(0x55AA != (*addr)) err = 1; // 读出校验,若数据错误则设置err=1
if(0==err)
{
IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(20);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(20);
}
else
{
while(1)
{
IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(10);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(10);
}
}
while(1);
return(0);
}
2.16_定时器实验1
/****************************************************************************
* 文 件 名:main.c
* 功 能:使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。(查询方式)
* 说 明:JP22跳线短接,JP20跳线断开。
****************************************************************************/
#include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣
/****************************************************************************
* 名 称:Time0Init()
* 功 能:初始化定时器0,定时时间为1S。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Time0Init(void)
{ /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
*/
T0PR = 99; // 设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 110592; // 比较值(1S定时值)
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
/****************************************************************************
* 名 称:main()
* 功 能:初始化I/O及定时器,然后不断的查询定时器中断标志。当定时时间到达时,取反BEEPCON
* 控制口。
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置I/O为输出
Time0Init(); // 初始化定时器0
while(1)
{
while( (T0IR&0x01) == 0 ); // 等待定时时间到
T0IR = 0x01; // 清除中断标志
if( (IO0SET&BEEPCON) == 0 )
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
}
return(0);
}
2.17_UART实验1
/****************************************************************************
* 文 件 名:main.c
* 功 能:向串口发送数据。
* 说 明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#define UART_BPS 115200 // 定义通讯波特率
uint8 const SEND_STRING[] = "Hello World!\r\n";
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************
* 名 称:UART0_Ini()
* 功 能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Init(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) /
展开阅读全文