最近转战到TI的Cortex M4平台后,发现网上关于TI的LM4F120 Launchpad 资料太少了,而且其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢。

我只是要实现几路PWM波输出而已,昨天努力了一天,发现并不容易,至少没有找到可参考的例程,好在我不断地找资料,最后终于写出来了,特贴在此,供新手参考
另外,在写程序之前,还有很多要说和要做的。  

首先,拿到LM4F120 Launchpad,首先要做的就是装好开发环境,我用的是CCS 5.2.1,算是很新的了。在新建工程之前,还有两个工作要做,就是安装Stellaris ICDI的驱动程序和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模块产生
以上资料打包下载: https://skydrive.live.com/redir?resid=C96C6EC8AD8DCFEA!4146

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pwm.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "utils/uartstdio.h"
#include "driverlib/timer.h" int delta=5;
int value=1; void InitTimerPWM(int fullValue) {
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); 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 ); GPIOPinConfigure(GPIO_PB0_T2CCP0);
GPIOPinConfigure(GPIO_PB1_T2CCP1);
GPIOPinConfigure(GPIO_PB2_T3CCP0);
GPIOPinConfigure(GPIO_PB3_T3CCP1);
GPIOPinConfigure(GPIO_PB4_T1CCP0);
GPIOPinConfigure(GPIO_PB5_T1CCP1);
GPIOPinConfigure(GPIO_PB6_T0CCP0);
GPIOPinConfigure(GPIO_PB7_T0CCP1); TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |
TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
TimerLoadSet(TIMER0_BASE, TIMER_A, fullValue);
TimerLoadSet(TIMER0_BASE, TIMER_B, fullValue);
TimerEnable(TIMER0_BASE, TIMER_BOTH);
TimerMatchSet(TIMER0_BASE, TIMER_A, 0);
TimerMatchSet(TIMER0_BASE, TIMER_B, 0); TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR |
TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
TimerLoadSet(TIMER1_BASE, TIMER_A, fullValue);
TimerLoadSet(TIMER1_BASE, TIMER_B, fullValue);
TimerEnable(TIMER1_BASE, TIMER_BOTH);
TimerMatchSet(TIMER1_BASE, TIMER_A, 0);
TimerMatchSet(TIMER1_BASE, TIMER_B, 0); TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR |
TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
TimerLoadSet(TIMER2_BASE, TIMER_A, fullValue);
TimerLoadSet(TIMER2_BASE, TIMER_B, fullValue);
TimerEnable(TIMER2_BASE, TIMER_BOTH);
TimerMatchSet(TIMER2_BASE, TIMER_A, 0);
TimerMatchSet(TIMER2_BASE, TIMER_B, 0); TimerConfigure(TIMER3_BASE, TIMER_CFG_16_BIT_PAIR |
TIMER_CFG_A_PWM | TIMER_CFG_B_PWM );
TimerLoadSet(TIMER3_BASE, TIMER_A, fullValue);
TimerLoadSet(TIMER3_BASE, TIMER_B, fullValue);
TimerEnable(TIMER3_BASE, TIMER_BOTH);
TimerMatchSet(TIMER3_BASE, TIMER_A, 0);
TimerMatchSet(TIMER3_BASE, TIMER_B, 0); } void updatePWM(int fullValue) {
if(value<=0 ||value>=fullValue)
delta=-delta;
value+=delta; TimerMatchSet(TIMER0_BASE, TIMER_A, value);
TimerMatchSet(TIMER0_BASE, TIMER_B, fullValue-value);
TimerMatchSet(TIMER1_BASE, TIMER_A, value);
TimerMatchSet(TIMER1_BASE, TIMER_B, fullValue-value);
TimerMatchSet(TIMER2_BASE, TIMER_A, value);
TimerMatchSet(TIMER2_BASE, TIMER_B, fullValue-value);
TimerMatchSet(TIMER3_BASE, TIMER_A, value);
TimerMatchSet(TIMER3_BASE, TIMER_B, fullValue-value);
SysCtlDelay(SysCtlClockGet()/100);
} int main(void) {
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC |
SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
int valueMax=SysCtlClockGet()/10000;
InitTimerPWM(valueMax);
while(1) {
updatePWM(valueMax);
}
}

速度上手LM4F LaunchPad 输出多路PWM波的更多相关文章

  1. STM32F103定时器输出PWM波控制直流电机

    这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32高级定时器输出PWM波驱动直流电机的问题.. 要想用定时器输出的PWM控制直流电机,,首先要理解“通道”的概念..一个定 ...

  2. 定时器同步+触发三ADC采样+输出6路PWM波

    为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ...

  3. PWM波控制舵机总结

    文章转自:http://www.geek-workshop.com/thread-70-1-1.html 一.关于舵机: 舵机(英文叫Servo):它由直流电机.减速齿轮组.传感器和控制电路组成的一套 ...

  4. 使用引脚模拟PWM波控制引脚

    /********************************* 代码功能:输出PWM波控制引脚 使用函数: 创作时间:2016*10*07 作者邮箱:jikexianfeng@outlook.c ...

  5. STM32 PWM波

    利用STM32产生占空比可以调节的PWM波 科普:pwm(Pulse Width Modulation)脉宽调制 关于pwm波的产生:1.首先来看一下代码: pwm波模式的相关配置(利用的是定时器TI ...

  6. STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  7. 进阶之路(基础篇) - 005 模拟PWM波控制引脚

    /********************************* 代码功能:输出PWM波控制引脚 使用函数: 创作时间:2016*10*07 作者邮箱:jikexianfeng@outlook.c ...

  8. stm32cube--通用定时器--产生pwm波

    看了通用定时器的资料,发现内容挺多,挺难看懂,现在还是先掌握使用方法,以后再多看几遍吧. ① ② ③生成mdk工程后,在main.c的while(1)前面加上HAL_TIM_PWM_Start(&am ...

  9. 利用MDK4中的逻辑分析仪分析IO口的PWM波

    1.先设置软件仿真 ,可参看STM32不完全手册的2.4的软件仿真这一章 (原文件名:1.jpg) Example functionality:                             ...

随机推荐

  1. C#压缩文件夹至zip,不包含所选文件夹【转+修改】

    转自园友:jimcsharp的博文C#实现Zip压缩解压实例[转] 在此基础上,对其中的压缩文件夹方法略作修正,并增加是否对父文件夹进行压缩的方法.(因为笔者有只压缩文件夹下的所有文件,却不想将选中的 ...

  2. R语言学习 - 线图一步法

    首先把测试数据存储到文件中方便调用.数据矩阵存储在line_data.xls和line_data_melt.xls文件中 (直接拷贝到文件中也可以,这里这么操作只是为了随文章提供个测试文件,方便使用. ...

  3. 微信浏览器播放音频的问题:preload属性

    测试工具:ios微信. h5的Audio对象有个很重要的属性:preload;preload 属性规定是否在页面加载后载入音频.有4个值:auto - 当页面加载后载入整个音频meta - 当页面加载 ...

  4. Angular ZoneJS 原理

    Zone.js到底是如何工作的? 原文链接: blog.kwintenp.com 如果你阅读过关于Angular 2变化检测的资料,那么你很可能听说过zone.Zone是一个从Dart中引入的特性并被 ...

  5. A5. JVM 如何判断GC对象

    [概述] 在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还 “存活” 着,哪些已经 “死去”(即不可能再被任何途径使用的对象). ...

  6. JavaScript ES6 数组新方法 学习随笔

    JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...

  7. 迷宫自动生成以及基于DFS的自动寻路算法

    直接贴代码 #include<ctime> #include<conio.h> #include<iostream> #include<windows.h&g ...

  8. tomcat7解决jsp参数传递的中文乱码问题

    解决jsp参数传递的中文乱码问题 制作人:全心全意 在jsp页面中,通过参数传递传递中文时,在显示参数值时中文内容变成了乱码.这是因为请求参数的文字编码方式与页面中的不一致造成的,所有的request ...

  9. Set Map List Iterator

    Set和Map类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在Set中,没有重复的key. Map放没有顺序的键值对,所有键值对 — 参见 entrySet(),所有键 — ...

  10. 关于使用CELERY的一点心得

    使用也有大半年了.稳定性没话说啊. 但有一个坑,是我以前没注意的,记录下来. 就是本来一个任务是可以异步并行执行的..但如何需要CELERY的执行结果来作判断的话,就会变得异步串行的. 这要值得注意. ...