上海交大嵌入式ARM代码总结.docx_第1页
上海交大嵌入式ARM代码总结.docx_第2页
上海交大嵌入式ARM代码总结.docx_第3页
上海交大嵌入式ARM代码总结.docx_第4页
上海交大嵌入式ARM代码总结.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式 代码总结 全当为人民服务啦来源:李云翔的日志GPIO实验1-1简单说就是用几个寄存器来控制硬件,特别注意GPIOFDATA实验1-2就是用HWREG(X)代替前面的寄存器而已。即所谓的 底层驱动库操作GPIO实验。实验1-3用了一个Luminary驱动库,个人认为是这个公司搞的库函数吧。后面的实验基本用的这个方法。实验1-4教咱怎么配置GPIO口,主要是一下5个函数SysCtlPeripheralEnable 使能端口GPIOPinTypeGPIOOutput 配置管脚用做GPIO输出GPIOPinWrite 向指定管脚写入一个值,开关灯就靠这个。GPIOPinTypeGPIOInput 设置五向键用的,设置为输入模式GPIOPinRead 读取五向键的状态,记住按下为0.思考题按两下电灯的代码: 见附录1.SysCtl实验2注意要点:1,实现time函数,是四个始终周期减一次。2,SysCtlDelay(TheSysClock/3);是1秒。其他时间在这上面去乘系数即可。3,GPIO放到GPIODriverconfigure里面去了。增加了开灯,关灯,翻转,按键读取函数。记住KeyPress(KeyNum) 函数。功能的实现就是用它来判断哪个键按下。SysTick&Timer实验3-1SysTickPeriodSet(TheSysClock) 参数的最大值为24位,大概是16M多。切记PLL时,别乱放。实验3-2没什么好说的。如果要预分频,(最多8位预分频,即256分频)用到: TimerPrescaleSet(TIMER0_BASE,TIMER_A,10); /(10分频)中断中断博大精深,概括起来为以下5点(摘自蓝皮书P46)使能相关片内外设-设置具体中断的类型和触发方式-三层中断使能-编写中断服务程序(主要编程区域)-注册看门狗后面的函数其实都没有WatchDogInitial (); 所以没有相应的操作。如果要用,在main初始化一下,然后在相应地方,适当的时候WatchDogFeed(); 喂喂它就可以了。UART几个C文件的功能笔记:GPIOISR:用GPIO中断实现四个模式的选择,通过改变一个记录模式的变量来实现。例子:void GPIO_Port_E_ISR(void) unsigned long ulStatus; ulStatus=GPIOPinIntStatus(GPIO_PORTE_BASE,true); GPIOPinIntClear(GPIO_PORTE_BASE,ulStatus); if (ulStatus & GPIO_PIN_4) TranscodingStatus=3; /小写转大写,大写转小写 LEDOn(LED_ALL); SysTickISR:一秒钟中断一次,用来换行 UARTCharPut(UART0_BASE,r); 光标回到当前行的最左边 UARTCharPut(UART0_BASE,n); 换到下一行Main:字符转换,发送字符。I2C之LED灯基本填写代码:GPIODriverConfigure: GPIOPinTypeGPIOInput(I2C0_PIN_BASE,I2C0SCL_PIN|I2C0SDA_PIN); /设置I2C0用到的两个引脚为GPIO输入模式 GPIOPadConfigSet(I2C0_PIN_BASE,I2C0SCL_PIN|2C0SDA_PIN,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPD);/并设置上述两引脚为弱下拉推挽模式,驱动电流8MAI2CConfigure:SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); /SysCtl使能I2C0模块I2CMasterInit(I2C0_MASTER_BASE, false); /设置I2C0主机模块传输速率为100kbps(普通模式)I2CMasterEnable(I2C0_MASTER_BASE); /使能I2C主机模块I2CMasterSlaveAddrSet(ulBase,ucSla,false); /设置I2C主机模块的从机地址,并设置传输方式为主机写数据至从机I2CMasterDataPut(ulBase,ucAddr); /设置目标从机子地址I2CMasterControl(ulBase,I2C_MASTER_CMD_BURST_SEND_START);/控制主机作出一次突发发送起始动作I2CMasterDataPut(ulBase,ucData);/从主机发送一个数据到从机I2CMasterControl(ulBase,I2C_MASTER_CMD_BURST_SEND_FINISH);/控制主机作出一次突发发送完成动作注意这个函数:unsigned char I2CMasterTransmit_Burst_2Bytes (unsigned long ulBase, /发送完成后才会退出 unsigned char ucSla, /从机地址 unsigned char ucAddr, /从机子地址 unsigned char ucData) /传送的1个数据位例子:I2CMasterTransmit_Burst_2Bytes(I2C0_MASTER_BASE,LED_I2CADDR,PCA9557_REG_OUTPUT,LEDSerial); / LEDSerial=0x010x020x040x80 ;0x01是全灭,然后依次从上往下注意跳帽。注意这个变量:KeyNumber 0-None 1-Press 2-Left 3-Right 4-Up 5-DownI2C之米字管GPIODriverConfigure:同上I2CConfigure:SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); /SysCtl使能I2C0模块I2CMasterInit(I2C0_MASTER_BASE, true);/设置I2C0主机模块传输速率为400kbps(高速模式)I2CMasterEnable(I2C0_MASTER_BASE);/使能I2C主机模块I2CMasterIntEnable(I2C0_MASTER_BASE); /使能I2C主机模块中断NixieTubeConfigure:switch (NixieTubeSlice) case 0: NixieTubeSegment=0x20; break; /选择左数第1根米字管 case 1: NixieTubeSegment=0x02; break; /选择左数第2根米字管 case 2: NixieTubeSegment=0x04; break; /选择左数第3根米字管 case 3: NixieTubeSegment=0x08; break; /选择左数第4根米字管 case 4: NixieTubeSegment=0x10; break; /选择第5根特殊米字管 default: NixieTubeSegment=0x20; break;I2CISR: ulStatus=I2CMasterIntStatus(I2C0_MASTER_BASE,true);/读取I2C0主机的中断状态 I2CMasterIntClear(I2C0_MASTER_BASE);/清除I2C0主机的中断状态 if(I2CMasterErr(I2C0_MASTER_BASE)!=I2C_MASTER_ERR_NONE)/检测I2C0主机传输是否遇到故障,若遇到,则立即退出中断服务函数 I2C0TransmitionState=0; return; Main:sprintf(NixieTube,%04u:,0 ); /米字冠输出00:00sprintf(NixieTube,%04u:, SetMinute*100+SetSecond);/米字管输出设置时间sprintf(NixieTube,%04u:,CounterMinute*100+CounterSecond ); /米字冠输出计时时间需要说明的是这个函数时把相应字符,以特定格式存在第一个参数中,所以要改米字管,用这个函数就解决了!PWMGPIODriverConfigure:有变化:(不需要自己填的部分)GPIOPinConfigure(GPIO_PF3_PWM5);GPIOPinTypePWM(LED0_BASE, LED0_PIN); /Set LED0PWMConfigure:SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /SysCtl使能PWM模块SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /SysCtl中设置PWM时钟预分频为1分频PWMGenConfigure(PWM_BASE,PWM_GEN_2, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); /配置PWM发生器为递减技术模式,异步更新 /注意:使用的PWM发生器的号码与输出PWM的引脚有关PWMGenPeriodSet(PWM_BASE,PWM_GEN_2,BreathingLEDPeriod); /设置PWM发生器的周期为BreathingLEDPeriodPWMPulseWidthSet(PWM_BASE,PWM_OUT_5,BreathingLEDPeriod);/设置初始PWM输出宽度PWMOutputState(PWM_BASE,PWM_OUT_5_BIT,true); /使能PWM输出PWMGenEnable(PWM_BASE,PWM_GEN_2); /使能PWM发生器SysTickISR:/实现呼吸灯 /SysTick中断每4ms执行一次 /每执行一次少量改变PWM的占空比 /实现LED灯慢慢变亮再慢慢变暗的效果 switch (BreathingLEDPWM) case 1: BreathingLEDFlag=0; break; case BreathingLEDPeriod/2: if (BreathingLEDFlag) LEDOn(LED_1); else LEDOff(LED_1); break; case BreathingLEDPeriod: BreathingLEDFlag=1; break; default: break; if (BreathingLEDFlag) BreathingLEDPWM-; /递减BreathingLEDPWM else BreathingLEDPWM+; /递增BreathingLEDPWM PWMPulseWidthSet(PWM_BASE,PWM_OUT_5,BreathingLEDPWM); /更改PWM波8-2PWMConfigureSysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /SysCtl使能PWM模块 SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /SysCtl中设置PWM时钟预分频为1分频 PWMGenConfigure(PWM_BASE,PWM_GEN_2,PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC); /配置PWM发生器为递减技术模式,异步更新 /注意:使用的PWM发生器的号码与输出PWM的引脚有关 PWMGenPeriodSet(PWM_BASE,PWM_GEN_2,START_SOUND_PERIOD);/设置PWM发生器的周期为START_SOUND_PERIOD PWMPulseWidthSet(PWM_BASE,PWM_OUT_5,START_SOUND_PERIOD/2); /设置初始占空比为50% PWMOutputState(PWM_BASE,PWM_OUT_5_BIT,true); /使能PWM输出 PWMGenEnable(PWM_BASE,PWM_GEN_2); /使能PWM发生器 SysCtlDelay(TheSysClock/15); /延时200ms PWMGenDisable(PWM_BASE,PWM_GEN_2); /关闭PWM输出或PWM发生器/*/void BuzzerBeep(unsigned long ulPeriod,unsigned long ulTime) PWMGenPeriodSet(PWM_BASE,PWM_GEN_2,ulPeriod); /设置PWM发生器的周期为输入变量ulPeriod PWMPulseWidthSet(PWM_BASE,PWM_GEN_2,ulPeriod/2); /设置占空比为50% TimerLoadSet(TIMER1_BASE,TIMER_A,ulTime); /设置TIMER1A的定时数为ulTime(该TIMER用于定时关闭蜂鸣器) /PWMOutputState(PWM_BASE,PWM_OUT_5_BIT,true); /使能PWM输出(删掉看看可不可以) PWMGenEnable(PWM_BASE,PWM_GEN_2); /使能PWM发生器和PWM输出 ? TimerEnable(TIMER1_BASE,TIMER_A); /使能TIMER1A/*/MAIN:函数里三个常量要记住:就是蜂鸣器的音调。START_SOUND_PERIODALARM_SOUND_PERIODSET_SOUND_PERIOD例子:BuzzerBeep(SET_SOUND_PERIOD,TheSysClock/6);/使用BuzzerBeep函数发出短时设置音TimerConfigure:void TimerInitial(void) SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); /TIMER0使能 TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER); /设置为32位周期定时器 TimerLoadSet(TIMER0_BASE,TIMER_A,(TheSysClock); /TIMER0A装载计数值 TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT); /使能Timer0A超时中断 IntEnable(INT_TIMER0A); /开启TIMER0A中断源 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);/*Completetheode!* */ TimerConfigure(TIMER1_BASE,TIMER_CFG_32_BIT_OS); /设置TIMER1为32位单次触发定时器/*/ TimerLoadSet(TIMER1_BASE,TIMER_A,(TheSysClock/5); TimerIntEnable(TIMER1_BASE,TIMER_TIMA_TIMEOUT); IntEnable(INT_TIMER1A);LCDLCDConfigure:static voidLCDWriteData(unsigned short usData)/*Complete the Code*/ SET_LCD_DATA(usData8); /将待写入数据的高8位送到总线(通过移位获取高位) HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0 ;/拉低写使能信号WR HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/为满足写入操作的时序要求,需要将WR重复拉低两次以延时 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = LCD_WR_PIN;/拉高写使能信号WR SET_LCD_DATA(usData); /将待写入数据的低8位送到总线 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/拉低写使能信号WR HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/为满足写入操作的时序要求,需要将WR重复拉低两次 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = LCD_WR_PIN;/拉高写使能信号WR/*/static voidLCDWriteCommand(unsigned char ucData)/*Complete the Code*/ SET_LCD_DATA(0); /将待写入命令的高位送到总线 /一般指令的高8位都是0 HWREG(LCD_DC_BASE + GPIO_O_DATA + (LCD_DC_PIN2) = 0;/拉低DC HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/拉低WR HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/重复上一步 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = LCD_WR_PIN;/拉高WR SET_LCD_DATA(ucData); /将待写入命令的低8位送到总线 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/拉低WR HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = 0;/重复上一步 HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN2) = LCD_WR_PIN;/拉高WR HWREG(LCD_DC_BASE + GPIO_O_DATA + (LCD_DC_PIN2) = LCD_DC_PIN;/拉高DC/*/Main:#include #include HardwareLibrary.h#include LuminaryDriverLibrary.h#include grlib/grlib.h /图形库#include GPIODriverConfigure.h#include SysCtlConfigure.h#include SysTickConfigure.h#include TimerConfigure.h#include WatchDogConfigure.h#include UARTConfigure.h#include I2CConfigure.h#include NixieTubeConfigure.h#include PWMConfigure.h#include LCDConfigure.h /LCD驱动库#include LCDDisplay.h /系统信息显示double X=0;char tMessage40;tContext sContext;tRectangle sRect=0,39,319,239; /搞定了一个特定区域 (整个屏幕320*240)extern char receivemessage10;unsigned char SystemState=0; /0-Normal 1-I2C Defaultvolatile unsigned char SystemActivatedFlag=false; /其功能待定?extern volatile unsigned char KeyNumber; /0-None 1-Press 2-Left 3-Right 4-Up 5-Downextern volatile unsigned char KeyNumberPresent; /these two variable is aimed at dealing with the 消抖,个人理解。extern volatile unsigned char KeyHoldFlag;extern volatile unsigned char LCDDrawingFlag_Running; /these two variable deal with 判断是否处于计时状态,还是设置状态。extern volatile unsigned char LCDDrawingFlag_Pause;volatile unsigned char SetFlag=0; /0-时钟模式 1-设置模式 SetFlagvolatile unsigned char SetBitFlag=0; /0-设置秒 1-设置分 SetBitFlagvolatile unsigned char CounterSecond=0;volatile unsigned char CounterMinute=0;volatile unsigned char SetSecond=59;volatile unsigned char SetMinute=59;int main(void) /主函数 ClockInitial(); GPIOInitial(); SysTickInitial(); TimerInitial(); UART0Initial(); GrContextInit(&sContext, &g_sKitronix320x240x16_SSD2119); LCDInitial(); /在这个函数里,大牛都搞定了,咱不需要去“填空” PWMInitial(); /这个函数实现两个功能,一:初始化PWM,包括使能等。二:给了一个蜂鸣器函数。 PWM与蜂鸣器的链接在GPIO SystemState |= I2C0PullUpTest(); if (!(SystemState & 0x01) I2C0MasterInitial(); sprintf(NixieTube,CTM3 ); SysTickEnable(); IntMasterEnable(); LCDSystemCheckInformationDisplay(SystemState); /LCD 写初始化信息 UARTSystemCheckInformationTransmit(UART0_BASE,SystemState); /UART 写初始化信息 LEDOn(LED_1); while (KeyNumber=0); KeyNumber=0; LEDOff(LED_1); UARTStringPut(UART0_BASE,System activated!rn);/*Complete the code!* */可根据LCDDisplay.c中的例子进行配置 GrContextForegroundSet(&sContext,ClrBlack); /选择黑色 GrRectFill(&sContext,&sRect); /用上面选择的颜色填充sRect这个区域 GrContextForegroundSet(&sContext,ClrGreen); /选择绿色 /以下这三个函数!嘻嘻,一定要记住 GrContextFontSet(&sContext,&g_sFontCmss18i); /设置字符字体:Cm 18号 粗体, GrStringDrawCentered(&sContext,Running!,-1,160,139,0); /在屏幕正中显示“Running”/*/*Complete the code!* */ sprintf(NixieTube,0000 ); /米字冠输出00:00/*/ LEDOn(LED_1); TimerEnable(TIMER0_BASE,TIMER_A);/*Complete the code!* */ BuzzerBeep();/使用BuzzerBeep函数发出短时报警音/*/ SystemActivatedFlag=true; while(1) if (LCDDrawingFlag_Running) /如果在Running 状态 在systick中通过按键检查,是否有press等,来更改其值, /*Complete the code!* */ GrContextForegroundSet(&sContext,ClrGreen); /设置字符颜色 GrContextFontSet(&sContext,&g_sFontCmss18i); /设置字符字体 GrStringDrawCentered(&sContext,Running!,-1,160,139,1); /在屏幕正中显示“Running”/*/ LCDDrawingFlag_Running=false; if (LCDDrawingFlag_Pause) /*Complete the code!* */ GrContextForegroundSet(&sContext,ClrRed); /设置字符颜色 GrStringDrawCentered(&sContext, Pause!,-1,160,139,1); /在屏幕正中显示字符“Pause”,并遮盖掉字符“Running”/*/ LCDDrawingFlag_Pause=false; /*my code!* */ GrContextForegroundSet(&sContext,ClrGold); /设置字符颜色 GrContextFontSet(&sContext,&g_sFontCmss18i); /设置字符字体 GrStringDraw(&sContext, receivemessage ,-1,160,210,0); /这个函数画了一条线,一个圆 GrContextForegroundSet(&sContext,ClrGold); /设置颜色 GrLineDraw(&sContext,10,10,200,200) ; GrCircleDraw(&sContext,160,120,20) ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论