基础例程1外设zlg902x demo kit使用手册_第1页
基础例程1外设zlg902x demo kit使用手册_第2页
基础例程1外设zlg902x demo kit使用手册_第3页
基础例程1外设zlg902x demo kit使用手册_第4页
基础例程1外设zlg902x demo kit使用手册_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

ZLG902xDemo Date:摘要目概 配套例程常用设置说 实验例程指 例程代码分 dma_uart0例 免责.................................................................................................................I2C、SPI、ADC、DMA、RTC、sleep等常用外设的驱动例程说明,旨在帮助客户快速的对ZLG902xDemoKit开发套件进行了解,加快开发进度。为了方便用户进行不同的测试,ZLG902xDemoKit开发套件上的资源需要通过短ZLG9021P0-1模块连接,具体的设置详见《ZLG902xDemoKit硬件使用手册》。Stack_Size为栈大小,Heap_Size为堆大小,用户可根据需求修改。如将程序的栈大小设置为512Byte,堆大小设置为0Byte,操作如图2.1所示。2.1Keil打开例程,找到对应工程,如gpiogpio\src\link\iar,然后找到一个icf文件并用记事本打开,如:qn9020_link.icfSTACK_SIZEHEAP_SIZE根据需512Byte0Byte,具体操作如图2.22.2IAR工程后,点击图标,打开工程属性界面,点击“User”图标,在出现界面中勾选Build/RebuildRun#1UserCommand栏目输入命令行,如程序2.1所示。程序2.1命令格在命令行输入时需要保持*.axf文件的名称与工程配置【输出】选项卡设置的文件名称一致,具体操作如图2.3所示。2.3Keilbin2.4IAR \Debug\Exe文件夹下找到生成的bin文件。2.5IARbin-> 以选择XTAL_16MHz( ExtrenalSystemclockAHBclockAPBclockBLEclockTIMERclockUARTandSPIclock程序2.3附属模块时钟设 syscon_set_sysclk_src(CLK_XTAL, #ifXTAL==clk32k_enable(32K_TYPE);#ifQN_32K_RCO程序2.4复位所有外设模|||||||||||| 程序2.5配置系统和外设模块时syscon_set_sysclk_src(CLK_XTAL,syscon_set_sysclk_src(CLK_XTAL,XTAL);syscon_set_ahb_clk(AHB_CLK);syscon_set_apb_clk(APB_CLK);syscon_set_ble_clk(BLE_CLK);syscon_set_timer_clk(TIMER_CLK);syscon_set_usart_clk((uint32_t)QN_UART0,syscon_set_usart_clk((uint32_t)QN_UART1,明,以免客户从SDK源码进行程序移植时,出现与本套例程不同的现象或错误。的uart.c文件进行修改。在uart.c文件的第933行添加了如程序3.1所示的代码。程序3.1printf函数底层驱动函*@briefintfputc(intch,FILE{returnch;}Preprocessor页面下添加宏“_DLIB_FILE_DESCRIPTOR3.1

3.1IAR3.2所示。程序3.2ADC触发引脚定enumenum{ADC_GPIO06_TRIG=0,/*!<Triggeredby/*!<Triggeredby由于GPIO06和GPIO15AD触发功能,所以需要将其修改,修改后如程序清这两个引脚带有AD引脚触发功能。程序3.3修改后的ADC触发引脚定enumenum{ADC_GPIO10_TRIG=0,/*!<Triggeredby/*!<Triggeredby一次,每按下按键S3一次,LED6的状态改变一次。修改main.c中的#define TRUE中的在本次的GPIOGPIO的输入中断功能,例程具体的实现方法与常用的行回调函数的。下面我们查看下gpio_init()函数的源码如程序4.1所示,具体分析程序4.1voidvoidgpio_init(gpio_callback_t{#if//Initializeenvironment/*EnableAHBclocktotheGPIO①./*GPIO/*SetupNVICwhenI/Opinsareconfiguredasexternalinterrupts.*/#ifCONFIG_GPIO_ENABLE_INTERRUPT==TRUE /*使能GPIO中 }望执行的函数。当代码执行到程序4.1中的①时就会将cb_gpio这个函数指针保存到gpio.c文件中的一个全局结构体gpio_env的callback中,这个过程就完成了函数的。gpio.cGPIO_IRQHandler的函数,这个才是我们常用的GPIO中断的函数,具体的代码如程序4.2所示。程序4.2gpio中断函voidvoid{#ifif(ahb_clock_flag&0x01)/* ahb_clock_flag&=}intconstuint32_treg=/*GPIO中断状态寄存器的值//Parseallfor(pin=(int)GPIO_PIN_MAX;pin!=0;pin>>={//Checkifintstaushassetif(reg&pin){#ifGPIO_CALLBACK_EN==TRUE//Callbackhandler}}}/*②/*③/*/*/*④当任意一个开启GPIO中断功能的GPIO发生中断时程序就会自动跳到程序4.2所示的函数执行程序,程序4.2中的代码①、②、③判断出具体哪一个GPIO引脚引起中断,然后代码④调用在程序4.1中的中断回调函数,这个过程就完成了回调。同时在中断函数的回调时将产生中断的GPIO引脚号作为了中断回调函数的参数,这个参数在设计GPIO中断回调函数时很重要。4.3所示。程序4.3中的函数参数pin就是产生GPIO中断的GPIO的引脚代号,我voidcb_gpio(enumgpio_pin{if(pin==SW3)/*S3/*LED6}elseif(pin==SW2)/*S2/*LED5}}设计GPIO中断回调函数,如:voidcb_gpio(enumgpio_pin将相应的GPIO标,操作如图4.1所示。4.1图4.2选择型4.3QnDriverTools4.4IO4.5IO4.6P0.24.74.8的功能引脚,可以通过点击图标将P2.7做为0的功能引脚。如果我们需要用SPI1SPI1-CS那行中的状态为“ValidCandidate”的状态格,便可以同时选中两个引脚。具体操作如图4.9所示。4.94.10如图4.11所示。此时将生成的“SystemIOConfg”函数替换工程中“system.c”文件中的4.11实验例程实现了两种方式进行UART与PC之间的数据传输,一种是中断方式(译并程序到开发板;4.12UART0 ”,实验现象如图4.13所示。4.13UART0P11连接,其余的实验步骤现象与uart0例程的步骤和现象一致,这里不再叙述。 找到driver_config.h文件。程序4.4修改前UART0宏定#define#define#defineCONFIG_UART0_TX_ENABLE_INTERRUPT#define程序4.5修改后UART0宏定#define#define#defineCONFIG_UART0_TX_ENABLE_INTERRUPT#define函数。用户也可以将两者设为FALSE,自行设计发送中断函数和接收中断函数。UART在初始化时进行波特率设置,设置代码如程序4.6所示。其中QN_UART0,具体的范围可在“uart.h”文件的96行处查看,具体的代码如程序4.7所示。程序4.6UART波特率设uart_init(QN_UART0,uart_init(QN_UART0,USART_CLK,程序4.7UART波特率设定范 = = = = =============================#else//default: USART_CLK== =0,===============,=,=,=,I2CZLG902xDemoKit开发套件上MMA8452Q三现象如图4.14所示。图4.14MMA8452Q的数4.15图4.15MMA8452Q数据的变感器。实验中仅使用I2C方式LM75AD的数据,并将LM75AD到的数据转换为实现象如图4.16所示。图4.16的温度将手指放在开发板的LM75AD上,将会将会发现温度不断升高,实验现象如图4.17所示。图4.17温度值变ZLG902xDemoKitI2CI2CI2C通讯I2CI2C50个数据,然后再从从机读回刚刚才写入的数据,将andreadtestfailed新编译并程序到开发板;现象如图4.18所示。4.18I2C不同,具体如程序4.8所示。程序4.8i2c初始化函voidi2c_init(uint32_tspeed,uint8_t*buffer,uint16_t/*i2cvoidi2c_init(uint8_t*buffer,uint16_t/*i2c程序4.9i2c主机模式初始化函reg=/*I2Cscl|/*|/*Enablearbitrationloss|/*EnableRX|/*EnableTX},I2Cbufferi2c_envi2cBuffer,i2c_envI2Cbuffer必须指向一个全局的数组,而不能程序4.10i2c多字节读、写函voidI2C_nBYTE_READ(uint8_tsaddr,uint8_treg_addr,uint8_t*buffer,uint16_tlen)voidvoidI2C_nBYTE_READ(uint8_tsaddr,uint8_treg_addr,uint8_t*buffer,uint16_tlen)voidI2C_nBYTE_READ2(uint8_tsaddr,uint16_treg_addr,uint8_t*buffer,uint16_tlen)voidI2C_nBYTE_WRITE(uint8_tsaddr,uint8_treg_addr,uint8_t*buffer,uint16_tlen)voidI2C_nBYTE_WRITE2(uint8_tsaddr,uint16_treg_addr,uint8_t*buffer,uint16_t序4.11所示。程序4.11/*i2c_env.i2cBuffer[0]=(reg_addr>>8)&/*地址高八位赋值给i2c_env.i2cBuffer[1]=reg_addr&/*地址低八位赋值给for(i=0;i<len;i++)i2c_env.i2cBuffer[2+i]=/*①在设置size的大小时一定要谨慎。程MCU复位(如wdt_rest例程注:wdt_interruptIARwdt_restIAR例程,在进行仿真时,会出现看门狗超时现象(keil程序4.12看门狗初始化函voidvoidwdt_init(unsignedintcycle,enumWDT_MODE看门狗工作模式,mode的可选参数有三个:看门狗喂狗函数的原型如程序4.13所示。程序4.13看门狗喂狗函voidvoidwdt_set(unsignedint3232KHz,所以可以通过3200012732003.96875ms远电子生产的逻辑分析仪LA1232测量波形的周期进行验证。通道分别连接开发板的P27、GND引脚,打开ZlgLogic上位机软件,测得波形及周期数据如图4.19所示。4.19P27 本实验主要演示ZLG902xDemoKit开发套件上的的使用方法。实验例程实现了使用将LED4、LED5制作为呼吸灯的功能。 通道0 配置代码如程序4.14所示,其中第一个参_CH0 _PSCAL_DIV (的时钟频率=时钟源/(时钟分频因子+1)),第三个参数是周期的计数值(设置为1000us),第四个参数是 脉冲的计数值(设置为400us)。程序 * 在设置_PSCAL_DIV参数、第三个参数和第四个参数时需要谨慎,必须保证第三个参数和第四个参数的参数值小于256(如_COUNT_US(1000, _PSCAL_DIV)<256,否则就会出现定时不正确的现象。配置函数的函数原型如程序4.15所示,从函数原型中可看出第三个和第四个参数的参数类型为uint8_t,同时在《QN9020APIProgrammingGuidev1.1.pdf》中28页也有说明的计数器为8位,所以在进行参数设置时要保证第三个和第四个参数的参数值小于256。程序4.15配置函数函数原 ch,uint16_tpscal,uint8_tperiodcount,uint8_t下面就看下如何设 时钟分频因子以及如何计算第三个和第四个参数。打.h文件55行代码如程序4.16所示。用户可在这里修改时钟分频因子的值,同时可以计算出配置函数的第三个和第四个参数是否合理。程序4.16配置参数的相关宏定///Set///Set///((n)+///Set //timerdividernot //timerdivider///Set///Set///parecountvalue(periodInS*((s)parecountvalue(periodInMs*_CLK/parecountvalue(periodInUs*_CLK),实验例程实现了使用timer中断控制LED4、LED5、LED6进行闪烁。 获到上升沿后就会产生中断,在中断中可以读出timer当前的计数值。实验例程实现了使用timer1的输入捕获的捕获时间模式timer0产生的 MCU后,LED4不停的闪烁(LED4的闪烁感同时串口打印出的两个上升沿之间的时间,实验现象如图4.20所示。timer0产生的1000us,time1测出的两上升沿的时间间隔999us,可以看出测量误差非常小。4.20timer_capture_timerTimer的捕获模式是指在特定时间内捕获指定的个数,并将其记录在timer的计数器中,如1000ms内捕获上升沿的个数,并将其记录在timer的计数器中。本实验主要演示ZLG902xDemoKit开发套件上的timer1输入捕获的捕获模式的使实验例程实现了使用timer1的输入捕获的捕获模式1000ms内timer0产生的4.21timer0产生的波的周期为1000us,则1000ms1000,time11000,测量4.21timer_capture_event实验例程实现了使用timer1的输入捕获的捕获计数模式捕获5个timer0产生的 的上升沿,并将捕获这5个上升沿的时间打印到屏幕上。MCU后,LED45个升沿的个数所花费的4.22timer0产生的1000us,4.22timer_capture_counter在本例程中timer0的配置代码如程序4.17所示,其中第一个参数QN_TIMER0是TIMER_PSCAL_DIVtimer时钟的分频因子(timer的时钟timer/(timer1))timer计数器的计数值程序4.17timer0配置代\TIMER_COUNT_MS(50,TIMER_PSCAL_DIV));/*定时50ms产生中 timer032232就会造成是16位,所以在配置时第三个参数应小于于216。 Timer_例程中timer的配置函数如程序4.18所示,此函数的参数配置方式及注意事项与Timer_interrupt配置函数的配置方式及注意事项相同,这里不再叙述,请参考Timer_interrupt配置小节。程序4.18 *timer0配置为*1000us \TIMER_COUNT_US(1000,TIMER_PSCAL_DIV),的原型如程序4.19所示,其参数的具体含义如下:其他模式设为0。程序4.19timer_capture_config函数原uint32_tpscal,uint32_tcount,uint32_tTimertimer时钟的时钟分频因子设定,根据这个值可以计算timer计数器值增加1所经历的时间,计算为(单位为秒:时间=1 timer的时钟频率=1/(timer时钟源时钟/(timer时钟分频因子+=(timer1)timer例如在timer_capture_counter例程的timer1的配置函数如程序4.20所示,设置的timer1的时钟分频因子为79。打开timer.h文件75行如程序4.21所示,其中TIMER_CLKdriver_config.h8Mtimer8M。则可以算出timer11=(791)8M10us程序4.20timer1配置函程序4.21timer时钟源时钟配置#define#define rtc2015.07.2200:00:00,串4.23RTC硬件:PC机一台,ZLG902xDemoKitZLGDMM600六位半数字万RTC作为唤醒源唤醒进入cpuclkoffZLGDM6000ZLG902xDemoKit开发板J63.3V和VCC引脚,打开DM6000电源,选择直流电流测量档,具电流为832.753µA,实验现象如图4.24所示。4.24的测量值,证明在步骤5)时MCU在不断的进入低功耗模式。4.25ZLG902xDemoKitMCU128Kflash32个扇区(每个扇区4K。128Kfash44.26flash分区示意图所示,每个flash4KNVDSNVDS信息丢失;bootloaderbootlader升级时需要的一些重要信息,如:4.26flash 4.274.27flash的addr参数和nByte参数时需要注意:程序4.22flash读、写函数原voidwrite_flash(uint32_taddr,constuint32_t*pBuf,uint32_t(AIN01/AIN23(1VDifferentialwithinputbuffer:输入信号范围是[0.2,VDD-0.2],测量范围为[-VREF,VREF)adc对应值为[-2048,2047];Differentialwithoutinputbuffer:[0,VDD],测量范围为[-VREF,VREF)adc对应值为[-2048,2047];Single-Endwithinputbuffer:输入信号VIN满足条件:0.2VIN(V<=VDD-0.2,测量范围为[0.2,1.5*VREF)adc对应值为Single-Endwithoutinputbuffer:0=<VIN(V)<=VREFVDD,测量范围为[0,VREF)adc对应值为[0,2047]。本套例程中adc的三种参考电压如下:Internal:1VNVDS中ExternalREF1(withbufferandgain=2):VREF=2*EXT_REF1(0<EXT_REF1<ExternalREF2(withoutbuffer):VERF=EXT_REF2(0<EXT_REF2<VDD),EXT_REF2必须要有足够的驱动能力供ADC转换使用。本实验主要演示ZLG902xDemoKit开发套件上的adc查询方式电压,及如何更值,实验现象如图4.28所示;4.28adc_pollingadcmain.cADC_EXT_REF_EN的值参考电压编译程序重新;实验现象如图4.29所示。4.29adc_polling例程adc默认使用16M时钟源并且速率为1M,可修改main.c中的宏16K,然后重新编译,(若出现无法时,请看下面的注说明;实验现象如图4.30所示。4.30adc_polling注:若程序时出现无法的情况,则将P07引脚与其他引脚的连线断开,在点击按钮后,本实验主要演示ZLG902xDemoKit开发套件上的adc中断方式电压,及如何使用,P图4.31所示。4.31adc_interrupt,P图4.32所示。4.32adc_differential实验现象如图4.33所示。4.33adc_differential 限的次数,进入中断的次数,实验现象如图4.34所示。图 4.35adc_battery_monitor4.36adc_temp_sensor打开adc_trigger_by_timer例程的Keil(或IAR)工程,重新编译并程序到开4.37adc_trigger_by_timer,P4.38adc_trigger_by_gpio本初始化为adc输入通道引脚,P12被初始化为adc的触发引脚,P06、P07则根据ADC_EXT_REF_EN的值决定是否被初始化为adc输入通道引脚。程序4.23adc引脚配//Pin//PinMuxControl||||||||||//PinMuxControl||||||//PullControl//PullControl//DriveabilityControlADC配置初始化代码(以adc_polling例程为例)如程序4.24所示。代码③为adcADC_SINGLE_WITHOUT_BUF_DRVadc模式,adc共有四ADCADC_CLK32K_16000adc时钟源及,设置adc的精度。程序4.24adc配/*adc① /*adc/*adc/*adcclk32k_enable(/*32k②*adc设置为单端、无缓冲区模式,adc32k,adc1MHz,③*adc设置为单端、无缓冲区模式,adc1MHz, ,ADC_EXT_REF2,ADC_12BIT); ④ adc设置为单端、无缓冲区模式,adc1MHz,参考电压为内部参考电压 ⑤/*⑥⑦/*设置adc开始通道为⑧/*设置adc结束通道为⑨adc_read(&read_cfg,buf,32,/*adc⑩单通道采集:代码⑦设置为SINGLE_MOD或CONTINUE_MOD或SINGLE_SCAN_MODCONTINUE_SCAN_MOD,代码⑧、⑨设置开始和结束通道时设置相同即可,如同设为AIN0意为通道0数据,同设为AIN1意为通道1数据。多通道:代码⑦设置为SINGLE_SCAN_MOD或CONTINUE_SCAN_MOD,此时为AIN0,代码⑨设为AIN1,则代表同时通道0和1的数据。代码⑩为adc数据的,当设为单通道时,buf中的数据即为通道的数据,当设为多通道时,buf中的数据按照代码⑧、⑨设置的开始和结束通道的设置依次在程序4.24中代码⑦将adc设置为SINGLE_MOD(单次触发单次转换模式但需要将adc设置为CONTINUE_MOD模式。程序 ////{{while(!(adc_adc_GetSR(QN_ADC)/*/*转换结for(intfor(inti=0;((i<scan_ch_num)&&(samples));}if((samples)&&(adc_env.trig_src==ADC_TRIG_SOFT)&&((S->mode==SINGLE_SCAN_MOD)||(S->mode==SINGLE_MOD))){adc_adc_SetADC0WithMask(QN_ADC,ADC_MASK_SFT_START, /*}}adc.h文件74行,设置代码如程序4.26所示。程序4.26adc外部参考电压设#define#define 当adc的数据有一个固定的误差时,可以通过修改补偿值进行修正,打开adc.c文件69行,修改ADC_OFFSET的值即可,具体如程序4.27所示。如果发现修改码如程序4.28所示。程序4.27adc补偿值设程序4.28adc补偿值使resultresult=aeabi_lmul(adc_data-ADC_OFFSET,ADC_VREF)>>ZLG902xDemoKitacmp外设:acmp0acmp1acmp1的输acmp使用内部参考电压:acmp_nacmpacmp使用外部参考电压:acmp_nacmp_p引脚的电ZLG902xDemoKitacmp0打开acmp0_internal_ref例程的Keil(或IAR)工程,重新编译并程序到开发ZLG902xDemoKitacmp0的电压,acmp0_outMCUP31VCC相连,P30VCCGND相连,P23GND相连,P23引脚都输出高电平,LED4熄灭。ZLG902xDemoKitacmp1 ZLG902xDemoKitacmp1的电压,acmp1_out3)MCUP07VCC相连,P06VCCGND相连,P27引脚都输出低电平,LED4点亮。当P07GND相连,P06VCC或是GND相连,P27引脚都输出高电平,LED4熄灭。复位按键,即可顺利程序。 4.39dma_uart0 4.40dma_uart04.41dma_uart0实验例程实现了使用adc电压,数据完成后出发dma将数据保存到memory,值,实验现象如图4.42所示。4.42dma_adcadcmain.cADC_EXT_REF_EN的值参考电压编译程序重新。实验现象如图4.43所示。4.43dma_adc例程adc默认使用16M时钟源并且速率为1M,可修改main.c中的宏16K,然后重新编译,(若出现无法时,请看下面的注说明。实验现象如图4.44所示4.44dma_adc注:若程序时出现无法的情况,则将P07引脚与其他引脚的连线断开,在点击按钮后,sleep模式,功耗依次降低。4.1cpuclockdeep硬件:PC机一台,ZLG902xDemoKitZLGDMM600六位半数字万ZLG902xDemoKittimer0唤醒进入c

温馨提示

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

最新文档

评论

0/150

提交评论