2210|5

441

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【 HC32F4A0开发板】定时器0测试 [复制链接]

 

这篇来学习下定时器0的配置和应用,通过定时器0来学习,实现1MS定时中断。

 

一、定时器0时钟

定时器0有两个通道A和B,这里使用定时器0的通道B,时钟选择PCLK1。

 

PCLK1在主时钟的位置

 

二、程序部分

2.1、主时钟部分

PCLK1经2分频后得到120MHz频率的时钟。

__WEAKDEF void BSP_CLK_Init(void)
{
    stc_clock_xtal_init_t stcXtalInit;
    stc_clock_pll_init_t stcPLLHInit;

    /* PCLK0, HCLK  Max 240MHz */
    /* PCLK1, PCLK4 Max 120MHz */
    /* PCLK2, PCLK3 Max 60MHz  */
    /* EX BUS Max 120MHz */
    CLK_SetClockDiv(CLK_BUS_CLK_ALL, \
                    (CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | CLK_PCLK2_DIV4 | \
                     CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2 | CLK_EXCLK_DIV2 | \
                     CLK_HCLK_DIV1));

    GPIO_AnalogCmd(BSP_XTAL_PORT, BSP_XTAL_IN_PIN | BSP_XTAL_OUT_PIN, ENABLE);
    (void)CLK_XtalStructInit(&stcXtalInit);
    /* Config Xtal and enable Xtal */
    stcXtalInit.u8Mode   = CLK_XTAL_MD_OSC;
    stcXtalInit.u8Drv    = CLK_XTAL_DRV_ULOW;
    stcXtalInit.u8State  = CLK_XTAL_ON;
    stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
    (void)CLK_XtalInit(&stcXtalInit);

    (void)CLK_PLLStructInit(&stcPLLHInit);
    /* VCO = (8/1)*120 = 960MHz*/
    stcPLLHInit.u8PLLState = CLK_PLL_ON;
    stcPLLHInit.PLLCFGR = 0UL;
    stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
    stcPLLHInit.PLLCFGR_f.PLLN = 120UL - 1UL;
    stcPLLHInit.PLLCFGR_f.PLLP = 4UL - 1UL;
    stcPLLHInit.PLLCFGR_f.PLLQ = 4UL - 1UL;
    stcPLLHInit.PLLCFGR_f.PLLR = 4UL - 1UL;
    stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
    (void)CLK_PLLInit(&stcPLLHInit);

    /* Highspeed SRAM set to 0 Read/Write wait cycle */
    SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);

    /* SRAM1_2_3_4_backup set to 1 Read/Write wait cycle */
    SRAM_SetWaitCycle((SRAM_SRAM123 | SRAM_SRAM4 | SRAM_SRAMB), SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);

    /* 0-wait @ 40MHz */
    (void)EFM_SetWaitCycle(EFM_WAIT_CYCLE5);

    /* 4 cycles for 200 ~ 250MHz */
    GPIO_SetReadWaitCycle(GPIO_RD_WAIT4);

    CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
}

2.2、timer0.c

#include "main.h"
#include "led.h"

/* TMR0 unit and channel definition */
#define TMR0_UNIT                       (CM_TMR0_1)
#define TMR0_CH                         (TMR0_CH_B)
#define TMR0_CH_INT                     (TMR0_INT_CMP_B)
#define TMR0_CH_FLAG                    (TMR0_FLAG_CMP_B)
#define TMR0_INT_SRC                    (INT_SRC_TMR0_1_CMP_B)
#define TMR0_IRQn                       (INT006_IRQn)

void init_timer0(void)
{
    stc_tmr0_init_t stcTmr0Init;
    stc_irq_signin_config_t stcIrqSignConfig;

    (void)TMR0_StructInit(&stcTmr0Init);
    stcTmr0Init.u32ClockSrc     = TMR0_CLK_SRC_INTERN_CLK;
    stcTmr0Init.u32ClockDiv     = TMR0_CLK_DIV8;
    stcTmr0Init.u32Func         = TMR0_FUNC_CMP;
    stcTmr0Init.u16CompareValue = 15000;
    (void)TMR0_Init(TMR0_UNIT, TMR0_CH, &stcTmr0Init);

    TMR0_HWStopCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
    TMR0_IntCmd(TMR0_UNIT, TMR0_CH_INT, ENABLE);
	
    stcIrqSignConfig.enIntSrc    = TMR0_INT_SRC;
    stcIrqSignConfig.enIRQn      = TMR0_IRQn;
    stcIrqSignConfig.pfnCallback = &TMR0_CompareIrqCallback;
    (void)INTC_IrqSignIn(&stcIrqSignConfig);
    NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
    NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
		
    TMR0_Start(TMR0_UNIT, TMR0_CH);	
}

定时器输入时钟的选择

a> 时钟选择内部的PCLK1时钟

b> 分频选择分频 ,输入时钟的内部时钟=120/8=15MHz

c> 输出比较功能

d> 实现1ms的比较值=15000,15个时钟是1us,15*1000实现1MS;

2.3、定时器0中断

 uint32_t t0_cnt=0;
static void TMR0_CompareIrqCallback(void)
{	
		t0_cnt++;
		if(t0_cnt>99)
		{
			t0_cnt=0;
			BSP_LED_Toggle(LED_BLUE);
		}
    
		led1_tog();
    TMR0_ClearStatus(TMR0_UNIT, TMR0_CH_FLAG);
}

 

三、输出波形

测量led1(PE2)的波形:

最新回复

挺好,国产满意   详情 回复 发表于 2023-2-24 16:14
点赞 关注
 
 

回复
举报

6471

帖子

10

TA的资源

版主

沙发
 

通道A和通道B有什么区别吗?为什么要这么分          

点评

从资料上看,通道A和通道B有着相同的结构,可以单独配置,不通的中断地址。和之前使用的其他芯片定时器不太一样。  详情 回复 发表于 2023-2-24 05:56
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

441

帖子

3

TA的资源

纯净的硅(高级)

板凳
 
秦天qintian0303 发表于 2023-2-23 21:35 通道A和通道B有什么区别吗?为什么要这么分          

从资料上看,通道A和通道B有着相同的结构,可以单独配置,不通的中断地址。和之前使用的其他芯片定时器不太一样。

 
 
 

回复

6972

帖子

11

TA的资源

版主

4
 
例子配置非常详细,这示波器非常有特色呀。什么牌子的。

点评

老掉牙的TEK示波器  详情 回复 发表于 2023-2-24 13:59
 
 
 

回复

441

帖子

3

TA的资源

纯净的硅(高级)

5
 
lugl4313820 发表于 2023-2-24 07:50 例子配置非常详细,这示波器非常有特色呀。什么牌子的。

老掉牙的TEK示波器

 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

6
 

挺好,国产满意

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
PCB设计中格点的设置

PCB设计中格点的设置合理的使用格点系统,能是我们在PCB设计中起到事半功倍的作用。但何谓合理呢? 很多人认为格点设置的越小越好 ...

STN-LCD彩屏模块

摘要:本文介绍了彩色STN-LCD模块的内部结构、主要器件,以及设计选用要求。 关键词:彩色STN-LCD模块 LCM LED 电荷泵 升压 ...

寻迹小车设计

一. 起因、目标及车体设计 一、 概述以自制方式为主制作一辆低成本的寻迹小车,用于学习嵌入式应用(单片机),这个项目有两 ...

Stellaris资料整理贴

//--------------------------------------2010.3.25---------------------------------------- 1. Stellaris大全(不断更新) ...

0-5V转换-20mA V/I电路分析

60110

使用MSP430G2 LaunchPad开发板连接步进电机

如何使用MSP430 LaunchPad开发板连接一个步进电机。 MSP-EXP430G2是德州仪器(TI)提供的开发工具,又名LaunchPad,用于学习和练 ...

#AI挑战营终点站# rv1106数字识别模型部署

本帖最后由 打破传统 于 2024-5-29 10:39 编辑 参考https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-SDK 进行了SD ...

测评汇总:拥抱AIGC 应用ChatGPT和OpenAI API

活动详情:【拥抱AIGC 应用ChatGPT和OpenAI API】更新至 2024-10-10测评报告汇总:@皓月光兮非自明 《拥抱AIGC》四、OpenAI与GPT ...

【Follow me第二季第4期】任务一:搭建环境并开启第一步Blink三色LED / 串口打印He...

本帖最后由 mingzhe123 于 2024-12-1 12:14 编辑 2024年得捷电子和eeworld论坛联合举办的Follow me活动第二季已经进行到第4期 ...

如何用FPGA平台编写一个信号的2048点DFT,不使用fft的ip核

不使用fft的ip核实现信号2048点DFT

关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表