OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9654|回复: 3

战舰ADC1与DMA的使用,原子哥....

[复制链接]

13

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2013-7-17
在线时间
10 小时
发表于 2013-8-3 15:06:37 | 显示全部楼层 |阅读模式
不知道程序哪里有问题,2个ADC一个是PA1另一个是内部温度传感器,想实现连续扫描,通过DMA存储在一个2维数组里面
然后在LCD上面显示,弄了一个下午了,显示的值依然是0.麻烦帮忙看看,谢谢。
void ADC1_Config(void)
{
RCC->APB2ENR |= (1 << 2); /* PA1模拟输入 */
GPIOA->CRL &= 0XFFFFFF0F;

RCC->APB2ENR |= (1 << 9); /* 复位ADC1 */
RCC->APB2RSTR |= (1 << 9);
RCC->APB2RSTR &= ~(1 << 9);
RCC->CFGR |= (1 << 15); /* ADC时钟6分频,12MHz */

ADC1->SMPR2 |= (7 << 3); /* 通道1采样时间为239.5个周期 */
ADC1->SMPR1 |= (7 << 18); /* 通道16采样时间为239.5个周期 */
ADC1->SQR1 |= (1 << 20); /* 2个转换通道 */
ADC1->CR1 &= ~(0XF << 16); /* 独立模式 */
ADC1->CR1 |= (1 << 8); /* 扫描模式 */
ADC1->CR2 |= (1 << 23); /* 启用温度传感器 */
ADC1->CR2 &= ~(1 << 11); /* 数据右对齐 */
ADC1->CR2 |= (1 << 8); /* 使用DMA模式 */
ADC1->CR2 |= (1 << 1); /* 连续转换 */
ADC1->CR2 |= (7 << 17); /* 软件开启转换 */

ADC1->CR2 |= (1 << 0); /* 开启ADC转换器 */
ADC1->CR2 |= (1 << 3); /* 初始化校准寄存器 */
while((ADC1->CR2 & (1 << 3))); /* 等待初始化完成 */
ADC1->CR2 |= (1 << 2); /* ADC校准 */
while((ADC1->CR2 & (1 << 2))); /* 等待校准完成 */

ADC1->SQR3 &= 0XFFFFFC00;
ADC1->SQR3 |= 1; /* CH1第一个转换 */
ADC1->SQR3 |= (16 << 5); /* CH16第二个转换 */
ADC1->CR2 |= (1 << 22); /* 开始转换 */
}

vu16 AD_Filter_Value[];
vu16 AD_Value[8][2];
void Get_ADC_Value(void)
{
u32 temp = 0;
u8 i = 0;
u8 j = 0;
for(i = 0;i < 2;i ++)
{
for(j = 0;j < 8;j ++)
temp += AD_Value[j];
AD_Filter_Value = temp >> 3;
}

void Show_ADC(void)
{
float temp = 0;
if(ADCFlag)
{
temp = AD_Filter_Value[1];
LCD_ShowxNum(156,130,temp,4,16,0);
temp = temp * 3.3 / 4096;
LCD_ShowxNum(156,150,(u16) temp,1,16,0);
temp -= (u16) temp;
LCD_ShowxNum(172,150,temp * 1000,3,16,0X80);
ADCFlag = 0;
}
}

void DMA_Config(DMA_Channel_TypeDef *DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR |= (1 << 0); /* 使能DMA1时钟 */
delay_ms(5);

DMA_CHx->CPAR = (u32) cpar;
DMA_CHx->CMAR = (u32) cmar;
DMA_CHx->CNDTR = cndtr;

DMA_CHx->CCR &= 0x0; /* 初始化CCR寄存器 */
DMA_CHx->CCR |= (1 << 12); /* 中优先级 */
DMA_CHx->CCR |= (1 << 10); /* 外设数据宽度为16位 */
DMA_CHx->CCR |= (1 << 8); /* 存储器数据宽度为16位 */
DMA_CHx->CCR |= (1 << 7); /* 存储器地址增量模式,外设地址非增量模式 */
DMA_CHx->CCR |= (1 << 5); /* 循环模式,从外设读,存储到存储器 */
DMA_CHx->CCR |= (1 << 0); /* 开启DMA */
}

void DMA_ADC1_Config(void)
{
DMA_Config(DMA1_Channel1,(u32) &ADC1->DR,(u32) &AD_Value,16);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 16:27:42 | 显示全部楼层
你这代码应该会死机才对啊.
vu16 AD_Filter_Value[];
这个都没分配内存,直接就用了...不死机??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2013-7-17
在线时间
10 小时
 楼主| 发表于 2013-8-3 16:33:24 | 显示全部楼层
我后来分配了 加上了ADC1->CR2 |= (1 << 20); /* 使用外部事件启动转换 */

但是出现花屏,但我屏蔽连续转换的语句,就正常显示,但是得到的AD值完全不对
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 17:18:06 | 显示全部楼层
回复【3楼】 tinwyzhang :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 21:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表