从一个小程序详解codewarrior for MC68HC908GP32CP C语言指针

本文通过分析一个基于codewarrior的C语言小程序,探讨了byte指针、内存定位以及宏定义在单片机编程中的应用。重点讲解了如何使用byte、指针、宏定义将值存入特定内存单元,并揭示了程序无限循环执行的特性及其与看门狗的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <hidef.h>
#include <MC68HC908GP32.h>

/* 在codewarrior中建立了C语言的程序之后程序自动引入头文件MC68HC908GP32.h在这个头文件中定义了
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];
如果足够用,建议使用byte而不是int,因为它只占用一个字节,在单片机中内存是稀缺资源,非常宝贵*/

byte a @ 0x0050;         // 定义unsigned char放在50单元,这种定义方式只能用于
                         // 全局变量。

byte *p @ 0x0051;        // 定义一个指针放在0x0051单元,指向一个unsigned char,
                         // 究竟指向什么地址还没有定义。注意!这里非常重要的是,
                         // 虽然byte(unsigned char)只有一个字节,但是这个指针却
                         // 是两个字节的,也就是说在0x0051和0x0052分别存放了这
                         // 个指针的高、低字节。

byte b @ 0x0060;         // 定义一个变量放在60单元

#define c (*(volatile byte*)0x0058)   // 另一种为变量指定地址的方式:宏定义
                                      // 不要为这种复杂的写法感到困惑或者烦躁,
                                      // 它也可以分解成几个很简单的部分来看:
                                      // (volatile byte*)是C语言中的牵制类型转换
                                      // 它的作用是把0x0058这个纯粹的十六进制数
                                      // 转换成为一个地址,其中volatile并不是必要
                                      // 的,它只是告诉编译器,这个值与外环境有关,
                                      // 不要对它优化。这里也没有必要对编译器的具
                       &n

AD模块的飞思卡尔调试程序全部文件: #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ int i; unsigned char RX_ID[4],RX_DS[8]; unsigned int r[8]; unsigned int temp[2],s; void setbusclock(void) { CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR=0x01; // VCOFRQ[7:6];SYNDIV[5:0] // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) // fPLL= fVCO/(2 × POSTDIV) // fBUS= fPLL/2 // VCOCLK Frequency Ranges VCOFRQ[7:6] // 32MHz <= fVCO <= 48MHz 00 // 48MHz < fVCO <= 80MHz 01 // Reserved 10 // 80MHz < fVCO <= 120MHz 11 REFDV=0x01; // REFFRQ[7:6];REFDIV[5:0] // fREF=fOSC/(REFDIV + 1) // REFCLK Frequency Ranges REFFRQ[7:6] // 1MHz <= fREF <= 2MHz 00 // 2MHz < fREF <= 6MHz 01 // 6MHz < fREF <= 12MHz 10 // fREF > 12MHz 11 // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz; POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV) // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one). _asm(nop); // BUS CLOCK=16M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system 分频; } //[设置总线时钟频率为16MHZ] ; // void ATDInit(void) { ATD0CTL2=0x42; // ATD启动,禁止外部触发,允许ATD中断; ATD0CTL3=0x88; // 背景调试模式下继续转换,每1次转换一个转换序列,继续转换; ATD0CTL4=0x01; // 采样时间为 2个时钟周期,转化按10位进行,总分频系数为8; ATD0CTL5=0x20; // 数据右对齐,无符号,单通道采集, } //[AD进行初始化];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值