




已阅读5页,还剩116页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
lm3s811_gpio函数整理(1) *注:未指明返回值的函数为无返回值,资源来自周立功单片机网站一:gpio函数1: void gpiodirmodeset(unsigned long ulport, unsigned char ucpins, unsigned long ulpinio) 设置所选gpio端口指定管脚的方向和模式如 gpiodirmodese(gpio_porta_base,gpio_pin_2 ,gpio_dir_mode_in ) 函数设置pa2为输入,但第三个参数为“gpio_dir_mode_hw / 硬件控制”时指此管脚启用第二功能;2:unsigned long gpiodirmodeget(unsigned long ulport, unsigned char ucpin)获取所选gpio端口指定管脚的方向和模式如 unsigned long setvalue=gpiodirmodeget(gpio_porta_base,gpio_pin_2);返回pa2脚的方向和模式,返回的值为上一个函数第三个参数的取值,分别为gpio_dir_mode_in / 输入方向 gpio_dir_mode_out / 输出方向 gpio_dir_mode_hw / 硬件控制3:void gpiopadconfigset(unsigned long ulport, unsigned char ucpins, unsigned long ulstrength, unsigned long ulpadtype) 设置所选gpio端口指定管脚的驱动强度和类型如 gpiopadconfigset(gpio_porta_base,gpio_pin_2,gpio_strength_4ma ,gpio_pin_type_std) 设置pa2脚的驱动强度为4ma的推挽输出;ulstrength:指定输出驱动强度,应当取下列值之一: gpio_strength_2ma / 2ma驱动强度 gpio_strength_4ma / 4ma驱动强度 gpio_strength_8ma / 8ma驱动强度 gpio_strength_8ma_sc / 带转换速率(slew rate)控制的8ma驱动 ulpadtype:指定管脚类型。应当取下列值之一: gpio_pin_type_std / 推挽 gpio_pin_type_std_wpu / 带弱上拉的推挽 gpio_pin_type_std_wpd / 带弱下拉的推挽 gpio_pin_type_od / 开漏 gpio_pin_type_od_wpu / 带弱上拉的开漏 gpio_pin_type_od_wpd / 带弱下拉的开漏 gpio_pin_type_analog / 模拟比较器4:void gpiopadconfigget(unsigned long ulport, unsigned char ucpin, unsigned long *pulstrength, unsigned long *pulpadtype)获取所选gpio端口指定管脚的配置信息如 gpiopadconfigget(gpio_porta_base,gpio_pin_2,pulstrength,pulpadtype);输出驱动强度信息保存到pulstrength指向的地址中,输出驱动类型信息保存到pulpadtype指向的地址中,返回的值为上一个函数设置的内容。5:void gpiopintypegpioinput(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为高阻输入模式 如 gpiopintypegpioinput(gpio_porta_base,gpio_pin_2);设置pa2脚为高阻输入模式6:void gpiopintypegpiooutput(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为推挽输出模式如 gpiopintypegpiooutput(gpio_porta_base,gpio_pin_2) 设置pa2脚为推挽输出模式7:void gpiopintypegpiooutputod(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为开漏输出模式如 gpiopintypegpiooutputod(gpio_porta_base,gpio_pin_2) 设置pa2为开漏输出模式但由于函数5,6,7函数名太长一般做如下简化:#define gpiopintypein gpiopintypegpioinput #define gpiopintypeout gpiopintypegpiooutput #define gpiopintypeod gpiopintypegpiooutputod 8: void gpiopintypeadc(unsigned long ulport, unsigned char ucpins)设置所选gpio端口指定的管脚为adc功能 这个函数只对有adc功能复用的管脚有用如lm3s811的1,2,3,4脚。9:void gpiopintypecan(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为can功能 10:void gpiopintypecomparator(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为can功能11:void gpiopintypecomparator(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为模拟比较器功能12:void gpiopintypei2c(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为i2c功能 13:void gpiopintypepwm(unsigned long ulport, unsigned char ucpins)设置所选gpio端口指定的管脚为pwm 功能 14:void gpiopintypeqei(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为qei功能 15:void gpiopintypessi(unsigned long ulport, unsigned char ucpins)设置所选gpio端口指定的管脚为ssi功能16:void gpiopintypetimer(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为timer的ccp功能 本文 由西电f518学生实验室 小愫整理,转载请注明出处 17:void gpiopintypeuart(unsigned long ulport, unsigned char ucpins)设置所选gpio端口指定的管脚为uart 功能 18: void gpiopintypeusbdigital(unsigned long ulport, unsigned char ucpins) 设置所选gpio端口指定的管脚为usb数字功能 对 gpio管脚的读写操作是通过函数 gpiopinwrite( )和 gpiopinread( )实现的,这是两个非常重要而且很常用的库函数。 19: void gpiopinwrite(unsigned long ulport, unsigned char ucpins, unsigned char ucval);向所选gpio 端口的指定管脚写入一个值,以更新管脚状态, ucval:写入指定管脚的值 注:ucpins 指定的管脚对应的 ucval 当中的位如果是 1,则置位相应的管脚,如果是 0,则清零相应的管脚;ucpins未指定的管脚不受影响。如 gpiopinwrite(gpio_porta_base, gpio_pin_3, 0x00); / 清除pa3 gpiopinwrite(gpio_portb_base, gpio_pin_5, 0xff); / 置位pb5 gpiopinwrite(gpio_portd_base, gpio_pin_2 | gpio_pin_6, 0xff); /同时置位pd2、pd6gpiopinwrite(gpio_porta_base, 0xff, ucdata); / 变量ucdata 输出到pa0pa7 20:long gpiopinread(unsigned long ulport, unsigned char ucpins) 读取所选gpio端口指定管脚的值,返回1个位组合的字节。该字节提供了由ucpins指定管脚的状态,对应的位值表示gpio 管脚的高低状态。ucpins未指定的管脚位值是0。返回值已强制转换为long型,因此位31:8应该忽略。 这个函数应该在相应管脚已经设置为输出状态的情况下,由于gpio得管脚结构我们知道在输出模式下,不管是开漏还是推挽用此函数读回来的值都是管脚的输出锁存值,如 / 读取pa4,返回值保存在ucdata里,可能的值是0x00或 0x10 ucdata = gpiopinread(gpio_porta_base, gpio_pin_4); / 同时读取pb1、pb2和 pb6,返回pb1、pb2和 pb6的位组合保存在ucdata里 ucdata = gpiopinread(gpio_portb_base, gpio_pin_1 | gpio_pin_2 | gpio_pin_6); / 读取整个pf端口 ucdata = gpiopinread(gpio_portf_base, 0xff);在stellaris 系列 arm 里,每个 gpio 管脚都可以作为外部中断输入。中断的触发类型分为边沿触发和电平触发两大类,共 5 种,用起来非常灵活。配置 gpio管脚的中断触发方式可以通过调用函数 gpiointtypeset( )来实现,函数 gpiointtypeget( )用来获取配置情况。函数 gpiopinintenable( )和 gpiopinintdisable( )用来使能和禁止 gpio管脚中断。函数 gpiopinintstatus( )用来获取 gpio管脚的中断状态。在同一个 gpio 端口上,8 个gpio管脚的中断向量都是共用的。如果同时配置了同一端口上的多个管脚中断,则可以先利用函数 gpiopinintstatus( )读取中断状态, 再进一步确认具体是哪个管脚产生的中断请求。函数 gpiopinintclear( )用来及时清除 gpio管脚的中断状态。函gpioportintregister( )用来注册一个 gpio端口中断服务函数,而注销的方法是调用函数gpioportintunregister( )。2012csdn网站六大类职位火热招聘中! 点击了解英特尔云计算 2012年1月当选微软mvp的csdn会员名单揭晓!lm3s811 学习笔记(四)【gpio】 分类: cortex m32011-08-03 15:24295人阅读评论(0)收藏举报今天主要是熟悉下gpio的一些应用。最简单的就是led灯的控制。下面的例子就拿l5来说明吧。sysctlperipheralenable(sysctl_periph_gpiob);/enable gpio bgpiopintypegpiooutput(gpio_portb_base, gpio_pin_0);/set pb0 output还有一种模式设置的方法gpiodirmodeset(gpio_portb_base, gpio_pin_0, gpio_dir_mode_out) ;/这个方案可以设置多个引脚,参数2为位引脚的或控制led灯地亮灭,就是往引脚写入值ledstatus = gpiopinread(gpio_portd_base, gpio_pin_0);gpiopinwrite(gpio_portd_base, gpio_pin_0, gpio_pin_0&(ledstatus);上面的程序是读取l5对应管脚的值,然后使灯地状态进行翻转。这里说下gpiopinwrite()该函数的用法。gpiopinwrite(gpio_portd_base, gpio_pin_1, gpio_pin_1);gpiopinwrite(gpio_portd_base, gpio_pin_1, gpio_pin_1);例程上常用上面的方法。主要也就是你要让哪个管脚置一,参数3的值中管脚对应的位必须置一。如下各条指令都能点亮响应端口(假设已经都定义成输出了)。gpiopinwrite(gpio_portd_base,gpio_pin_0,1);gpiopinwrite(gpio_portd_base,gpio_pin_1,2);gpiopinwrite(gpio_portd_base,gpio_pin_2,4);gpiopinwrite(gpio_portd_base,gpio_pin_3,8);gpiopinwrite(gpio_portd_base,gpio_pin_4,0x10);gpiopinwrite(gpio_portd_base,gpio_pin_5,0x20);gpiopinwrite(gpio_portd_base,gpio_pin_6,0x40);gpiopinwrite(gpio_portd_base,gpio_pin_7,0x80);下面我主要讲述下键控led的流程,其实就是利用按键中断控制灯的亮灭。首先是配置key。sysctlperipheralenable(sysctl_periph_gpioc);/enable gpio cgpiopinintenable(gpio_portc_base, gpio_pin_4);/enable gpio c pin 4gpiopintypegpioinput(gpio_portc_base, gpio_pin_4);/set the pin mode is inputgpiointtypeset(gpio_portc_base, gpio_pin_4, gpio_low_level);/set interrupt type is low falling edgeintenable(int_gpioc);/enable gpio c interrupt下面是按键中断的处理函数void userkey_handler(void)unsigned char ucval;unsigned long ulstatus;ulstatus = gpiopinintstatus(gpio_portc_base, true);/ get gpio c interrupt statusgpiopinintclear(gpio_portc_base, ulstatus); / clear interrupt statusif (ulstatus & gpio_pin_4) / 如果key的中断状态有效ucval = gpiopinread(gpio_portd_base, gpio_pin_0); / 翻转ledgpiopinwrite(gpio_portd_base, gpio_pin_0, ucval);sysctldelay(10 * (sysctlclockget() / 3000); / 延时约10ms,消除按键抖动while (gpiopinread(gpio_portc_base, gpio_pin_4) = 0x00); / 等待key抬起sysctldelay(10 * (sysctlclockget() / 3000); / 延时约10ms,消除松键抖动既然用到了sysctldelay()函数。在这里也顺道分析下。#if defined(ewarm) | defined(doxygen)/iar环境下voidsysctldelay(unsigned long ulcount)_asm( subs r0, #1n bne.n sysctldelayn bx lr);#endif#if defined(codered) | defined(gcc) | defined(sourcerygxx)/codered、gcc、sourcerygcc环境下void _attribute_(naked)sysctldelay(unsigned long ulcount)_asm( subs r0, #1n bne sysctldelayn bx lr);#endif#if defined(rvmdk) | defined(_armcc_version)/keil mdk环境下_asm voidsysctldelay(unsigned long ulcount)subs r0, #1;bne sysctldelay;bx lr;#endif#if defined(ccs)/ccsvolatile unsigned long g_ulinlineccsworkaround;voidsysctldelay(unsigned long ulcount)_asm(delay?: subs r0, #1n bne.n delay?n bx lrn);/ this is needed to keep ti compiler from optimizing away this code./g_ulinlineccsworkaround += ulcount;#endifsysctldelay()执行了3个汇编语句,运行时间3个始终周期。函数说明上: the loop takes 3 cycles/loop.1、在主晶振6mhz的情况下sysctldelay(2); delaytime = 2 * 3 * (1/6000000) = 1ussysctldelay(10 * (thesysclock / 3000); delaytime = 10 * (6000000/3000)* 3 * (1/6000000) = 10ms2、在主晶振8mhz的情况下sysctldelay(2); delaytime = 2 * 3 * (1/8000000) = 0.75ussysctldelay(10 * (thesysclock / 3000); delaytime = 10 * (8000000/3000)* 3 * (1/8000000) = 10ms由此 可以看出无论是多大的晶振,都是除以3000。sysctldelay(10 * (thesysclock / 3000);这种写法也方便移植lm3s811点亮led或流水灯程序 1急求! 2010-8-6 17:41 提问者:luxiahua427511 | 悬赏分:5 | 浏览次数:525次谢谢了啊 !刚开始学arm又没有实际的程序!谢谢帮忙了推荐答案 2010-8-15 12:34 #include systeminit.h/ 定义led#define led_periph sysctl_periph_gpioa#define led_port gpio_porta_base#define led_pin gpio_pin_2/ 主函数(程序入口)int main(void) jtagwait(); / 防止jtag失效,重要! clockinit(); / 时钟初始化:晶振,6mhz sysctlperienable(led_periph); / 使能led所在的gpio端口 gpiopintypeout(led_port, led_pin); / 设置led所在管脚为输出 for(;) gpiopinwrite(led_port, led_pin, 0x00); / 点亮led /sysctldelay( 1000000); / 延时 sysctldelay(1000 * (sysctlclockget( ) / 3 6000); / 延时 1000 ms gpiopinwrite(led_port, led_pin, 0xff); / 熄灭led /sysctldelay(1000000); / 延时 sysctldelay(1000 * (sysctlclockget( ) / 3000); / 延时 1000 ms 最基本的一个例程,已调试通过(systeminit.c的口该一下,811没g口的)。你可以去zlg网站上去找找资料,那里的例程很多,很适合新手。我也才刚刚开始学,一起努力了。赞同0| 评论 回复:青风和大家一起学stellaris系列arm九.adc转换。程序演示:分别完成三种adc变化:程序一:内部温度测试;程序二:单端采样;程序三:差分采样;内部温度测试:在stellaris系列的adc模块里,附带了一个内置的温度传感器,能够随时检测芯片的温度。该温度传感器可以有以下用途:1 测试用:在单独测试adc模块的功能时,而不必提供外部的模拟信号源2 测量芯片自身温度,防止可能出现的过温(高温应用场合必备)3 估算环境温度:芯片温度总是比环境温度略高,如果通过实验找到这个差值,则可以进行软件修正4 在随机算法里可以提供随机数种子内部温度传感器提供了模拟温度读取操作和参考电压。输出终端senso的电压通过以下等式计算得到:senso 2.7 (t55) 75adc温度传感器温度-电压关系一个实用的adc温度转换公式。假设温度电压senso对应的adc采样值为n,2.7v对应n1,(t55)75对应n2。已知:n1 (31024) 2.7n2 (31024) (t55) 75由此得到:n n1 n2 2.7 (31024)(t55)75)(31024)解得:t (151040 225 n) 1024结论:adc配置为温度传感器模式后,只要得到10位采样值n,就能推算出摄氏温度t。程序标注:#include inc/hw_memmap.h#include inc/hw_types.h#include driverlib/adc.h#include driverlib/gpio.h#include driverlib/sysctl.h#include utils/uartstdio.hvoidinitconsole(void)/ 初始化gpio外设/sysctlperipheralenable(sysctl_periph_gpioa);/ 配置化串口外设/gpiopinconfigure(gpio_pa0_u0rx);gpiopinconfigure(gpio_pa1_u0tx);/ 配置串口管脚/gpiopintypeuart(gpio_porta_base, gpio_pin_0 | gpio_pin_1);/ 初始化串口/uartstdioinit(0);intmain(void)/ t设置数组读取 adc fifo/unsigned long uladc0_value1;/ 设置温度转换变量/ unsigned long ultemp_valuec;unsigned long ultemp_valuef;/ 设置pll,adc的时钟必须要16mhz/sysctlclockset(sysctl_sysdiv_10 | sysctl_use_pll | sysctl_osc_main |sysctl_xtal_16mhz);/ 初始化开发板端口/initconsole();/ 串口显示/uartprintf(adc -n);uartprintf( type: internal temperature sensorn);uartprintf( samples: onen);uartprintf( update rate: 250msn);uartprintf( input pin: internal temperature sensornn);/ adc0外设初始化/sysctlperipheralenable(sysctl_periph_adc0);/ 配置adc0,采样序列3,adc处理器触发,优先级为0/adcsequenceconfigure(adc0_base, 3, adc_trigger_processor, 0);/ 温度传感,中断使能,对列结束选择,无adc通道/adcsequencestepconfigure(adc0_base, 3, 0, adc_ctl_ts | adc_ctl_ie |adc_ctl_end);/使能adc采样/adcsequenceenable(adc0_base, 3); / /adc中断清除/adcintclear(adc0_base, 3);/设置温度显示/while(1)/adc处理器触发/adcprocessortrigger(adc0_base, 3);/获取中断状态/while(!adcintstatus(adc0_base, 3, false)/获取adc采样数据/adcsequencedataget(adc0_base, 3, uladc0_value);/ 计算温度 c/ultemp_valuec = (1475 * 1023) - (2250 * uladc0_value0) / 10230;/ 计算温度 f/ultemp_valuef = (ultemp_valuec * 9) + 160) / 5;/ 串口显示/uartprintf(temperature = %3d*c or %3d*fr, ultemp_valuec,ultemp_valuef);/ 时钟延迟/sysctldelay(sysctlclockget() / 12);运行结果:lm3s811防止jtag失效的源代码(2011-05-21 14:20:16) 转载标签: lm3s811杂谈分类: lm3 void jtagwait(void)unsigned long i;sysctlperipheralenable(sysctl_periph_gpioc); / 使能key、led所在的pc端口gpiopintypegpioinput(gpio_portc_base, gpio_pin_4); / 设置key所在管脚pc4为输入gpiopintypegpiooutput(gpio_portc_base, gpio_pin_5 ); / 设置led所在管脚pc5为输出if (gpiopinread(gpio_portc_base, gpio_pin_4) = 0x00) / 若复位或上电时按下key,则进入 while(1) /死循环,以等待jtag连接,led闪烁for(i=0;i200000;i+);gpiopinwrite(gpio_portc_base, gpio_pin_5,gpio_pin_5); /点亮ledfor(i=0;i 28) & 0xf),此处计算结果sysctl_periph_index(0x20000040)=2,而g_pulscgcregs2正好是睡眠模式时钟选通控制寄存器2 (scgc2),正好是控制gpioagpioh的时钟使能。因此不难猜想sysctl_periph_index(a)是为了选择寄存器scgc0、scgc1、scgc2中的一个。因此hwreg(g_pulrcgcregssysctl_periph_index(ulperipheral)意思就是选中寄存器scgc2,整句的意思是要改写该寄存器的值。于是继续看后半句sysctl_periph_mask(ulperipheral),当然 |= 是复合赋值a|=b相当于a=a|b。#define sysctl_periph_mask(a) (a) & 0xffff) 16),该句比较复杂,暂时不知道为什么要这样写,但此处计算结果sysctl_periph_mask(0x20000040)=0x0040。因此hwreg(g_pulrcgcregssysctl_periph_index(ulperipheral) |=sysctl_periph_mask(ulperipheral); 一句的目的是将寄存器scgc2的第6位gpiog置1而使能gpiog端口。另外,再看一下scgc2的定义如下:76543210gpiohgpioggpiofgpioegpiodgpiocgpiobgpioa这就不难理解为什么有如下定义#define sysctl_periph_gpioa 0x20000001 / gpio a#define sysctl_periph_gpiob 0x20
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第12课 战后科学技术革命说课稿-2025-2026学年高中历史华东师大版上海第六分册-华东师大版上海2007
- 西安科大版·2017教学设计-2025-2026学年中职中职专业课统计类73 财经商贸大类
- 第一单元 主题案例二 学习家庭园艺技巧-高中劳动与综合实践单元教学设计
- 2024年七年级生物下册 4.7.1 分析人类活动对生态环境的影响说课稿 (新版)新人教版
- 曲靖市中小学生科技素养科学课程 第10课.《螺旋桨飞机》教学设计
- 2025年中考化学试题分类汇编:常见的酸和碱(第1期)解析版
- 2025年城市绿化考试题库及答案
- 22.2.5 一元二次方程根与系数的关系 说课稿+说课稿 2024-2025学年华东师大版九年级数学上册
- 22.1 一元二次方程说课稿2024-2025学年华东师大版数学九年级上册
- 2025年全国中级养老护理员职业技能A证考试题库(含答案)
- 室外栏杆底座施工方案
- 《人力资源管理》全套教学课件
- 人教版六年级数学上册教案全册
- 新人教版一年级数学上册全册教学课件(2024年秋季新教材)
- 老年高血压指南解读
- 基础烫发知识课件
- 纯电动汽车制动能量回收控制策略研究及仿真分析
- 化工公司bluesign认证资料准备清单20201201
- 骨科患者的疼痛管理
- 【公司财务风险管理问题分析国内外文献综述3000字】
- 仁爱版英语九年级(上)全册课文翻译(互译版)
评论
0/150
提交评论