CC32xx-PWM 实验 片内定时器功能介绍 ( 使用的 mcu 外设和上一个节内容是一样的 ) 该 CC320 包含 4 个 32 位用户可编程通用定时 (GPTA0~3 或有文档标注为 TIMERA0~3),GPT 可以用于对具有定时器复用功能的管脚进入的外部事件进行计数或计时, 也可以在输出引脚上产生脉冲宽度调试 (PWM) 信号 每个 GPT 模块包含两个 16 位定时 / 计数器 (TimerA 和 TimerB), 可以作为定时器或事件计数器独立工作, 也可以作为单独的一个 32 位定时器工作 GPT 模块具有如下特性 : 操作模式 16 位或者 32 位可编程单次定时器 16 位或者 32 位可编程周期定时器 16 位通用定时器, 带 8 位预分频器 16 位输入边沿计数货时间捕捉模式, 带 8 位预分频器 16 位脉冲宽度调制 (PWM) 模式, 带 8 位预分频器和软件可编程输出反相 向上或向下计数 16 个 16 位 /32 位捕捉比较 PWM(CCP) 引脚 可以确定产生定时器中断到进入中断服务程序 (ISR) 的时间 可以触发使用 DMA 的高效传输 系统时钟运行 (80MHz) 电路分析这个应用程序是使用 CC3200 GPTA0A 分别通过 GPIO_09(PIN_64) 和 GPIO_11(PIN_02) 控制核心板上的指示 LED 和学习板上的用户指示 LED 闪烁, 闪烁周期核心板上 2s, 学习板上是 1s 图 1 核心板板上 LED 电路 图 2 学习板板上的 LED 电路 表 1 外设输出对应硬件信号引脚 GPIO 功能引脚名称引脚位置 核心板 LED 控制 GPIO09 PIN64 学习板 LED1 控制 CPIO10 PIN1
学习板 LED2 控制 CPIO11 PIN2 OLED 接口电路 : 图 2 OLED 接口电路 表 2 外 OLED 对应硬件信号引脚 OLED 功能引脚名称引脚位置 OLED_CS GPIO22 PIN15 OLED_MOSI GPIO07 PIN62 OLED_CLK GPIO08 PIN63 程序分析 : GPT_timer 项目包含下列 5 个程序文件 mian.c: 主程序文件 pinmux.c:pinmux 应用程序生成的 GPIO 引脚配置程序文件 startup_ewarm,c:iar 启动程序文件 程序流程图程序主流程 : 开始 初始化开发板 BoardInit(); GPIO 引脚复用配置 PinMuxConfig(); 初始化 oled 和串口 OLED_Init(); InitTerm(); 初始化 PWM InitPWMModules(); 1 while(1) ;
主循环流程 : 循环计数 =0 循环计数 <255 No Yes 更新 PMW 占空比 UpdateDutyCycle(); 延时 初始化 PWM 流程 : 初始化 PMW 允许定时器时钟 MAP_PRCMPeripheralClkEnable(); 设置 PWM 模式 SetupTimerPWMMode(); 允许定时器 MAP_TimerEnable(); 返回 更新 pwm 流程 : 更新 PWM 占空比 设置定时器匹配 MAP_TimerMatchSet(); 返回 设置 PWM 模式 :
设置 PWM 模式 配置定时器中断 MAP_TimerConfigure(); 设置预分频 MAP_TimerPrescaleSet(); 控制输出电平 MAP_TimerControlLevel(); 设置定时器初始值 MAP_TimerLoadSet(); 设置定时器匹配 MAP_TimerMatchSet( 返回 编程步骤 运行 TI PinMux 软件, 选择 CC3200 设备, 开始配置 选择 GPIO 项目勾选相应的引脚并选择对应的状态
生成对应的 C 文件和 H 文件 将生成的 pin_mux_config.c 和 pin_mux_config.h 加载到 CC3200 的模板 IAR 程序工程中 在 IAR 中完成对对函数的调用和编程思路的具体操作 程序具体分析 main 函数编写过程, 就是将程序编程思路过程 C 语言具体化, 在 main 函数中初始化各种外设, 同时包括设置定时器中断和启动定时器, 内容如下 : void main() int iloopcnt; BoardInit(); 板子初始化 PinMuxConfig(); 引脚初始化 InitTerm(); 初始化串口 DisplayBanner(APP_NAME); 串口输出名称 OLED_Init();OLED 初始化 OLED_DispStr(0, 0, " 源地仪器 PWM", &tfont12); InitPWMModules(); while(1) 改变定时器占空比从而控制三个 LED 亮度, 使用一个延时看出变化效果
for(iloopcnt = 0; iloopcnt < 255; iloopcnt++) UpdateDutyCycle(TIMERA2_BASE, TIMER_B, iloopcnt); UpdateDutyCycle(TIMERA3_BASE, TIMER_B, iloopcnt); UpdateDutyCycle(TIMERA3_BASE, TIMER_A, iloopcnt); MAP_UtilsDelay(100000); MCU 初始化子函数, 在这里因为要用到延迟功能, 所以要进行中断向量表的设置, 并且要运行处理器中断, 具体函数如下 : MCU 初始化 static void BoardInit(void) MAP_IntVTableBaseSet((unsigned long)& vector_table); 设置中断向量表 MAP_IntMasterEnable(); 运行处理器中断 MAP_IntEnable(FAULT_SYSTICK); 允许 SYS Tick 中断,FAULT_SYSTICK 的中断号 15 PRCMCC3200MCUInit(); 初始化 MCU 再使用串口之前需要对其引脚进行硬件初始化, 使之具备相应的物理特性, 引脚初始化程序如下 : Enable Peripheral Clocks MAP_PRCMPeripheralClkEnable(PRCM_UARTA0, PRCM_RUN_MODE_CLK); Configure PIN_55 for UART0 UART0_TX MAP_PinTypeUART(PIN_55, PIN_MODE_3); Configure PIN_57 for UART0 UART0_RX MAP_PinTypeUART(PIN_57, PIN_MODE_3); 关于串口的参数设计程序如下 : void InitTerm() #ifndef NOTERM MAP_UARTConfigSetExpClk(CONSOLE,MAP_PRCMPeripheralClockGet(CONSOLE_PERIPH), UART_BAUD_RATE, (UART_CONFIG_WLEN_8 UART_CONFIG_STOP_ONE UART_CONFIG_PAR_NONE)); #endif Errorlog = 0; OLED 初始化状态, 程序如下 : void OLED_Init(void) OLED_InitHard(); /* 初始化 OLED 硬件 */ OLED_ClrScr(0x00); /* 清屏,0x00 表示黑底 ; 0xFF 表示白底 */ /* 设置字体参数 */ tfont16.usfontcode = FC_ST_16; /* 字体代码 16 点阵 */ tfont16.ustextcolor = 1; /* 字体颜色 0 或 1 */ tfont16.usbackcolor = 0; /* 文字背景颜色 0 或 1 */ tfont16.usspace = 0; /* 文字间距, 单位 = 像素 */ tfont12.usfontcode = FC_ST_12; /* 字体代码 12 点阵 */
tfont12.ustextcolor = 1; /* 字体颜色 0 或 1 */ tfont12.usbackcolor = 0; /* 文字背景颜色 0 或 1 */ tfont12.usspace = 1; /* 文字间距, 单位 = 像素 */ 通过 OLED 显示应用名称 : OLED_DispStr(0, 0, " 源地仪器 pwm", &tfont12); 更新占空比子函数 : /*****************************************************************************/ 程序 : 名称更新占空比 参数 :ulbase 定时器的基地址 参数 :ultimer 定时器制定 (TIMER_A or TIMER_B) 参数 :uclevel PWM 占空比设置 (0:255) 功能 : 指定的定时器更新相应的占空比的数值 返回 : 无 /*****************************************************************************/ void UpdateDutyCycle(unsigned long ulbase, unsigned long ultimer, unsigned char uclevel) 新的匹配值在下个周期生效 MAP_TimerMatchSet(ulBase,ulTimer,(ucLevel*DUTYCYCLE_GRANULARITY)); 初始化 PWM 子函数 : **************************************************************************** 初始化定时器 参数 : 无 功能介绍 : 1. 分配 TIMERA2 (TIMER B) 到核心板上指示灯 GPIO09 PIN64 PWM5 2. 分配 TIMERA3 (TIMER B) 到学习底板指示灯 1 GPIO10 PIN1 PWM6 3. T 分配 IMERA3 (TIMER A) 到学习底板指示灯 2 GPIO11 PIN2 PWM7 返回 : 无. **************************************************************************** void InitPWMModules() 初始化定时器产生 PWM 输出 MAP_PRCMPeripheralClkEnable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK); MAP_PRCMPeripheralClkEnable(PRCM_TIMERA3, PRCM_RUN_MODE_CLK); 1. 分配 TIMERA2 (TIMER B) 到核心板上指示灯 GPIO09 PIN64 --> PWM_5 SetupTimerPWMMode(TIMERA2_BASE, TIMER_B, (TIMER_CFG_SPLIT_PAIR TIMER_CFG_B_PWM), 1); 2. 分配 TIMERA3 (TIMER B) 到学习底板指示灯 1 GPIO10 PIN1 PWM6 SetupTimerPWMMode(TIMERA3_BASE, TIMER_A, (TIMER_CFG_SPLIT_PAIR TIMER_CFG_A_PWM TIMER_CFG_B_PWM), 1); 3. T 分配 IMERA3 (TIMER A) 到学习底板指示灯 2 GPIO11 PIN2 PWM7 SetupTimerPWMMode(TIMERA3_BASE, TIMER_B, (TIMER_CFG_SPLIT_PAIR TIMER_CFG_A_PWM TIMER_CFG_B_PWM), 1);
MAP_TimerEnable(TIMERA2_BASE,TIMER_B); MAP_TimerEnable(TIMERA3_BASE,TIMER_A); MAP_TimerEnable(TIMERA3_BASE,TIMER_B); 设置定时器的 PMW 模式子函数程序 : /*****************************************************************************/ 程序 : 设置定时器的 PMW 模式 参数 :ulbase 定时器的基地址 参数 :ultimer 定时器制定 (TIMER_A or TIMER_B) 参数 :ulconfig PWM 指定的模式 参数 : ucinvert:s 是否是反转 功能 : 配置 pwm 模式 返回 : 无 /*****************************************************************************/ void SetupTimerPWMMode(unsigned long ulbase, unsigned long ultimer, unsigned long ulconfig, unsigned char ucinvert) Set GPT - Configured Timer in PWM mode. MAP_TimerConfigure(ulBase,ulConfig); MAP_TimerPrescaleSet(ulBase,ulTimer,0); Inverting the timer output if required MAP_TimerControlLevel(ulBase,ulTimer,ucInvert); Load value set to ~0.5 ms time period MAP_TimerLoadSet(ulBase,ulTimer,TIMER_INTERVAL_RELOAD); Match value set so as to output level 0 MAP_TimerMatchSet(ulBase,ulTimer,TIMER_INTERVAL_RELOAD); 实验过程 : 1. 打开串口调试软件并按照一下参数设置好 端口号 : pc 枚举使用的串口端口号 波特率 : 115200 数据位 : 8 bit 同步位 : None
停止位 : 1 bit 流控制 : None 2. 在程序开始运行后, 会自动显示参数 3 核心板板上蓝灯和学习板上的指示灯循环由暗到亮变化