39
凌凌凌凌凌凌 www.unsp.com.cn www.sunplus.com.tw SUNPLUS Technology for Easy Living 凌凌凌凌 C 语语语语

电子竞赛 之 C 语言应用

  • Upload
    vala

  • View
    87

  • Download
    5

Embed Size (px)

DESCRIPTION

电子竞赛 之 C 语言应用. 这个 ppt 的重点在于讲述如何使用 C 语言来对 SPCE061A 单片机进行编程。 希望这个 ppt 对同学们有所帮助。. 前言. 凌阳 C 语言简介 凌阳 C 语言基础 C 和汇编混合编程 用 C 来直接控制硬件. 目录. 凌阳 C 语言简介. 寄存器分配、数据类型等由编译器管理。 编程及调试的时间减少,大大缩短开发周期。 明显增加软件可读性,便于改进和扩充。. 用 C 语言编程的优点. IDE 直接提供了 C 语言的开发环境, C 函数和汇编函数可以方便地进行相互调用。 Software Libraries - PowerPoint PPT Presentation

Citation preview

Page 1: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

电子竞赛之

C 语言应用

Page 2: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

前言

这个 ppt 的重点在于讲述如何使用 C 语言来对 SPCE061A 单片机进行编程。

希望这个 ppt 对同学们有所帮助。

Page 3: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

目录 凌阳 C 语言简介

凌阳 C 语言基础

C 和汇编混合编程

用 C 来直接控制硬件

Page 4: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

凌阳 C 语言简介

Page 5: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 语言编程的优点

寄存器分配、数据类型等由编译器管理。

编程及调试的时间减少,大大缩短开发周期。

明显增加软件可读性,便于改进和扩充。

Page 6: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 语言可以很方便地对SPCE061A 进行编程

IDE 直接提供了 C 语言的开发环境, C 函数和汇编函数可以方便地进行相互调用。

Software LibrariesStandard C libraryHardware librarySACM ( Sunplus audio coding method)

Page 7: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

凌阳 C 语言基础

Page 8: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

unSP GCC 认可的基本数据类型及其值域

数据类型 数据长度 (bit) 值域char 16 -32768~32767

short,int 16 -32768~32767long 32 -2147483648~2147483647

unsigned char 16 0~65535unsigned short

unsigned int 16 0~65535 unsigned long 32 0~4294967295

float,double 32 以 IEEE 格式表示的 32 位浮点数

Page 9: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

数据类型应该注意的地方

char 和 unsigned char 为 16 位这与一般机器使用的 GCC 数据类型之间

有一些差别。

float 与 double 均存储为 32 位浮点数unSP 汇编的 float 与 double 分别是 32 位

与 64 位浮点数。

Page 10: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

关于变量的 signed 和 unsigned

如果使用 signed 和 unsigned 两种数据类型,将使存储空间成倍增长。

因为使用 signed 和 unsigned 两种数据类型的库函数是不同的,使用 signed 和 unsigned ,就得同时使用这两种格式类型的库函数,

最好采用 unsigned 格式。在编程时,如果只强调程序的运算速度

而又不进行负数运算时,最好采用 unsigned 格式。

Page 11: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

关于实参求值顺序

unSP IDE 和 Turbo C 一样,实参的求值顺序是从右到左的,如下例:

i=3;printf("%d,%d",i,i++); 

输出  4,3

Page 12: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

一个例子

Page 13: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

C 和汇编混合编程

Page 14: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

混合编程的三个方面

C 调用汇编函数

汇编调用 C 函数

C 中嵌入在线汇编

Page 15: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

C 调用汇编函数 要求汇编函数名也以下划线“ _” 为前缀

因为 C 编译器产生的所有标号都以下划线“ _” 为前缀。

在进行参数传递时,参数以相反的顺序(从右到左)被压入栈中。

汇编函数的 16 位返回值存放在寄存器 R1 中。32 位的返回值存入寄存器对 R1 、 R2 中;其中低字在 R1 中,高字在 R2 中。

Page 16: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

C 调用汇编的小例子extern int ADD();

int main(void)

{

int i,j,SUM;

i=2;

j=3;

SUM=ADD(i,j);

return 0;

}

.CODE

.PUBLIC _ADD

_ADD:.PROC

PUSH BP TO [SP];

BP = SP + 1;

R1 = [BP+3]; // 取得第一个参数R2 = [BP+4]; // 取得第二个参数R1 += R2;

POP BP FROM [SP];

RETF;

.ENDP

Page 17: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

汇编调用 C 小例子EXTERNAL _ADD;

.RAM

.VAR SUM

.CODE

.PUBLIC _main;

_main:

R1 = 3;

PUSH R1 TO [SP]; // 第 2 个参数 // 入栈R1 = 2;

PUSH R1 TO [SP]; // 第 1 个参数 // 入栈CALL _ADD;

[SUM]=R1;

SP+=2; // 恢复 SP 指针.END

C 函数:int ADD(int i,int j){

i=i+j;

return i;}

Page 18: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

C 中嵌入在线汇编

在线汇编指令格式:asm (“汇编指令模板”:输出参数:输入参数 )

Page 19: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

利用嵌入式汇编写端口寄存器 在 C 对 P_IOA_Dir 赋值 0x1234 ,则嵌入

汇编的实现方式如下:

asm(“.define P_IOA_Dir 0x7002”);

int main(void)

{

asm("[P_IOA_Dir] = %0" : : "r"(0x1234));

}

Page 20: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

利用嵌入式汇编读端口寄存器 把 P_IOA_Dir 的值读出并保存在 C 中的一个

int 变量 j 里 ,则嵌入汇编的方式如下:

asm(“.define P_IOA_Dir 0x7002”);

int main(void)

{

int j;

asm("%0 = [P_IOA_Dir]" : "=r"(j));

}

Page 21: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 来直接控制硬件

Page 22: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

使用纯 C 对寄存器进行操作

#define P_IOA_Dir (volatile unsigned int *)0x7002

int main(void)

{

int j;

* P_IOA_Dir=0x1234;

j= * P_IOA_Dir;

}

Page 23: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行 IO 设置 // 设置 A 口为带下拉电阻的输入 *P_IOA_Dir = 0;

*P_IOA_Attrib = 0;

*P_IOA_Data = 0;

  // 设置 B 口为同相低电平输出 *P_IOA_Dir = 0xffff;

*P_IOB_Attrib = 0xffff;

*P_IOB_Data = 0;

Page 24: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置

#define P_SystemClock (volatile unsigned int *)0x7013

*P_SystemClock = System_Information

System Information = CPU Clock + 32K Mode + 32K Status + Fosc

PLL频率 睡眠状态 32K方式 CPUclk选择

b15~b8 b7~b5 b4 b3 b2~b0

Page 25: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 CPU Clock 的取值可以是以下几种: C_Fosc FoscC_Fosc_Div_2 Fosc/2C_Fosc_Div_4 Fosc/4C_Fosc_Div_8 Fosc/8 (默认值 )C_Fosc_Div_16 Fosc/16C_Fosc_Div_32 Fosc/32C_Fosc_Div_64 Fosc/64C_Sleep Stop (睡眠 )

Page 26: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 32K Hz Mode 的取值可以是以下几种:C_StrongMode 强振模式C_AutoMode 弱振模式 ( 默认

值 )

32K Hz Sleep Status 的取值可以是以下几种:C_32K_Work 睡眠时 ,32K 时钟仍工作 ( 默

认 )C_32K_Off 睡眠时 ,32K时钟停止工作

Page 27: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 Fosc 的取值可以是以下几种:C_Fosc_24M 24.576M (默认值 )C_Fosc_20M 20.480MC_Fosc_32M 32.768MC_Fosc_40M 40.960MC_Fosc_49M 49.152M

Page 28: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 这个例子是进行系统时钟设置。读者可以选择

不同的 Fosc_CLK 和 CPU_CLK ,观察发光二极管亮灭快慢。

硬件连接: A 口低八位接八个共阳的发光二极管

现象:根据 Fosc_CLK 和 CPU_CLK 的不同,观察发光二极管亮灭速度也不同

Page 29: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 程序代码#include "SPCE061V004.H"

void Delay();

#define Fosc_CLK_RATE C_Fosc_49M; //Fosc

#define CPU_CLK_RATE C_Fosc_Div_2; //CPUClk

Page 30: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 main()

{

unsigned int Fosc_CLK,CPU_CLK;

*P_IOA_Dir = 0x00FF; // IOA: [7..0] output

*P_IOA_Attrib = 0x00FF;

*P_IOA_Data = 0;

Page 31: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 Fosc_CLK = Fosc_CLK_RATE;

CPU_CLK = CPU_CLK_RATE;

*P_SystemClock = Fosc_CLK|CPU_CLK;

Page 32: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 进行系统时钟设置 while(1)

{

*P_IOA_Data = 0x00FF; //LED off

Delay();

*P_IOA_Data = 0; //LED on

Delay();

}

}

Page 33: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 写中断程序在 IDE162 下,中断服务程序只能用汇编(包括嵌入式汇编)来写。

在 IDE180 下,用户多了一种选择,那就是可以用 C 来写中断。

Page 34: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 写中断程序C ASM 功能

INT_OFF() int off 禁止所有中断INT_IRQ() int irq 仅允许 irq 中断INT_FIQ() int fiq 仅允许 fiq 中断INT_FIQ_IRQ() int fiq,irq 允许 fiq 和 irq 中断IRQ_OFF() irq off 禁止 irq 中断IRQ_ON() irq on 允许 irq 中断FIQ_OFF() fiq off 禁止 fiq 中断FIQ_ON() fiq on 允许 fiq 中断

Page 35: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 写中断程序 要求:定时 0.5s ,使 A 口的 8 个二极管闪烁。

分析:定时 0.5s 采用哪个时基信号比较方便呢?SPCE061A 单 片 机 时 基信号频率丰富, 有2Hz 、 4Hz 、 8Hz 、 16Hz 、 32Hz 、 64Hz 、128Hz 、 256Hz 、 512Hz 、 1024H 、 2048Hz、 4096Hz 等多种频率。我们可以很明显的看出 2Hz 时基信号中断是最方便的。只要触发2Hz 的时基信号中断,就可以达到 0.5s 的定时目的。

Page 36: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 写中断程序#include“SPCE061V004.H”#include“unSPMACRO.h”main(){

INT_OFF();*P_IOA_Dir=0x00FF; *P_IOA_Attrib=0x00FF;*P_IOA_Data=0x0000;*P_INT_Ctrl=C_IRQ5_2Hz;//Setup interrupt

  INT_IRQ();  while(1) *P_Watchdog_Clear = C_WDTCLR;}

Page 37: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

用 C 写中断程序#include"SPCE061V004.H"unsigned int g_uiOutput=0x0000;void IRQ5(void) __attribute__ ((ISR));void IRQ5(void){

if(*P_INT_Ctrl&C_IRQ5_2Hz){ //IRQ5_2Hz

*P_IOA_Data=g_uiOutput;g_uiOutput^= 0xffff;*P_INT_Clear=C_IRQ5_2Hz;

}}

Page 38: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

结语 从前面的例子可以看出,对硬件的设置和操作

都是通过往硬件寄存器的地址里写入或读出数据实现的。

其它设置,如AD 、 DA 、 Timer 、 UART 、 SIO 等,都只是对相应的硬件寄存器进行操作而已,不再举例。

欲了解更多关于用 C 对 SPCE061A 进行编程的信息,请到凌阳大学计划网站(www.unsp.com.cn) 下载《 C 语言在凌阳十六位单片机中的应用》。

Page 39: 电子竞赛 之 C 语言应用

凌阳大学计划www.unsp.com.cn

www.sunplus.com.twSUNPLUSTechnology for Easy Living

谢谢大家