硬件为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();
}
}
举报
举报
举报
更多回帖