专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
求助:外部触发ADC转换的问题
2019-08-19 19:19
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
8249
20
1633
使用TIM1的通道2触发转换ADC规则通道3,对应的管脚为PB14 和 PA3 , 请问硬件上这两个管脚怎么接啊
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
原味_郭
1楼-- · 2019-08-21 12:40
回复【13楼】正点原子:
---------------------------------
手册上确实有这句话:
note: When an external trigger is selected for ADC regular or injected conversion ,only the rising adge of the signal can start the conversion.
外部输入捕获能触发ADC转换吗?
加载中...
正点原子
2楼-- · 2019-08-21 15:14
精彩回答 2 元偷偷看……
加载中...
SCmianyangZLY
3楼-- · 2019-08-21 20:10
我现在也在搞这个用定时器2 cc2事件控制ADC1 4过通道循环扫描。如果不加定时器触发,能收到DMA中断数据。加了定时器就是没有看到数据输出
定时器的设置我是在开发板例程上改的。如下:不知道错在那里了。
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;//TIM2EN:定时器2时钟使能 (Timer 2 clock enable)
TIM2->ARR=arr; //更新事件装入活动的自动重装载
TIM2->
SC=psc; //TIMx时钟频率除数的预分频值
TIM2->CR1&=~(1<<4);//DIR:方向 (Direction)DIR:方向 (Direction)
//上面是时基配置
TIM2->CCMR1&=~(3<<8);//00:CC2通道被配置为输出;
TIM2->CCMR1|=7<<12; //CH2 
WM2模式
TIM2->CCMR1|=1<<11; //CH2预装载使能
// TIM2->CCER|=1<<4; //OC2 输出使能
TIM2->CR1=0x8000; //ARPE使能
TIM2->CR1|=0x01; //使能定时器3
// //这两个东东要同时设置才可以使用中断
// TIM2->DIER|=1<<0; //允许更新中断
// TIM2->DIER|=1<<6; //允许触发中断
// TIM2->CR1|=1<<0; //使能定时器2
// MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DR_Base=cpar; //cpar:外设地址
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量在每个数据传输后,这个数值递减。
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<1; //允许传输完中断
DMA_CHx->CCR|=0<<4; //从外设读取数据
DMA_CHx->CCR|=1<<5; //循环模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器地址增量模式,因为只有为增量,才能够使得每次
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //通道优先级中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel ,2);
ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
ADC1->CR2|=1<<0; //开启ADC并启动转换 tttttttttttttjjjjjjjjjjjjjjj
}
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<4; //使能PORTC口时钟
GPIOC->CRL&=0XFFFF0000;//PC 0 1 2 3 anolog输入
GPIOC->CRL|=0X00008888; //PC 0 1 2 3 anolog输入
//通道10/11设置
RCC->APB2ENR|=1<<9; //ADC1时钟使能ADC1EN:ADC1接口时钟使能 (ADC 1 interface clock enable)
__nop();
__nop();
__nop();
__nop();
__nop();
RCC->APB2RSTR|=1<<9; //ADC1RST:ADC1接口复位 (ADC 1 interface reset)
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK72MHZ/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=2<<14; // 10:PCLK2 6分频后作为ADC时钟
ADC1->CR1&=~(0XF<<16); //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1|=1<<8; //SCAN:扫描模式 (Scan mode)
ADC1->CR2|=1<<1; //启用连续转换 CONT:连续转换 (Continuous conversion)
ADC1->CR1|=1<<14; //wwwwwwww软件通过这些位定义在间断模式下,收到外部触发后转换规则通道的数目
ADC1->CR1|=1<<11; //wwwwwwww规则通道组上使用间断模式用于开启或关闭规则通道组上的间断模式
ADC1->CR2&=~(7<<17); //清零通道组转换的外部事件
ADC1->CR2|=1<<18|1<<17; //的定时器2的CC2事件事件--选择定时器2的捕获比较2作为转换外部触发
// ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发触发启动
ADC1->CR1&=~(1<<10);//关闭自动的注入通道组转换;ttttttjjjjjj
ADC1->CR2&=~(1<<11); //右对齐ADC数据右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=3<<20; //4个转换在规则序列中
ADC1->SQR3 = 0X00000000;
ADC1->SQR3|= 0X0006B16A;//第一次转换10通道,顺次
//设置通道0~3的采样时间
ADC1->SMPR1&=0XFFFFF000;//通道10 11 12 13 采样时间清空
ADC1->SMPR1|=7<<0; //通道10 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<3; //通道11 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<6; //通道12 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<9; //通道13 239.5周期,提高采样时间可以提高精确度
ADC_ExternalTrigConvCmd(ADC1,ENABLE);// ADC1->CR2|=1<<20;//1:使用外部事件启动转换。
ADC_Cmd(ADC1,ENABLE);//ADC1->CR2|=1<<0; //开启ADC并启动转换 能或者失能指定的ADC
ADC_ResetCalibration(ADC1);//ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC_StartCalibration(ADC1);//ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
ADC_DMACmd(ADC1, ENABLE);//ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
//ADC1->CR2|=1<<0; ///开启AD转换器,第一次唤醒AD转换器
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除
}
加载中...
BULELJ
4楼-- · 2019-08-21 23:56
回复【8楼】正点原子:
---------------------------------
原子哥,看手册上说定时器触发AD是在捕获比较寄存器发生事件时,一直不太明白,我开始IO口是高电平,用PWM2模式,arr是3,CCR1是1,这样的话,一个PWM2周期内触发1次AD,是在一个低电平之后的上升沿触发AD,我这样理解对吗?
加载中...
ElecUtopia
5楼-- · 2019-08-22 04:47
回复【16楼】SCmianyangZLY:
---------------------------------
TIM2->CR1=0x8000; //ARPE使能
应该是TIM2->CR1=0x0080;
加载中...
正点原子
6楼-- · 2019-08-22 08:53
回复【17楼】BULELJ:
---------------------------------
这个看你怎么配置,手册上说是事件,你就要看这个事件,是什么情况产生的了.事件产生的时机是可以设置的.
加载中...
上一页
1
2
3
4
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
---------------------------------
手册上确实有这句话:
note: When an external trigger is selected for ADC regular or injected conversion ,only the rising adge of the signal can start the conversion.
外部输入捕获能触发ADC转换吗?
定时器的设置我是在开发板例程上改的。如下:不知道错在那里了。
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;//TIM2EN:定时器2时钟使能 (Timer 2 clock enable)
TIM2->ARR=arr; //更新事件装入活动的自动重装载
TIM2->SC=psc; //TIMx时钟频率除数的预分频值
TIM2->CR1&=~(1<<4);//DIR:方向 (Direction)DIR:方向 (Direction)
//上面是时基配置
TIM2->CCMR1&=~(3<<8);//00:CC2通道被配置为输出;
TIM2->CCMR1|=7<<12; //CH2 WM2模式
TIM2->CCMR1|=1<<11; //CH2预装载使能
// TIM2->CCER|=1<<4; //OC2 输出使能
TIM2->CR1=0x8000; //ARPE使能
TIM2->CR1|=0x01; //使能定时器3
// //这两个东东要同时设置才可以使用中断
// TIM2->DIER|=1<<0; //允许更新中断
// TIM2->DIER|=1<<6; //允许触发中断
// TIM2->CR1|=1<<0; //使能定时器2
// MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DR_Base=cpar; //cpar:外设地址
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量在每个数据传输后,这个数值递减。
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<1; //允许传输完中断
DMA_CHx->CCR|=0<<4; //从外设读取数据
DMA_CHx->CCR|=1<<5; //循环模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器地址增量模式,因为只有为增量,才能够使得每次
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //通道优先级中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel ,2);
ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
ADC1->CR2|=1<<0; //开启ADC并启动转换 tttttttttttttjjjjjjjjjjjjjjj
}
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<4; //使能PORTC口时钟
GPIOC->CRL&=0XFFFF0000;//PC 0 1 2 3 anolog输入
GPIOC->CRL|=0X00008888; //PC 0 1 2 3 anolog输入
//通道10/11设置
RCC->APB2ENR|=1<<9; //ADC1时钟使能ADC1EN:ADC1接口时钟使能 (ADC 1 interface clock enable)
__nop();
__nop();
__nop();
__nop();
__nop();
RCC->APB2RSTR|=1<<9; //ADC1RST:ADC1接口复位 (ADC 1 interface reset)
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK72MHZ/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=2<<14; // 10:PCLK2 6分频后作为ADC时钟
ADC1->CR1&=~(0XF<<16); //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1|=1<<8; //SCAN:扫描模式 (Scan mode)
ADC1->CR2|=1<<1; //启用连续转换 CONT:连续转换 (Continuous conversion)
ADC1->CR1|=1<<14; //wwwwwwww软件通过这些位定义在间断模式下,收到外部触发后转换规则通道的数目
ADC1->CR1|=1<<11; //wwwwwwww规则通道组上使用间断模式用于开启或关闭规则通道组上的间断模式
ADC1->CR2&=~(7<<17); //清零通道组转换的外部事件
ADC1->CR2|=1<<18|1<<17; //的定时器2的CC2事件事件--选择定时器2的捕获比较2作为转换外部触发
// ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发触发启动
ADC1->CR1&=~(1<<10);//关闭自动的注入通道组转换;ttttttjjjjjj
ADC1->CR2&=~(1<<11); //右对齐ADC数据右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=3<<20; //4个转换在规则序列中
ADC1->SQR3 = 0X00000000;
ADC1->SQR3|= 0X0006B16A;//第一次转换10通道,顺次
//设置通道0~3的采样时间
ADC1->SMPR1&=0XFFFFF000;//通道10 11 12 13 采样时间清空
ADC1->SMPR1|=7<<0; //通道10 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<3; //通道11 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<6; //通道12 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<9; //通道13 239.5周期,提高采样时间可以提高精确度
ADC_ExternalTrigConvCmd(ADC1,ENABLE);// ADC1->CR2|=1<<20;//1:使用外部事件启动转换。
ADC_Cmd(ADC1,ENABLE);//ADC1->CR2|=1<<0; //开启ADC并启动转换 能或者失能指定的ADC
ADC_ResetCalibration(ADC1);//ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC_StartCalibration(ADC1);//ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
ADC_DMACmd(ADC1, ENABLE);//ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
//ADC1->CR2|=1<<0; ///开启AD转换器,第一次唤醒AD转换器
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除
}
---------------------------------
原子哥,看手册上说定时器触发AD是在捕获比较寄存器发生事件时,一直不太明白,我开始IO口是高电平,用PWM2模式,arr是3,CCR1是1,这样的话,一个PWM2周期内触发1次AD,是在一个低电平之后的上升沿触发AD,我这样理解对吗?
---------------------------------
TIM2->CR1=0x8000; //ARPE使能
应该是TIM2->CR1=0x0080;
---------------------------------
这个看你怎么配置,手册上说是事件,你就要看这个事件,是什么情况产生的了.事件产生的时机是可以设置的.
一周热门 更多>