SPI 通信,既有单字节数据传输,又有多字节数据传输,该如正确使用 DMA?
STM32G0B1adc+dma采样数据错位
STM32G474 ADC无法正常启动转换
STM32F4的串口在配置DMA之后,不能使用高波特率吗?
各位大佬,比方说我用STM32CubeMX配置了单片机的管脚,然后用STM32CubeIDE编写代码,代码编写一半的过程中,我发现管脚配置中要添加新的外设设置,用CudeMX添加配置后重新生成代码,怎么保证我之前在CubeIDE中自己编写的代码部分不被覆盖掉?
ADC每次开始采样直流电压时,会出现尖峰波形?
不能正常debug什么情况?如下
为什么ETH配置中没有Advanced Parameters?
STM32出现error downloading following files
stm32 DMA串口接收到数组,数组元素顺序错乱怎么办?
STM32Cube_FW_L1_V1.8.1\Projects\STM32L152RE-Nucleo\Examples\ADC\ADC_Sequencer\
不知你说DMA判断是什么?
如果ADC触发了DMA,DMA完成传输后可以触发传输完成中断,然后可以在相应
的回调函数里设置你需要的标志位或做信号量释放。
对,就是想这样,但是好像就是不成功。
为啥我登录后显示 This software is not available for download.?
还有请教下,STM32CubeL1和Stm32CubeMX 是啥关系,互相并列,还是一个包含另一个?
先谢谢各位前辈的时间
你好,谢谢你的回复
请问 STM32Cube_FW_L1_V1.8.1 这个是在哪里有?我在st.com上搜索了一下没结果。
这里有最新版的。
建议你还是系统看看STM32CUBEMX 这个软件,包含了下面这个响应的库。 网上有很多资料。
STM32CubeL1 - STM32Cube MCU Package for STM32L1 series (HAL, Low-Layer APIs and CMSIS, USB, File system, RTOS, Touch Sensing, Graphic - and examples running on ST boards) - STMicroelectronics
链接打开后就是这样的
算了,我在研究研究mx吧
哦我知道了,这个库是mx里面下载的,我早就有了,。。。我看看sample都在哪个位置
我写了 HAL_ADC_ConvCpltCallback 函数
里面置了标志位
然后主循环里面进行了标志位的判断
你好,这里是我的main.c文件中我增加/修改的部分(其他都是CubeMX生成的):
unsigned char flagAdcDMADone;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
/ Prevent unused argument(s) compilation warning / UNUSED(hadc);
flagAdcDMADone++; }
int main(void) {
/ USER CODE BEGIN 1 /
/ USER CODE END 1 /
/ MCU Configuration--------------------------------------------------------/
/ Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock / SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals / MX_GPIO_Init(); MX_DMA_Init(); MX_ADC_Init(); / USER CODE BEGIN 2 / flagAdcDMADone=0;
/ USER CODE END 2 /
/ Infinite loop / / USER CODE BEGIN WHILE / while (1) { HAL_ADC_Start_DMA(&hadc,ADC_Resulte,ADCBUFLENG-1); HAL_ADC_Start(&hadc) ; //备注 无论本行注释与否,都无法获得flagAdcDMADone非零值 while(flagAdcDMADone==0) { HAL_Delay(1); }
delay(1000); / USER CODE END WHILE /
/ USER CODE BEGIN 3 / } / USER CODE END 3 / }
[md]研究来研究去
发现这样可以完成:
.....前部初始化代码略
while (1) { HAL_ADC_Start_DMA(&hadc,ADC_Resulte,5);
HAL_ADC_Start(&hadc) ;
while(flagAdcDMADone==0) //flagAdcDMADone在HAL_ADC_ConvCpltCallback中置1
{ HAL_Delay(1);
}
//进过中断了,看下结果数组 //然后delay个长时间
flagAdcDMADone=0;
HAL_ADC_Stop_DMA(&hadc);
HAL_Delay(1000);
/ USER CODE END WHILE /
/ USER CODE BEGIN 3 / }
后续代码略
和库代码里面写得不一样啊:(以下部分节选自STM32L1XX_HAL_ADC.c,第185行起)
(++) ADC conversion with transfer by DMA:
(+++) Activate the ADC peripheral and start conversions using function HAL_ADC_Start_DMA()
(+++) Wait for ADC conversion completion by call of function HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback() (these functions must be implemented in user program)
(+++) Conversion results are automatically transferred by DMA into destination variable address.
(+++) Stop conversion and disable the ADC peripheral using function HAL_ADC_Stop_DMA()
[md]stm32cubemx是个针对stm32全系列的图形化配置工具,可以基于它做芯片的初始并创建基于不同IDE的工程。至于STM32CubeL1是针对STM32L1的外设驱动库 。 多操作几次慢慢就熟了。