诸位大哥 ,今天配置DAC和ADC的DMA模式并在main中启用时,发现在rtthread studio程序会出现卡死,不使用rt thread则顺利运行。前后采用同样cubemx配置即同样的stm32f1xx_hal_msp.c。
(我使用rt studio习惯将整个stm32f1xx_hal_msp.c复制到drivers文件夹下并将其中#include “main.h”改为#include “board.h”而不是将各种MSP init的函数复制到board.c末尾)
下面附上分别使用keil(不使用操作系统)和使用rt studio的部分程序
使用keil(不含操作系统):
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_DAC_Init();
MX_TIM4_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
HAL_TIM_Base_Start(&htim4);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t *)Sine12bit,256,DAC_ALIGN_12B_R);
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,(uint32_t *)sinTable,256,DAC_ALIGN_12B_R);
使用rt studio
HAL_Init();
MX_GPIO_Init();
MX_DMA_Init();
MX_DAC_Init();
MX_TIM4_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
//开启DAC DMA输出正弦波
HAL_TIM_Base_Start(&htim4);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t *)Sine12bit,256,DAC_ALIGN_12B_R);
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,(uint32_t *)Sine12bit,256,DAC_ALIGN_12B_R);
已经将SystemClock_Config();替换到drv_clk.c
之前在博客上看过rt thread好像会默认把DAC和ADC的DMA打开,还望诸位拨冗解答我的疑问 ,万分感谢
嗯嗯 主要是我不能关DMA中断 我要在DMA中断里做事情
我这边解决了,不知道楼主还用不用得到:
cube配置出来的工程,在stm32f1xx_it.c中已经写好了中断函数,用户只需要完善回调函数即可。
在rtt中,lib的stm32f1xx_it.c文件,中断函数确实是挪用的HAL库,但是没有封装ADC的通道。所以需要用户封装一下。
可以在用户层写一个中断,包含HAL库中断原型函数就行了。ADC就可以正常中断,从而进入回调函数。中断、DMA都需要用户封装。
例如:
@elegy十分感谢,我去尝试一下!
求源码大佬@elegy
谈不上开发源码,是cubemx自己配置好adc和dma信息
然后把生成的函数复制到rtt工程内就行
但是要把中断函数复制到rtt工程
以上都是我从cubemx生成的。正常来讲可以使用rtt+mx联合开发,需要自己写scons,如果麻烦可以直接从cubemx生成的.c文件复制到rtt,最粗暴的丢main函数开头就行,初始化就在main函数内调用 在用户层初始化也能用。
Src.zip
@gumayusi
哥,你发的压缩包打开无效@elegy
好了,问题已解决@elegy
大佬,你是怎样解决的,我按前辈说的试试,现在是不卡死了,但采集不到数据。
MX_GPIO_Init();
HAL_ADC_MspInit(&hadc1);
MX_DMA_Init();
MX_ADC1_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t)ADC_ConvertedValue, 1216);
void DMA2_Stream0_IRQHandler(void)
这些我添加到RTT里了,但采集不到ADC值。
希望大佬能够指点
@gumayusi
@elegy
大佬 问下我采用adc dma 循环采集模式,cubmax配置生成没有问题,但是我移植到rtt上,dma中断和回调函数只能进来一回就死掉了。
中断文件it.c 文件我也移植过去了,也不行