嵌入式技术论坛
直播中

王敏

8年用户 1528经验值
私信 关注
[问答]

STM32F103RC dac输出使能后系统调度异常是什么原因导致的?

硬件为stm32f103rct6 使用dac1(PA4)输出正弦波,波形正常但系统调度异常,msh无法输入输出,不再执行每秒一次的rt_kprintf("flag main \n"),(此时依然在正常输出正弦波),调用main中for循环前的语句1或语句2任一语句任务调度即可恢复正常,rtt版本为3.1.5 做过如下尝试

1.降低DMA触发定时器TIM2的频率。没有效果。

2.换TIM6触发。依然不行

请教一下大家可能会是什么原因导致的?

main中配置如下:

int main(void)

{

rt_uint32_t re_mcp = 0;

fal_init();

FlashPartition = fal_partition_find("app");

if (NULL == FlashPartition)

{

rt_kprintf("Can't find %s Fal partition!\n","app");

return RT_ERROR;

}

bsp_InitUart();

bsp_InitLed();

OsTaskCreate();

spi_init();//softspi初始化

/ dac 相关配置和初始化 /

DacGpioInit();

DacDmaInit();

MX_TIM2_Init();

DacInit();

//HAL_TIM_Base_Stop(&htim2); //语句1

//HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);//语句2

for(;;)

{

rt_kprintf("flag main \n");

rt_thread_mdelay(1000);

}

return RT_EOK;

}

void DacGpioInit()

{

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

}

void DacDmaInit()

{

/* DMA controller clock enable */

__HAL_RCC_DMA2_CLK_ENABLE();

/* DMA interrupt init */

/* DMA2_Channel3_IRQn interrupt configuration */

HAL_NVIC_SetPriority(DMA2_Channel3_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(DMA2_Channel3_IRQn);

}

void DacInit()

{

uint32_t Idx; //定义变量 dac用

DAC_ChannelConfTypeDef sConfig = {0};

hdac.Instance = DAC;

if (HAL_DAC_Init(&hdac) != HAL_OK)

{

Error_Handler();

}

/* * DAC channel OUT1 config

*/

sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;//DAC_TRIGGER_T2_TRGO;

sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;

if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)

{

Error_Handler();

}

for (Idx = 0; Idx <100; Idx++)

{

DualSine12bit[Idx] = (Sine12bit[Idx] << 16)+ (Sine12bit[Idx]);

}

HAL_TIM_Base_Start(&htim2);

HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t *)DualSine12bit,100,DAC_ALIGN_12B_R);

}

void MX_TIM2_Init(void)

{

TIM_ClockConfigTypeDef sClockSourceConfig = {0};

TIM_MasterConfigTypeDef sMasterConfig = {0};

htim2.Instance = TIM2;

htim2.Init.Prescaler = 72;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 100;

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

{

Error_Handler();

}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

}

回帖(3)

h1654155275.5916

2023-2-23 14:42:16
这里加个延时试试,否则一直打印会占用较大的MCU资源

   for(;;)
    {
        rt_kprintf("flag main n");
        rt_thread_mdelay(1000);
    }
举报

王敏

2023-2-23 14:42:22
嗯嗯 那里有延时的 往论坛粘贴代码的时候忘记粘贴过来了,延时么有用。。。
举报

王敏

2023-2-23 14:42:29
软件调试看看卡在哪里?
中断函数处理时间很久?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分