| 学号 | 姓名 |
|---|---|
| 20175208 | 张家华 |
| 20175218 | 陈敬勇 |
| 20175230 | 滕星 |
实验内容:三人共同完成实验
撰写博客:陈敬勇



安装sc000库,打开Z32文件夹下的软件资料,找到Support.exe文件,双击进行安装
安装完成后,运行keil uVision4,进行工程基础编程环境搭建。其中,芯片库选择 Generic SC000 Device Database。ARM 结构目录,选择 SC000。


将实验箱接入电源,把笔记本电脑与实验箱连接好,在软件资料文件夹下的Z32下载调试工具中打开Z32下载调试工具 NZDownloadTool.exe 。打开实验箱的电源开关前,按住 Reboot 键不放,两次打开电源开关, Z32 即可被电脑识别,进行下载调试。
出现设备已连接,设备选择中显示芯片型号后,点击浏览,选择LED闪烁文件夹下bin文件夹中的Z32HUA.bin,最后点击下载。
关闭实验箱 Z32 的电源开关,再打开,程序自动运行,此时可以看到实验箱 Z32 核心板上 L2 灯开始闪烁。


main 函数代码如下:
int main(void)
{
/*********************此段代码勿动*********************/
//系统中断向量设置,使能所有中断
SystemInit();
//返回 boot 条件
if(0 == GPIO_GetVal(0))
{
BtApiBack(0x55555555, 0xAAAAAAAA);
}
/*********************此段代码勿动*********************/
GPIO_PuPdSel(0,0); //设置 GPIO0 为上拉
GPIO_InOutSet(0,0); //设置 GPIO0 为输出
while(1)
{
delay(100);
GPIO_SetVal(0,0); //输出低电平,点亮输出低电平,点亮LED
delay(100);
GPIO_SetVal(0,1); //输出高电平,熄灭输出高电平,熄灭LED
}
}
//延时函数,当系统时钟为内部延时函数,当系统时钟为内部OSC时钟时,延时1ms
void delay(int ms)
{
int i;
while(ms----)
{
for(i=0;i<950;i++) ;for(i=0;i<950;i++) ;
}
}
主函数代码的执行过程为:



用 9 针串口线将 Z32 模块的串口与电脑 USB 接口连接。
首先在电脑上打开串口助手,选择对应的串口号,设置波特率为 115200 ,偶校验( Even ),选中“发送新行”,然后打开串口。其中串口号可通过设备管理器查看。
关闭实验箱 Z32 电源开关,再打开,程序自动运行,可以在串口调试助手看到显示“ 0 0xAA ”。
代码分析
Uart.c
extern UINT8 shuju[64];
extern UINT8 shuju_lens;
extern UINT8 uart_rx_num;
extern UINT8 uart_rx_end;
void UART_IrqService(void)
{
//*****your code*****/
UARTCR &= ~TRS_EN;
{
do
{
shuju[uart_rx_num] = UARTDR;
if(shuju[uart_rx_num]=='\r'||shuju[uart_rx_num]=='\n')
{
shuju_lens = uart_rx_num;
uart_rx_num=0;
uart_rx_end=1;
}
else
uart_rx_num++;
}
while(FIFO_NE & UARTISR);
}
UARTCR |= TRS_EN;
}
/**
* @函数:波特率设置
* @set:0-默认波特率115200,其他:需根据时钟源和分频计算出set = 时钟(hz)/波特率
* @返回: none
*/
void UART_BrpSet(UINT16 set)
{
UINT16 brp=0;
UINT8 fd=0;
if(0 == set)
{
//uartband@115200bps
fd = SCU->UARTCLKCR & 0x80;
switch(fd)
{
case 0x80:/*外部时钟12M晶振*/
brp = 0x0068;
break;
case 0x00:/*内部时钟*/
brp = 0x00AD;
break;
default:
brp = 0x00AD;
break;
}
fd = SCU->UARTCLKCR & 0x7f ;
brp =brp/(fd+1);
}
else
{
brp = set;
}
UARTBRPH = (UINT8)((brp >> 8) & 0xFF);
UARTBRPL = (UINT8)((brp) & 0xFF);
}
/**
* @函数:初始化
* @返回:none
*/
void UART_Init(void)
{
IOM->CRA |= (1<<0);//使能Uart接口
SCU->MCGR2 |= (1<<3); //使能Uart总线时钟
/******配置Uart时钟(建议使用外部晶振)******/
SCU->SCFGOR |= (1<<6);// 使能外部晶振
SCU->UARTCLKCR |= (1<<7);//使用外部时钟
//SCU->UARTCLKCR &= ~(1<<7);//使用内部OSC时钟
UART_BrpSet(0);//设置波特率为默认115200
UARTISR = 0xFF;//状态寄存器全部清除
UARTCR |= FLUSH; //清除接收fifo
UARTCR = 0;//偶校验
/******配置中断使能******/
UARTIER |= FIFO_NE;
//UARTIER |= FIFO_HF;
//UARTIER |= FIFO_FU;
//UARTIER |= FIFO_OV;
//UARTIER |= TXEND;
//UARTIER |= TRE;
ModuleIrqRegister(Uart_Exception, UART_IrqService);//挂载中断号
}
/**
* @函数:Uart发送一个字节
* @dat: 要发送的数据字节
* @返回:None
*/
void UART_SendByte(UINT8 dat)
{
UARTCR |= TRS_EN;
UARTDR = dat;
do
{
if(UARTISR & TXEND)
{
UARTISR |= TXEND;//清除发送完成标志,写1清除
break;
}
}
while (1);
UARTCR &= (~TRS_EN);
}
/**
* @函数:Uart发送一个字符串
* @str: 要发送的字符串
* @返回:None
*/
void UART_SendString(UINT8 * str)
{
UINT8 *p ;
p=str;
while(*p!=0)
{
UART_SendByte(*p++);
}
}
/**
* @函数:Uart发送某一长度的字符串
* @buf: 要发送的字符串
* @length: 要发送的长度
* @返回:None
*/
void uart_SendString(UINT8 buf[],UINT8 length)
{
UINT8 i=0;
while(length>i)
{
UART_SendByte(buf[i]);
i=i+1;
}
}
/**
* @函数:Uart发送一个十进制整数
* @num: 要发送的整数
* @返回:None
*/
void UART_SendNum(INT32 num)
{
INT32 cnt = num,k;
UINT8 i,j;
if(num<0)
{
UART_SendByte('-');
num=-num;
}
//计算出i为所发数据的位数
for(i=1;; i++)
{
cnt = cnt/10;
if(cnt == 0)
break;
}
//算出最大被除数从高位分离
k = 1;
for(j=0; j<i-1; j++)
{
k = k*10;
}
//分离并发送各个位
cnt = num;
for(j=0; j<i; j++)
{
cnt = num/k;
num = num%k;
UART_SendByte(0x30+cnt);
k /= 10;
}
}
/**
* @函数:Uart发送一个16进制整数
* @dat: 要发送的16进制数
* @返回:None
*/
void UART_SendHex(UINT8 dat)
{
UINT8 ge,shi;
UART_SendByte('0');
UART_SendByte('x');
ge = dat%16;
shi = dat/16;
if(ge>9)
ge+=7;//转换成大写字母
if(shi>9)
shi+=7;
UART_SendByte(0x30+shi);
UART_SendByte(0x30+ge);
UART_SendByte(' ');
}
/**
* @函数:Uart接收一个字节
* @param receive addsress
* @返回:flag
*/
UINT8 UART_GetByte(UINT8 *data)
{
UINT8 ret= 0;
if(0 != (UARTISR & FIFO_NE))
{
*data = UARTDR;
ret = 1;
}
return ret;
}
/**
* @函数:Uart 接收多个字节
* @param receive addsress
* @len:长度
* @返回:none
*/
void UART_Receive(UINT8 *receive, UINT8 len)
{
while(len != 0)
{
if(len >= 4)
{
while (!(UARTISR & FIFO_FU));
*receive++ = UARTDR;
*receive++ = UARTDR;
*receive++ = UARTDR;
*receive++ = UARTDR;
len -= 4;
}
else if(len >= 2)
{
while (!(UARTISR & FIFO_HF));
*receive++ = UARTDR;
*receive++ = UARTDR;
len -= 2;
}
else
{
while (!(UARTISR & FIFO_NE));
*receive++ = UARTDR;
len--;
}
}
}
主函数
UINT8 shuju_lens;
UINT8 shuju[64];
UINT8 uart_rx_num;
UINT8uart_rx_end;
int main(void)
{
/*********************此段代码勿动***********************/
//系统中断向量设置,使能所有中断
SystemInit ();
// 返回boot条件
if(0 == GPIO_GetVal(0))
{
BtApiBack(0x55555555, 0xAAAAAAAA);
}
/*********************此段代码勿动***********************/
UART_Init(); //初始化Uart
UART_SendByte('A');//Uart发送一个字符A
UART_SendByte('\r');
UART_SendByte('\n');//换行
UART_SendString("Welcome to Z32HUA!"); //Uart发送字符串
UART_SendByte('\r');
UART_SendByte('\n');//换行
UART_SendNum(1234567890);//Uart发送一个十进制数
UART_SendByte('\r');
UART_SendByte('\n');//换行
UART_SendHex(0xAA);//Uart发送一个十六进制数
UART_SendByte('\r');
UART_SendByte('\n');//换行
while(1)
{
if(uart_rx_end)
{
uart_rx_end=0;
uart_SendString(shuju,shuju_lens);
}
} //等待接收中断。
}
//延时函数,当系统时钟为内部OSC时钟时,延时1ms
void delay(int ms)
{
int i;
while(ms--)
{
for(i=0; i<950; i++) ;
}
}
代码的执行过程为:
问题:
解决方法:
通过本次实验,我们知道了交叉编译环境以及了解了开发环境的配置,我们知道了如何在Linux中编译程序并将生成的可执行文件在arm超级终端上运行。
在这次实验中,我们通过自己的笔记本电脑打开两个虚拟机主机,也就是提供了虚拟机运行的环境,然后把arm编译工具共享给win7虚拟机,在win7虚拟机下用arm编译工具编译helloword.c文件,将生成的可执行文件在arm超级终端上运行。由于电脑配置的原因,在做实验时,遇到ping不通的情况,而且根据网上大佬的方法进行调整,还是无法实现,就只能换一台电脑重新开始,耗费了我们很多时间,最终下课的时候,第三步只做了一半,没能完成最后步骤,在第二天,借用他们向实验室借的实验箱继续做,最终才把最后一步完成。
2019-2020-1 20175208 20175218 20175230 实验二 固件程序设计
原文:https://www.cnblogs.com/cjy-123/p/11872520.html