硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5232|回复: 3
收起左侧

[有问必答] 想要使用MAX5144输出1khz正弦波,每个周期20个点,现在用定时器TIM3输入点,但是没有波产生,下面是一些相关的程序,求指点迷津

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2020-12-4 15:52:10 | 显示全部楼层 |阅读模式
void bsp_InitTimer(void)
{
        uint8_t i;

        /* 清零所有的软件定时器 */
        for (i = 0; i < TMR_COUNT; i++)
        {
                s_tTmr[i].Count = 0;
                s_tTmr[i].PreLoad = 0;
                s_tTmr[i].Flag = 0;
                s_tTmr[i].Mode = TMR_ONCE_MODE;        /* 缺省是1次性工作模式 */
        }

        /*
                配置systic中断周期为1ms,并启动systick中断。

            SystemCoreClock 是固件中定义的系统内核时钟,对于STM32F4XX,一般为 168MHz

            SysTick_Config() 函数的形参表示内核时钟多少个周期后触发一次Systick定时中断.
                    -- SystemCoreClock / 1000  表示定时频率为 1000Hz, 也就是定时周期为  1ms
                    -- SystemCoreClock / 500   表示定时频率为 500Hz,  也就是定时周期为  2ms
                    -- SystemCoreClock / 2000  表示定时频率为 2000Hz, 也就是定时周期为  500us

            对于常规的应用,我们一般取定时周期1ms。对于低速CPU或者低功耗应用,可以设置定时周期为 10ms
    */
        SysTick_Config(SystemCoreClock / 2000);
        bsp_InitHardTimer();
}
#if defined (USE_TIM2) || defined (USE_TIM3)  || defined (USE_TIM4)        || defined (USE_TIM5)
void bsp_InitHardTimer(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        uint32_t usPeriod;
        uint16_t usPrescaler;
        uint32_t uiTIMxCLK;

          /* 使能TIM时钟 */
        RCC_APB1PeriphClockCmd(TIM_HARD_RCC, ENABLE);

    /*-----------------------------------------------------------------------
                system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

                HCLK = SYSCLK / 1     (AHB1Periph)
                PCLK2 = HCLK / 2      (APB2Periph)
                PCLK1 = HCLK / 4      (APB1Periph)

                因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
                因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

                APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
                APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11

        ----------------------------------------------------------------------- */
        uiTIMxCLK = SystemCoreClock / 2;

        usPrescaler = uiTIMxCLK / 1000000 ;        /* 分频到周期 1us */
       
#if defined (USE_TIM2) || defined (USE_TIM5)
        usPeriod = 0xFFFFFFFF;        /* 407支持32位定时器 */
//        usPeriod = 0xFFFF;        /* 103支持16位 */
#else
        usPeriod = 0xFFFF;
#endif
        /* Time base configuration */
        TIM_TimeBaseStructure.TIM_Period = usPeriod;
        TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM_HARD, &TIM_TimeBaseStructure);

        TIM_ARRPreloadConfig(TIM3, ENABLE);

        /* TIMx enable counter */
        TIM_Cmd(TIM_HARD, ENABLE);

        /* 配置TIM定时中断 (Update) */
        {
                NVIC_InitTypeDef NVIC_InitStructure;        /* 中断结构体在 misc.h 中定义 */

                NVIC_InitStructure.NVIC_IRQChannel = TIM_HARD_IRQn;

                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;        /* 比串口优先级低 */
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        }
}
#endif

#ifdef USE_TIM2
void TIM2_IRQHandler(void)
#endif

#ifdef USE_TIM3
void TIM3_IRQHandler(void)
#endif

#ifdef USE_TIM4
void TIM4_IRQHandler(void)
#endif

#ifdef USE_TIM5
void TIM5_IRQHandler(void)
#endif

void TIM3_IRQHandler(void)
{
        flag=1;
}


回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2020-12-4 16:30:38 | 显示全部楼层
这是我的主函数中的程序
while(1)
{
        if(flag==1)
  {
          if(p!=&shuzu[200])
         {
        g_tParam.CalibrationSetValue=*p;
        Set_TempValue=g_tParam.CalibrationSetValue;
        MAX5144_SetDacData(Set_TempValue);
  MAX5144_SetDacData(Set_TempValue);
  p++;
        flag=0;
                 }
         }
        else p=&shuzu[0];
}
回复

使用道具 举报

9

主题

128

回帖

155

积分

初级会员

积分
155
发表于 2020-12-4 21:30:44 | 显示全部楼层
TIM_HARD_IRQn,这中断向量是哪儿的,先确认DAC输出固定电压是否可行,如果可行再查找定时器相关代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-12-5 09:54:31 | 显示全部楼层
我又卡了啊 发表于 2020-12-4 16:30
这是我的主函数中的程序
while(1)
{

中断实现有问题,没有清除标志,

void TIM3_IRQHandler(void)
{
        flag=1;
}


直接使用这个改吧,还简单些
V5开发板定时器功能之定时器中断例子,支持TIM1到TIM14共14个定时器的随意配置,调
https://forum.anfulai.cn/forum.p ... 0706&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:50 , Processed in 0.038712 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表