TMS320F280049C 学习笔记4 Led_ex1_blinky 初始化函数及系统时钟
前言
承接上一篇学习笔记,这次开始实际运行例程。每学习一个新的DSP都是从点灯开始,这次也不例外。TI的官方帮助文档[1]可以在C:\ti\c2000\C2000Ware_2_01_00_00\device_support\f28004x\docs\F28004x_DEV_USER_GUIDE.pdf找到。里面为新人提供了step by step的入门指南以及所有例程的说明。TI提供了两套例程,其中寄存器编程的例程在C:\ti\c2000\C2000Ware_2_01_00_00\device_support\f28004x,库函数编程的例程在C:\ti\c2000\C2000Ware_2_01_00_00\driverlib\f28004x\examples。本次实验参考的例程是Led_ex1_blinky。未来学习其他型号的DSP也可以按此步骤开始。
关于条件编译
在文献[1]中有这样的描述
在CCS9.3中对应的设置为:
这个设置的目的是为了匹配不同的硬件。对于两款处理器28379D和280049C,TI分别发布了ControlCARD和LaunchPad,他们的晶振和引脚配置等各不相同。例程是针对ControlCARD开发的,如果想将其应用到LaunchPad上,自然需要更改引脚映射。具体的代码可以在devices.h中找到,部分截图如下:
需要说明的是,如果完全自己从零开始定义引脚,开发程序,并不需要理会这部分条件编译指令。
例程
这小节给出来自官方文件夹的Led闪烁实验的两份例程,第一份是库函数编程版本的,第二份是寄存器编程的。可以看出在初始化函数的调用部分有显著差别。
280049C LaunchPad的Led部分电路图如下:
库函数版:
#include "driverlib.h"
#include "device.h"# define LOOP_COUNT 10void main(void)
{// 初始化时钟和外设 Initialize device clock and peripheralsDevice_init();// 初始化GPIO并设置为推挽输出 Initialize GPIO and configure the GPIO pin as a push-pull outputDevice_initGPIO();GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD); // Push-pull output or floating inputGPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);// 初始化PIE并清空PIE寄存器,关闭CPU中断// Initialize PIE and clear PIE registers. Disables CPU interrupts. Interrupt_initModule();// 初始化PIE向量表// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).Interrupt_initVectorTable();// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)EINT;ERTM;// Loop Foreverfor(;;){// Turn on LED// 硬件电路设计是GPIO输出低电平时LED亮GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0);// 延迟0.5s Delay for a bit.DEVICE_DELAY_US(500000);// Turn off LEDGPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);// Delay for a bit.DEVICE_DELAY_US(500000);}
}
寄存器版:
#include "F28x_Project.h"#define DEVICE_GPIO_PIN_LED1 31void main(void)
{// Initialize device clock and peripheralsInitSysCtrl();// Initialize GPIO and configure the GPIO pin as a push-pull outputInitGpio();GPIO_SetupPinMux(DEVICE_GPIO_PIN_LED1, GPIO_MUX_CPU1, 0);GPIO_SetupPinOptions(DEVICE_GPIO_PIN_LED1, GPIO_OUTPUT, GPIO_PUSHPULL);// Initialize PIE and clear PIE registers. Disables CPU interrupts. DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).InitPieVectTable();// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)EINT;ERTM;// Loop Foreverfor(;;){// Turn on LEDGPIO_WritePin(DEVICE_GPIO_PIN_LED1, 0);// Delay for a bit.DELAY_US(500000);// Turn off LEDGPIO_WritePin(DEVICE_GPIO_PIN_LED1, 1);// Delay for a bit.DELAY_US(500000);}
}
初始化函数 InitSysCtrl()
讨论寄存器编程的文章比较多,这里参考[4]进行总结。
第二份代码主函数后第一条语句就是InitSysCtrl(),对芯片进行初始化,该函数的声明在f28004x_sysctrl.c中。
看门狗
芯片在上电或复位后会自动使能看门狗,所以初始化函数的第一句是将其关闭,具体代码如下:
void DisableDog(void)
{volatile Uint16 temp;EALLOW;//// Grab the clock config so we don't clobber it//temp = WdRegs.WDCR.all & 0x0007;WdRegs.WDCR.all = 0x0068 | temp;EDIS;
}
这个代码写的比过去的版本好很多,没有直接赋值,而是采用或的方式,避免了破坏其他时钟设置。
在[5]的3.1节有对EALLOW进行讨论。
在3.14.23.4节有对寄存器的每一位给出详细的解释
根据手册,关闭看门狗对应的二进制是0000 0000 0110 1000,也就是十六进制的0068
其他
剩下的部分就是初始化Flash。以目前的水平看这部分代码还比较困难,暂时跳过。
在这部分,280049C会涉及到一个叫DCC的名词,全称是Dual-Clock Comparator,主要是为了增强时钟信号的可靠性的,在[5]的第6章有论述。
系统时钟
[5]的3.7节对系统时钟做了较详细的介绍,如果阅读有困难可以先参考[7]的相关章节。
280049C的时钟需要从下列时钟源选择
- 主内置振荡器 INTOSC2 ,这是10MHz的内置的默认时钟,在系统上电时会自动调用。这个时钟也可以作为系统的主时钟,也即280049C可以不外接晶振。使用此时钟时GPIO18(X2)可以作为GPIO使用,但特性与其他GPIO稍有不同,使用时需注意。另外此时钟的精度不高,不能满足CAN通信的需求。
- 后备内置振荡器 INTOSC1。与主时钟特性相同,通常用于看门狗和时钟丢失检测。也可以配置为主时钟。
- 外部振荡器 XTAL。这个与传统的做法差不多,此时GPIO18是不能当做GPIO的,详见手册。
之后就是配置锁相环了,结构如图所示:
LaunchPad和ControlCARD的晶振是20MHz,默认100MHz主频的软件配置是:
//// PLLSYSCLK = (XTAL_OSC) * (IMULT + FMULT) / (PLLSYSCLKDIV)// 100MHz=20MHz*(10+0)/2InitSysPll(XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_2);
280049C的锁相环配置十分自由。这里的时钟配置可以玩儿很多花样,比如把时钟超频到240MHz……
另外似乎没有高速时钟的概念了,仅保留了低速时钟。
参考文献
- F28004x Firmware Development Package USER’S GUIDE
- F28377D学习系列(一)
- EINT DINT ERTM DRTM EALLOW EDIS ESTOP0的理解
- TMS320F28069 学习--------InitSysCtrl();
- TMS320F28004x Microcontrollers Technical Reference Manual
- 2,TMS320F28069 学习--------GPIO输出 流水灯
- 《手把手教你学DSP基于MS320F28335》
TMS320F280049C 学习笔记4 Led_ex1_blinky 初始化函数及系统时钟相关推荐
- TMS320F280049C 学习笔记19 可配置逻辑块 (CLB) 软件配置
文章目录 CLB tool 简介 CLB配置过程概述 软件安装 GNU Compiler Install the Simulation Viewer 使用CLB tool 导入空CLB工程 更新变量路 ...
- TMS320F280049C 学习笔记31 控制率加速器 CLA 学习随笔
文章目录 前言 文献阅读记录 整数比较时的注意点 参考文献 前言 去年在入门DSP的时候曾对控制率加速器(Control Law Accelerator, CLA)做过初步的学习[1][2],但后来的 ...
- Vue学习笔记进阶篇——Render函数
本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础
函数基础 我们代码里面所说的函数和我们上学的时候学习的什么三角函数.二次函数之类的不是一个东西 函数的概念 对于 js 来说,函数就是把任意一段代码放在一个 盒子 里面 在我想要让这段代码执行的时候, ...
- 【Python学习笔记】第八章 函数
[Python学习笔记]第八章 函数 文章目录 [Python学习笔记]第八章 函数 前言 8.1 定义函数 8.2 调用函数 8.2.1 使用位置参数调用函数 8.2.2 使用关键字参数调用函数 8 ...
- Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?)
Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?) 个人学习经验,仅供参考,欢迎各位码友批评指正. 做项目敲代码时,一直不是很理解监听函数是个什么玩意. 按我目前的理解,说白 ...
- oracle数据变化记录,学习笔记:Oracle伪列函数ora_rowscn 记录表中行数据的修改时间...
天萃荷净 Oracle数据库开发时使用伪列函数ora_rowscn查询出数据库表中行数据的修改时间 一.默认情况下 –创建t_orascn测试表 SQL> create table t_oras ...
- C语言学习笔记(8)函数
C语言学习笔记(8)函数 函数 函数主要是用于将解决复杂的编程问题分解为数个可以分开进行解决的小问题,通过函数分装,最后在拼连在一起.有利于多人协作开发. 函数同样需要先声明后调用,声明符号为 voi ...
- python 内置函数转list_python学习笔记11-python内置函数
python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...
最新文章
- Mysql商品和图片表_【mysql】数据库设计模式:多个图片怎么和商品关联
- task2:opencv的python接口图像储存、色彩空间、
- 执行虚拟机mysql脚本_mysql一键执行脚本 超方便!!!
- 高手请进关于RAID和热备
- 计算机研发部门职责,计算机研发岗位职责
- 一个小白如何创建MYSQL数据表_MySQL小白扫盲(二)--建表、添加、查询
- CF Round#436 div2
- 黑产肆虐,AI如何扛起反欺诈大旗
- ❤️《GUI编程从入门到精通》(建议收藏)❤️
- 大学计算机基础试题第一套,大学计算机基础试题及答案(完整版)
- STC 数码管显示及74HC573在其中的应用
- scratch编程-小鸟飞翔
- PHP利用qq邮箱发邮件
- 计算机科学投稿须知,《计算机科学》投稿须知
- Linux下vi命令编辑器怎样编辑,怎样保存退出
- 抖音数字人主播app
- 接雨水,Leet#42
- 【Java从零到架构师第二季】【07】JDBC FOR MySQL
- VHDL语言逻辑运算学习笔记
- 架构师小跟班:推荐一款Java在线诊断工具,arthas入门及使用教程
热门文章
- ThoughtWorks培训感想
- ps保存html和图像格式不显示,解决ps“储存为web和设备所用格式”灰色不能使用的方法...
- PID控制理解及口诀
- 【JAVA】五子棋2.0
- c语言程序转换成单片机语言,STC12C2052AD单片机AD转换C语言程序(成功)
- 猴子搬香蕉Java实现_猴子搬香蕉问题
- 更改计算机账户类型,win10系统无法更改账户类型的两种解决方案
- 美团技术团队书单(通用能力篇)
- 单元化架构之流量调度篇
- 目前我国每小时就有1名电动自行车骑行者死于交通事故