电子竞赛 之 c 语言应用
DESCRIPTION
电子竞赛 之 C 语言应用. 这个 ppt 的重点在于讲述如何使用 C 语言来对 SPCE061A 单片机进行编程。 希望这个 ppt 对同学们有所帮助。. 前言. 凌阳 C 语言简介 凌阳 C 语言基础 C 和汇编混合编程 用 C 来直接控制硬件. 目录. 凌阳 C 语言简介. 寄存器分配、数据类型等由编译器管理。 编程及调试的时间减少,大大缩短开发周期。 明显增加软件可读性,便于改进和扩充。. 用 C 语言编程的优点. IDE 直接提供了 C 语言的开发环境, C 函数和汇编函数可以方便地进行相互调用。 Software Libraries - PowerPoint PPT PresentationTRANSCRIPT
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
电子竞赛之
C 语言应用
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
前言
这个 ppt 的重点在于讲述如何使用 C 语言来对 SPCE061A 单片机进行编程。
希望这个 ppt 对同学们有所帮助。
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
目录 凌阳 C 语言简介
凌阳 C 语言基础
C 和汇编混合编程
用 C 来直接控制硬件
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
凌阳 C 语言简介
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
用 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)
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
凌阳 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 位浮点数
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
数据类型应该注意的地方
char 和 unsigned char 为 16 位这与一般机器使用的 GCC 数据类型之间
有一些差别。
float 与 double 均存储为 32 位浮点数unSP 汇编的 float 与 double 分别是 32 位
与 64 位浮点数。
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
关于变量的 signed 和 unsigned
如果使用 signed 和 unsigned 两种数据类型,将使存储空间成倍增长。
因为使用 signed 和 unsigned 两种数据类型的库函数是不同的,使用 signed 和 unsigned ,就得同时使用这两种格式类型的库函数,
最好采用 unsigned 格式。在编程时,如果只强调程序的运算速度
而又不进行负数运算时,最好采用 unsigned 格式。
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
关于实参求值顺序
unSP IDE 和 Turbo C 一样,实参的求值顺序是从右到左的,如下例:
i=3;printf("%d,%d",i,i++);
输出 4,3
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
一个例子
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
C 和汇编混合编程
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
混合编程的三个方面
C 调用汇编函数
汇编调用 C 函数
C 中嵌入在线汇编
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
C 调用汇编函数 要求汇编函数名也以下划线“ _” 为前缀
因为 C 编译器产生的所有标号都以下划线“ _” 为前缀。
在进行参数传递时,参数以相反的顺序(从右到左)被压入栈中。
汇编函数的 16 位返回值存放在寄存器 R1 中。32 位的返回值存入寄存器对 R1 、 R2 中;其中低字在 R1 中,高字在 R2 中。
凌阳大学计划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
凌阳大学计划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;}
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
C 中嵌入在线汇编
在线汇编指令格式:asm (“汇编指令模板”:输出参数:输入参数 )
凌阳大学计划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));
}
凌阳大学计划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));
}
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
用 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;
}
凌阳大学计划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;
凌阳大学计划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
凌阳大学计划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 (睡眠 )
凌阳大学计划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时钟停止工作
凌阳大学计划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
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
用 C 进行系统时钟设置 这个例子是进行系统时钟设置。读者可以选择
不同的 Fosc_CLK 和 CPU_CLK ,观察发光二极管亮灭快慢。
硬件连接: A 口低八位接八个共阳的发光二极管
现象:根据 Fosc_CLK 和 CPU_CLK 的不同,观察发光二极管亮灭速度也不同
凌阳大学计划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
凌阳大学计划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;
凌阳大学计划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;
凌阳大学计划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();
}
}
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
用 C 写中断程序在 IDE162 下,中断服务程序只能用汇编(包括嵌入式汇编)来写。
在 IDE180 下,用户多了一种选择,那就是可以用 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 中断
凌阳大学计划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 的定时目的。
凌阳大学计划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;}
凌阳大学计划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;
}}
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
结语 从前面的例子可以看出,对硬件的设置和操作
都是通过往硬件寄存器的地址里写入或读出数据实现的。
其它设置,如AD 、 DA 、 Timer 、 UART 、 SIO 等,都只是对相应的硬件寄存器进行操作而已,不再举例。
欲了解更多关于用 C 对 SPCE061A 进行编程的信息,请到凌阳大学计划网站(www.unsp.com.cn) 下载《 C 语言在凌阳十六位单片机中的应用》。
凌阳大学计划www.unsp.com.cn
www.sunplus.com.twSUNPLUSTechnology for Easy Living
谢谢大家