[原创] 速度上手LM4F LaunchPad 产生PWM波

sanwave   2013-8-26 10:05 楼主
发现网上关于TI的LM4F120 Launchpad 资料太少了,其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢
我只是要实现几路PWM波输出而已,昨天努力了一天,发现并不容易,至少没有可参考的例程,好在我不断地找资料,最后终于写出来了,特贴在此,供新手参考
另外,在写程序之前,还有很多要说和要做的
首先,拿到LM4F120 Launchpad,首先要做的就是装好开发环境,我用的是CCS 5.2.1,算是很新的了。在新建工程之前,还有两个个工作要做,就是安装Launchpad For Windows

驱动程序,和TI提供的Stellaris驱动库,即 StellarisWave。文档“StellarisWare软件库说明.pdf”详细说明了其安装后的文件分布。其中,外设驱动库有一份周立功翻译的文档,叫  Stellaris外设驱动库。  然后新建工程,记着目标型号选 LM4F120H5QR,Connection选 “Stellaris In-Circuit Debug Interface”。然后,剩下的工作一定要按照 “怎样使用CCS5创建Stellaris的新工程.pdf”里面所说的,当然我们的板子的型号是“ek-lm4f120xl”而非“ek-lm4f232”,要不然很容易报错。
剩下的就是写代码了。先说说我代码的大概逻辑吧,使用Timer0~Timer3产生八路周期一致的占空比互补的PWM波,通过PB的八个GPIO输出,当然,周期和占空比你都可以任意设置。
这算是我第一次发帖吧,可能有点乱,仅供新手参考。
程序是参考TI社区一提问者的,我只是把其中一路变成了八路。出处:http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/259898.aspx
下面上代码。至于文中提到的那些文档,大家可以按名字从网上搜,稍等会我也上传到网盘里,因为资料很杂,所以整理起来还是有些上火。

注意:LM4F120H5QR 本身是没有PWM模块的,只能使用Timer模块产生
  1. #include "inc/hw_memmap.h"
  2. #include "inc/hw_types.h"
  3. #include "driverlib/pwm.h"
  4. #include "driverlib/gpio.h"
  5. #include "driverlib/sysctl.h"
  6. #include "utils/uartstdio.h"
  7. #include "driverlib/timer.h"

  8. int delta=5;
  9. int value=1;

  10. void InitTimerPWM(int fullValue)
  11. {
  12.         SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  13.         SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
  14.         SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
  15.         SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);

  16.         SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

  17.         GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 );

  18.         GPIOPinConfigure(GPIO_PB0_T2CCP0);
  19.         GPIOPinConfigure(GPIO_PB1_T2CCP1);
  20.         GPIOPinConfigure(GPIO_PB2_T3CCP0);
  21.         GPIOPinConfigure(GPIO_PB3_T3CCP1);
  22.         GPIOPinConfigure(GPIO_PB4_T1CCP0);
  23.         GPIOPinConfigure(GPIO_PB5_T1CCP1);
  24.         GPIOPinConfigure(GPIO_PB6_T0CCP0);
  25.         GPIOPinConfigure(GPIO_PB7_T0CCP1);

  26.         TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
  27.         TimerLoadSet(TIMER0_BASE, TIMER_A, fullValue);
  28.         TimerLoadSet(TIMER0_BASE, TIMER_B, fullValue);
  29.         TimerEnable(TIMER0_BASE, TIMER_BOTH);
  30.         TimerMatchSet(TIMER0_BASE, TIMER_A, 0);
  31.         TimerMatchSet(TIMER0_BASE, TIMER_B, 0);

  32.         TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
  33.         TimerLoadSet(TIMER1_BASE, TIMER_A, fullValue);
  34.         TimerLoadSet(TIMER1_BASE, TIMER_B, fullValue);
  35.         TimerEnable(TIMER1_BASE, TIMER_BOTH);
  36.         TimerMatchSet(TIMER1_BASE, TIMER_A, 0);
  37.         TimerMatchSet(TIMER1_BASE, TIMER_B, 0);

  38.         TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
  39.         TimerLoadSet(TIMER2_BASE, TIMER_A, fullValue);
  40.         TimerLoadSet(TIMER2_BASE, TIMER_B, fullValue);
  41.         TimerEnable(TIMER2_BASE, TIMER_BOTH);
  42.         TimerMatchSet(TIMER2_BASE, TIMER_A, 0);
  43.         TimerMatchSet(TIMER2_BASE, TIMER_B, 0);

  44.         TimerConfigure(TIMER3_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
  45.         TimerLoadSet(TIMER3_BASE, TIMER_A, fullValue);
  46.         TimerLoadSet(TIMER3_BASE, TIMER_B, fullValue);
  47.         TimerEnable(TIMER3_BASE, TIMER_BOTH);
  48.         TimerMatchSet(TIMER3_BASE, TIMER_A, 0);
  49.         TimerMatchSet(TIMER3_BASE, TIMER_B, 0);

  50. }

  51. void updatePWM(int fullValue)
  52. {
  53.         if(value<=0 ||value>=fullValue)
  54.                 delta=-delta;
  55.         value+=delta;

  56.         TimerMatchSet(TIMER0_BASE, TIMER_A, value);
  57.         TimerMatchSet(TIMER0_BASE, TIMER_B, fullValue-value);
  58.         TimerMatchSet(TIMER1_BASE, TIMER_A, value);
  59.         TimerMatchSet(TIMER1_BASE, TIMER_B, fullValue-value);
  60.         TimerMatchSet(TIMER2_BASE, TIMER_A, value);
  61.         TimerMatchSet(TIMER2_BASE, TIMER_B, fullValue-value);
  62.         TimerMatchSet(TIMER3_BASE, TIMER_A, value);
  63.         TimerMatchSet(TIMER3_BASE, TIMER_B, fullValue-value);
  64.         SysCtlDelay(SysCtlClockGet()/100);
  65. }

  66. int main(void)
  67. {
  68.         SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

  69.         int valueMax=SysCtlClockGet()/10000;

  70.         InitTimerPWM(valueMax);

  71.         while(1)
  72.         {
  73.                 updatePWM(valueMax);
  74.         }

  75. }

[ 本帖最后由 sanwave 于 2013-8-26 10:12 编辑 ]

回复评论 (9)

谢谢楼主分享  这方面的资料是有一些少,希望楼主能多多分享一些,让其他新入手的朋友能够尽快进入状态。
加油!在电子行业默默贡献自己的力量!:)
点赞  2013-8-26 10:15

LM4F LaunchPad 上手资料打包下载

以上资料下载:https://skydrive.live.com/redir?resid=C96C6EC8AD8DCFEA!4146
点赞  2013-8-26 10:25
引用: 原帖由 sanwave 于 2013-8-26 10:25 发表
以上资料下载:https://skydrive.live.com/redir?resid=C96C6EC8AD8DCFEA!4146
咱论坛也有下载中心的:https://download.eeworld.com.cn/

初级可以一次上传50M
加油!在电子行业默默贡献自己的力量!:)
点赞  2013-8-26 10:27

回复 4楼soso 的帖子

不好意思,刚来不是很清楚,谢谢啦
点赞  2013-8-26 10:40

回复 5楼sanwave 的帖子

不客气
加油!在电子行业默默贡献自己的力量!:)
点赞  2013-8-26 10:46
不错,谢谢分享。。。。。
我的博客
点赞  2013-8-26 12:27
现在改名TM4C了,库函数发生变化了
点赞  2013-9-3 16:29
恩恩,是啊!资料很少
点赞  2013-9-12 16:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复