打印
[开发资料]

cw32l010怎么使得定时器尽量准确?

[复制链接]
96|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fox1|  楼主 | 2024-12-27 20:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fox1 于 2024-12-27 21:20 编辑

我是使用BTIM1设置100us定时,用查询方式,反转的频率在117us左右,怎么尽量减少这个误差?主频4mhz
代码如下:PSC 是3 也就是分完频1MHZ



使用特权

评论回复
沙发
fox1|  楼主 | 2024-12-27 21:01 | 只看该作者
void testBTIM(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    /* Configure the GPIO_LED pin */
    GPIO_InitStructure.Pins = GPIO_PIN_3;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
    __SYSCTRL_BTIM123_CLK_ENABLE();
    CW_SYSCTRL->APBEN2 |= SYSCTRL_KEY | SYSCTRL_APBEN2_BTIM123_Msk;
        CW_BTIM1->SMCR_f.SMS = 0;
    CW_BTIM1->CR1_f.ONESHOT = 1;
    CW_BTIM1->PSC = 3;
   

    while (1)
    {
        BTIM1_DELAY_US(100);
        PB03_TOG();
        /* code */
    }
}

// BTIM1 基地址
static const uint32_t BTIM1_BASE = 0x40004800;

// 定义 BTIM1 寄存器地址(static 限制作用域)
// 定义 BTIM1 寄存器地址
#define BTIM1_CNT (*(volatile uint32_t *)(BTIM1_BASE + 0x24)) // 计数寄存器
#define BTIM1_CR1 (*(volatile uint32_t *)(BTIM1_BASE + 0x00)) // 控制寄存器 1
#define BTIM1_ARR (*(volatile uint32_t *)(BTIM1_BASE + 0x2C)) // 计数寄存器
void BTIM1_DELAY_US(uint16_t us)
{

    BTIM1_ARR = us;
    // CW_BTIM1->ARR = us;
    // CW_BTIM1->CNT_f.CNT = 0;
    // CW_BTIM1->CR1_f.EN = 1;
    BTIM1_CNT &= 0xFFFF0000;
    BTIM1_CR1 |= 0x01;

    while (1)
    {
        if (CW_BTIM1->ISR_f.UIF == 1)
        {
            CW_BTIM1->ISR;
            CW_BTIM1->ICR_f.UIF = 0;
            break;
        }
        /* code */
    }
}

使用特权

评论回复
板凳
fox1|  楼主 | 2024-12-27 21:21 | 只看该作者

image.png

使用特权

评论回复
地板
fox1|  楼主 | 2024-12-27 21:21 | 只看该作者

image.png

image.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

20

帖子

0

粉丝