初级会员

- 积分
- 91
- 金钱
- 91
- 注册时间
- 2021-7-7
- 在线时间
- 15 小时
|
5金钱
开启DMA后,主函数里的printf函数就会卡住,会一直卡在DMA的中断里,sram应该是没有溢出的。
代码大概是这个样子
void bsp_Init(void)
{
MX_DMA_Init();
MX_ADC_Init();
MX_TIM14_Init();
Init_Uart();
Init_Led();
Init_Key();
bsp_InitTimer();
// bsp_DelayMS(10000); //等待高压模块初始化
LedOn(CTR); //打开高压模块
HAL_ADCEx_Calibration_Start(&hadc); //校准adc
// HAL_ADC_Start_DMA(&hadc, ADC_Value, ADC_LENGTH); //开始ADC转换
}
int fputc(int ch, FILE *f)
{
#if 1 /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */
comSendChar(COM1, ch);
return ch;
#else /* 采用阻塞方式发送每个字符,等待数据发送完毕 */
/* 写一个字节到USART1 */
USART1->DR = ch;
/* 等待发送结束 */
while((USART1->SR & USART_SR_TC) == 0)
{}
return ch;
#endif
}
然后主函数里的printf就会一直卡在下面这个中断里
void DMA1_Channel1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_adc);
}
|
最佳答案
查看完整内容[请看2#楼]
因为DMA每次完成后就会去中断服务函数DMA1_Channel1_IRQHandler( ),ADC采样点数过少,就会一直不停地在运行中断服务函数,导致主函数int main()中的代码无法得到执行。
|