推介网站,校园网站规划与建设心得,国际新闻最新10条,自己做的网站图片打开慢配置步骤
在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤 每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据 量是可编程的#xff0c;最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作#xff0c;直到 计数为最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作直到 计数为。
DMA的请求映像如下 设置外设寄存器地址 这里使用DMA传输ADC1的数据查看ADC1的数据地址为(uint32_t)(ADC1-DR) 所以赋值为 DMA1_Channel1-CPAR(uint32_t)(ADC1-DR);
设置存储器地址 填写需要被传输到的存储器地址注意这里ADC使用了3个通道所以存储的数据类型应该是在数组里所以需要填的是数组的第一个数据的指针并且需要在DMA传输过程中存储器地址自增。
uint16_tadc_dat[3]{0};//ADC数据传输到的位置 全局 因为选择的ADC为12为数据宽度所以用uint16_t
DMA1_Channel1-CMAR(uint32_t)adc_dat;
传输的数据量 当前传输的为3个数据最大为65535
DMA1_Channel1-CNDTR | 3;
其他配置
在 DMA_CCRx 中配置数据的传输方向、循环模式、外设和存储器的增量模式、外设和存 储器的数据宽度和传输一半产生中断或传输完成产生中断的设置。 DMA1_Channel1-CCR | 0x00002561;
//DMA优先级高 非存储器到存储器模式 存储器数据宽度16位 外设数
//据宽度16位 存储器地址不自增 外设地址自增 循环模式 从外设读到存储器 开启DMA通道
所以延续上篇博客最终配置为
uint16_t adc_dat[3]{0};
/*要求如下配置ADC1IN1ADC1IN2ADC1IN3使用内部专用14Mhz振荡器过采样为7.5个ADC周期由TIM1中断作为触发信号DMA搬运
并且开启模拟看门狗监控ADC1IN1阈值为3.3v~3.0v并且开启模拟看门狗中断。ADC分辨率为默认的12位*/
void Demo(void){//打开HSI14时钟RCC-CR2 | 0x00000001;//开启HSI14while(!(RCC-CR2 | 0x00000002));//等待HSI14稳定RCC-CR2 | 0x00000004;//允许ADC打开HSI14 //ADC自校准ADC1-CR | 0x80000001; //开启自校准 ADC禁用while((ADC1-CR | 0x80000000)); //等待自校准完成//ADC通道选择ADC1-CHSELR | 0x0000000E; //选择通道1 2 3//ADC采样时间选择ADC1-SMPR | 0x00000001; //7.5个采样周期//转换模式选择ADC1-CFGR1 | 0x4C00003;//使用TIM1_TRGO作为触发事件源 外部触发禁止 单次转换模式 模拟看门狗监视通道1 模拟看门狗使能 在单一通道上使能模拟看门狗 使能 循环模式 使能DMA DMA循环模式 前向扫描//开启模拟看门狗ADC1-ISR | 0x00000080;//开启模拟看门狗中断ADC1-IER | 0x00000080;//模拟看门狗中断使能ADC1-TR |0xE8C0FFF;//阈值为 4095~3723 即3.3v~3.0v//开始转换ADC1-CR 0xFFFFFFFE; //ADC解除禁用ADC1-CR | 0x00000004; //开始转换//DMA配置DMA1_Channel1-CPAR(uint32_t)(ADC1-DR); //源地址DMA1_Channel1-CMAR(uint32_t)adc_dat; //目标地址DMA1_Channel1-CNDTR | 3; //传输数目3DMA1_Channel1-CCR | 0x00002561; //DMA优先级高 非存储器到存储器模式 存储器数据宽度16位 外设数据宽度16位 存储器地址不自增 外设地址自增 循环模式 从外设读到存储器 开启DMA通道
}