凌乱的DSP笔记(2)-LED流水灯
1. F28335的时钟系统
1.1 时钟来源
F28335的时钟源有两种:
- 采用外部振荡器作为时钟源(简称外部时钟),在XCLKIN引脚提供一个一定频率的时钟信号,或通过复用的X1引脚接入,即由其他数字系统或外部振荡器引入;
- 采用F28335内部振荡器作为时钟源(简称内部时钟),在X1与X2之间接入一个晶体,就可以产生时钟源。
外部时钟源信号有两种:
- 3.3V外部时钟源信号直接接入XCLKIN引脚,X1引脚接地,X2引脚悬空;
- 1.9V外部时钟源信号直接接入X1引脚,XCLKIN引脚接地,x2引脚悬空。
内部信号时钟源接法:
典型做法是在X1和X2之间接入30MHz晶振,内部锁相环10倍频,然后二分频。
锁相环模块除了为C28X内核提供时钟外,还通过系统时钟输出提供快速和慢速2中外设时钟,从而提高处理器的灵活性和可靠性。在具体应用中,将不使用的外设时钟禁止,还可以降低系统功耗。
1.2 时钟单元相关寄存器
1. 锁相环状态寄存器PLLSTS
- 15~9位:保留;
- 8~7位:DIVSEL,时钟分频选择;
- 00 01——4分频
- 10——2分频
- 11——1分频
- 6位:MCLKOFF,丢失时钟检测关闭位;
- 0——默认设置,主振荡器时钟丢失检测使能
- 1——主振荡器时钟丢失检测禁止
- 5位:OSCOFF,控制振荡器时钟信号,该位为1,振荡器信号允许通过,兵分两路,一路直接过去,一路进入锁相环模块;
- 4位:MCLKCLR,丢失时钟清除位,若该位写0,无效,写1强制丢失时钟信号检测电路清除和复位;
- 3位:MCLKSTS, 丢失时钟信号状态位,0为正常模式,表示时钟信号没有丢失,1表示时钟信号丢失,CPU工作在无序频率模式;
- 2位:PLLOFF,锁相器关闭位;
- 1位:保留;
- 0位:PLLOCKS:锁相器锁状态位。
2. 高/低速外设时钟预分频寄存器HISPCP/LOSPCP
高速外设时钟预分频寄存器位分配:
低速外设时钟预分频寄存器位分配:
3. 锁相环控制寄存器PLLCR
时钟初始化函数:
void InitSysCtrl(void) { // Disable the watchdog DisableDog(); // Initialize the PLL control: PLLCR and DIVSEL // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h InitPll(DSP28_PLLCR,DSP28_DIVSEL); // Initialize the peripheral clocks InitPeripheralClocks(); }
2. GPIO介绍
2.1 GPIO分组
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。
TMS320F28335共有176引脚,其中88个是GPIO管脚。
A组:GPIO 0~31,B组:GPIO 32~63,C组:GPIO 64~87。
2.2 采样
采样滤波电路——滤除干扰信号:
2.3 GPIO相关寄存器
A组为例:
外部中断:
3. 硬件介绍
4. 软件设计
(1)初始化LED控制IO口(使能对应IO外设时钟、配置IO为普通IO功能和输出模式、上拉设置等)
(2)LED控制程序
4.1 leds.c
/* * leds.c * * Created on: 2020年4月6日 * Author: lenovo */ #include "leds.h" /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LED_Init(void) { EALLOW;//关闭写保护 SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟 //LED1端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能 GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出 GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻 //LED2端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO67=0; GpioCtrlRegs.GPCDIR.bit.GPIO67=1; GpioCtrlRegs.GPCPUD.bit.GPIO67=0; //LED3端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO66=0; GpioCtrlRegs.GPCDIR.bit.GPIO66=1; GpioCtrlRegs.GPCPUD.bit.GPIO66=0; //LED4端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO65=0; GpioCtrlRegs.GPCDIR.bit.GPIO65=1; GpioCtrlRegs.GPCPUD.bit.GPIO65=0; //LED5端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO64=0; GpioCtrlRegs.GPCDIR.bit.GPIO64=1; GpioCtrlRegs.GPCPUD.bit.GPIO64=0; //LED6端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO10=0; GpioCtrlRegs.GPADIR.bit.GPIO10=1; GpioCtrlRegs.GPAPUD.bit.GPIO10=0; //LED7端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO11=0; GpioCtrlRegs.GPADIR.bit.GPIO11=1; GpioCtrlRegs.GPAPUD.bit.GPIO11=0; //初始输出高电平(LED熄灭) GpioDataRegs.GPCSET.bit.GPIO68=1; GpioDataRegs.GPCSET.bit.GPIO67=1; GpioDataRegs.GPCSET.bit.GPIO66=1; GpioDataRegs.GPCSET.bit.GPIO65=1; GpioDataRegs.GPCSET.bit.GPIO64=1; GpioDataRegs.GPASET.bit.GPIO10=1; GpioDataRegs.GPASET.bit.GPIO11=1; EDIS;//开启写保护 }
GPCMUX1控制GPIO64~79
4.2 leds.h
/* * leds.h * * Created on: 2020年4月6日 * Author: lenovo */ #ifndef LEDS_H_ #define LEDS_H_ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #define LED1_OFF (GpioDataRegs.GPCSET.bit.GPIO68=1) #define LED1_ON (GpioDataRegs.GPCCLEAR.bit.GPIO68=1) #define LED1_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1) #define LED2_OFF (GpioDataRegs.GPCSET.bit.GPIO67=1) #define LED2_ON (GpioDataRegs.GPCCLEAR.bit.GPIO67=1) #define LED2_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1) #define LED3_OFF (GpioDataRegs.GPCSET.bit.GPIO66=1) #define LED3_ON (GpioDataRegs.GPCCLEAR.bit.GPIO66=1) #define LED3_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1) #define LED4_OFF (GpioDataRegs.GPCSET.bit.GPIO65=1) #define LED4_ON (GpioDataRegs.GPCCLEAR.bit.GPIO65=1) #define LED4_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1) #define LED5_OFF (GpioDataRegs.GPCSET.bit.GPIO64=1) #define LED5_ON (GpioDataRegs.GPCCLEAR.bit.GPIO64=1) #define LED5_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1) #define LED6_OFF (GpioDataRegs.GPASET.bit.GPIO10=1) #define LED6_ON (GpioDataRegs.GPACLEAR.bit.GPIO10=1) #define LED6_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO10=1) #define LED7_OFF (GpioDataRegs.GPASET.bit.GPIO11=1) #define LED7_ON (GpioDataRegs.GPACLEAR.bit.GPIO11=1) #define LED7_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO11=1) void LED_Init(void); #endif /* LEDS_H_ */
利用宏定义便于电平切换。
4.3 main.c
/* * main.c * * Created on: 2020年4月6日 * Author: lenovo */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "leds.h" /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,通过循环占用CPU,达到延时功能 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void delay(void) { Uint16 i; Uint32 j; for(i=0;i<32;i++) for (j = 0; j < 50000; j++); } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { InitSysCtrl(); LED_Init(); while(1) { LED5_OFF;LED1_ON;delay(); LED1_OFF;LED2_ON;delay(); LED2_OFF;LED3_ON;delay(); LED3_OFF;LED4_ON;delay(); LED4_OFF;LED5_ON;delay(); } }
4.4 效果