TPM2和ADC模块同时提出中断,优先找不到相应模块哪个模块,如何验证?

什么是ADC的中断方式和查询方式_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
什么是ADC的中断方式和查询方式
AD转换是需要一定时间的,是让程序就地等待转换结果读取数据,还是让ADC转换结束之后自动处理结果,可以有两种选择。选择前者就是查询方式,选择后者就是中断方式。ADC转换结束之后有一个标志会置位,查询方式就是让程序等待这个标志位置位。而如果开放了ADC中断,这个标志位置位的同时会发生中断,程序暂时挂起,自动进入中断服务程序处理ADC转换结果,处理结束之后继续被挂起的程序。你提问中的两种方式,和其它诸如定时器、I/O、串行接口等模块的应用,道理都是一样的。当然,我说的仅限于单片机片内ADC,至于外挂的ADC那是另一番情景了。
采纳率:61%
为您推荐:
其他类似问题
中断方式的相关知识
等待您来回答4.5 ADC模块_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
4.5 ADC模块
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢【YL-KL26Z开发笔记】 KL26
ADC、TPM、UART、SPI、中断模块大杂烩 - ARM Cortex-M系列产品 - 恩智浦技术社区
后使用快捷导航没有帐号?
查看: 5161|回复: 37
【YL-KL26Z开发笔记】 KL26
ADC、TPM、UART、SPI、中断模块大杂烩
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
本帖最后由 最后无事 于
15:44 编辑
申明:本贴同时作为YL-KL26Z使用计划贴和使用分享帖
& && & 首先说下我为什么会接触到飞思卡尔KL26这款芯片,小白我是刚刚走出校园的大学生,实战经验不多,之前就玩过ARM9和51内核的芯片,从来没有接触过飞思卡尔的芯片。机缘巧合之下来到了现在的一家小型公司做开发,公司是研发智能穿戴产品的,所以对功耗要求十分的看中,KL26低功耗十分出色。领导在我的第一天上班就给了我这款飞思卡尔KL26开发板给我(黑色的那个),让我研究他的ADC、TPM、UART、SPI、中断模块。对于这款陌生的MO内核的芯片来说,一切我都要从头开始,从上官网找数据手册、原理图、例程到安装环境编译器,一路坎坷一路在论坛的好心人的耐心解答下,才慢慢的走过来的,特别谢谢版主们和好友们的回答,我的问题大部分都是他们最后给出最佳答案的。下面我就分别列出我研究的模块以及在研究过程中遇到的问题,或许解决方法和其他帖子相同,这里就做个笔记汇总。
使用工具:两块KL26开发板、四根杜邦线、一台PC电脑
实现功能:使用KL26开发板(黑色)的独立按键设置为外部中断,用他来作为TPM定时器的触发条件,然后TPM软件触发ADC每两秒自动采集CPU的温度,然后KL26开发板(黑色)作为主机将采集到的温度数据使用SPI协议发送给KL26开发板(蓝色),最后KL26开发板(蓝色)用UART协议通过串口助手打印出来。
(110.89 KB, 下载次数: 1)
14:29 上传
(107.05 KB, 下载次数: 0)
14:30 上传
14:43 上传
点击文件名下载附件
9.25 MB, 下载次数: 157
14:45 上传
点击文件名下载附件
5.31 MB, 下载次数: 116
14:46 上传
点击文件名下载附件
166.63 KB, 下载次数: 39
14:46 上传
点击文件名下载附件
207.09 KB, 下载次数: 51
14:46 上传
点击文件名下载附件
822.27 KB, 下载次数: 68
15:44 上传
点击文件名下载附件
1.19 MB, 下载次数: 72
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
3.KL26的ADC模块
答:& &&&1)芯片ADC任意端口配置
答:芯片ADC的端口配置是由ADC的“SC1寄存器的ADCH位”控制的,KL26芯片一共有31个ADC-Channel,不过大部分是保留的,不能使用。在单端模式下,有24个通道可以使用,在差分模式下只有六个通道可以使用。在演示项目中用到的测CPU温度的ADC通道就是第26通道,具体数据请查看KL26数据手册第91页。
& & 2)ADC的工作模式(单端、差分)
答:ADC的工作模式是由ADCx_SC1n的DIFF位控制的,置位就是差分输入,清零就是单端输入,测试温度用的26通道是两种模式都可以使用的,演示项目用的是单端输入,具体数据请看KL26数据手册第489页。
<font color="#)ADC的采集频率 答:ADC的采集频率跟时钟源有关系,ADC的时钟源选择位BUS(24Mhz),然后当bus时钟为二分频的时候,16位的ADC的转换率配置为最高。根据数据手册上面显示,ADC的采集转换时间公式为如下:
& && && && & ConversionTime=SFCAdder+AverageNum*(BCT+LSTAdder+HSCAdder)
根据上诉参数的配置,首次单端连续采样时间最快可达2.875微妙,连续采样时间可达2.25微妙,则可以知道,连续采样频率可以最高达到444.44khz。(频露足够完整的保留原始信号中的信息了),详情请查看数据手册的第514页。
<font color="#)ADC的采样精度
答:由于KL26的ADC在单端模式下可以设置成8位、10位、12位、16位,所以对应的ADC精度为(2的8次方减一)、(2的10次方减一)、(2的12次方减一)、(2的16次方减一)。演示项目中选择的是16位的精度,位数越高,功耗也大。
<font color="#)ADC软、硬件触发
答:ADC的软、硬件触发触发由ADCx_SC2[ADTRG]控制,置位时是硬件触发,清零时是软件触发,详情请查看KL26数据手册第496页。关于ADC硬件触发的触发源,有如下几个:TPM1、LPTMR、TPMX、PIT CHx、RTC、EXTRG_IN、CMP0,详情请查看KL26数据手册第57页。
(108.22 KB, 下载次数: 2)
14:52 上传
(99.94 KB, 下载次数: 0)
14:52 上传
(67.69 KB, 下载次数: 0)
14:52 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
1.开发环境选择 & &
答:飞思卡尔的开发环境有很多选择,例如:KDS、CW、keil、IAR,我用的是CW。我在这里先吐槽下,飞思卡尔的开发环境虽然很多,但是我想对应的例程DEMO要跟的上才行,不要出现一种情况就是某些模块的demo只能在某种IDE里面才能使用,我觉得所有的DEMO例程都要有各个开发环境的版本,这样才能方便开发者。其次CW用起来还是挺好用的,内嵌PE模块,可以自动生成代码,不过我就遇到过一个奇怪的现象就是修改好代码,编译保存之后,退出IDE,然后重新进入再编译一次之后,之前修改好的代码都自动还原了,我在这个地方也被坑了一坑。郁闷了好久,不过好在问题最后得到了解决。
&&(解决办法请看第十楼)。
2.固件的选择
答:我用的那个KL26开发板是官方版本的,他可以使用opensda来调试,不过需要换个固件,之前傻乎乎的不知道,结果用CW编译DEMO的时候老是下载不了,最后也是通过版主的耐心教导,问题得到了解决。& & (解决办法请看第16楼)&&还有个问题到现在还没有解决,就是不知道是不是我家里电脑系统是盗版的原因,板子连接到电脑之后,设备管理显示不出板子的串口号,用公司的正版系统又没有这种情况出现,这个问题版主也无能为力,所以无法解决!!!
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
本帖最后由 最后无事 于
14:57 编辑
4.KL26的UART模块
1) UART的端口配置 答:KL26有三个uart可以使用,其中uart0在正常模式、等待模式、停止模式下都可以使用。关于uart的端口配置,只需要将有UART0_RX以&&及 UARTO_TX 功能的引脚设置引脚属性,清空引脚中断标志位,然后就可以使用了。
& & 2)UART波特率控制方法
答:UART的波特率又跟时钟有关系,UART0可以运行在所有的低功耗模式下,他有四种时钟源可以选择,而UART1以及UART2只能在busclock时钟运& && & 行。我选择MCGFLLCLK作为UART0的时钟源,OSR采样率为6,SBR设置为26,可得出波特率为115200。所有根据设置OSR以及BR的最小值,可以推断出在这& &&&个时钟源下的最大波特率是多少,详细请查看KL26数据手册第141页。
3)UART的通信机理、
答:在我目前的理解看来,uart是异步串行通信协议,他的发送数据和接收数据是以字符位单位的,字符与字符之间的时间间隔是没有时间限制的,& &&&只要检测到起始位,才开始接收数据,发送数据顺序为无数据位、起始位、数据位、奇偶校验位(可有可无)、停止位、字符与字符之间的发送时间& &&&间隔是没有要求的,但是位与位之间的发送间隔必须按照波特率的来,收发两端的时钟可以不一致,但波特率必须要求一致,而接受回来的数据再经& &&&过串-&并处理,就可以使用了(发送前也要进行并-&串处理)。
(74.31 KB, 下载次数: 5)
14:55 上传
(31.58 KB, 下载次数: 0)
14:55 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
5.KL26的SPI模块
<font color="#) SPI的MASTER、SLAVE角色区分答:SPI的主从角色区分是由SPIx_C1[MSTR]寄存器控制的,当置位的时候是主机模式,当清零的时候是从机模式。
<font color="#) SPI的端口设置、时钟频率、缓存模式配置
答:SPI端口的设置与UART的端口设置无差别,具体引脚属性可以查看KL26的原理图,关于SPI时钟频率,SPI 主机模式可以在总线时钟 2 分频的波特率下运行,或是在从机模式下总线 4 分频的波特率下运行。SPI 可使用软件查询方式或是中断方式来工作。而SPI的波特率与时钟频率有如下图。可以通过设置SPPR以及SPR这两个因子来改变SPI的传输波特率。详细数据请查看KL26数据手册第711页。SPI的缓存模式有8位的和16位的,具体的由SPIx_C2[SPIMODE]。
<font color="#) SPI协议的通讯机理
答:由SPI的时序图可以看出,SPI的主从机收发数据都是按照SPI主机的时序来执行的,当SPI的时钟极性位为1时,数据位的在时序的上升沿执行到下一个上升沿的时候,刚好发送完一位数据,然后主机和从机的数据都是同时执行的,到下降沿的时候就是主机从机接收数据的时候,是交给八位的双向移位寄存器执行的。
(34.68 KB, 下载次数: 0)
15:00 上传
(71.24 KB, 下载次数: 0)
15:00 上传
(74.32 KB, 下载次数: 0)
15:00 上传
(59.78 KB, 下载次数: 0)
15:00 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
6.KL26的TPM定时器模块
1) 定时器的工作模式配置答:工作模式有四种,分为:输入捕捉模式、输入比较模式、边沿对齐PWM模式、中心对齐PWM模式。在输入捕获模式中,捕获动作发生在上升沿、下降沿或者是上升/下降沿上。在输出比较模式中,输出信号可以被置位,清零,脉冲调制,或连接匹配。所有通道可以配置为居中对齐PWM模式。
2)TPM定时周期控制答:定时器周期有如下公式:Period = Modulo counter/(Clock source/Prescaler)Modulo counter:模值由TPMx_MOD寄存器控制,16位寄存器,最大模值为65535。Prescaler:预分频因子由TPM_SC[PS]位寄存器控制,具体参数请看数据手册第577页。
3)TPM时钟源配置
答:TPM的时钟模式选择由TPMx_SC[CMOD]寄存器控制,具体参数如图:
(59 KB, 下载次数: 0)
15:01 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
7.KL26的中断
答:KL26中断分为内部中断和外部中断,上诉模块中能产生内部中断的有ADC、SPI、UART、TPM等模块,外部中断可以通过设置GPIO口来产生电平变化,从而产生外部中断。将一个IO口配置成中断功能,需要先将IO口设置成GPIO属性以及清除中断标志位,然后以这个中断标志位为判断条件,判断该IO口是否产生中断,相关寄存器有PORT_PCR[IRQC]以及PORT_PCR[ISR],具体参数请看数据手册第197页。关于中断优先级什么的,还有待更深入的研究,这里有份资料,也是之前在论坛上面看到的,大家可以学习学习。
15:05 上传
点击文件名下载附件
402.04 KB, 下载次数: 65
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
8.KL26的功耗控制& &1)KL26各个功耗模式关系图& &答:KL26的功耗模式有十种:RUN、WAIT、STOP、VLPR、VLPW、VLPS、LLS、VLLS3、VLLS1、VLLS0,他们的关系如下图:
(84.6 KB, 下载次数: 1)
15:10 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
2)各功耗模式下的官方电流参数
(243.15 KB, 下载次数: 0)
15:11 上传
TA的每日心情开心 15:33签到天数: 1 天[LV.1]初来乍到主题帖子积分
3)各功耗模式下的官方电流参数
(291.9 KB, 下载次数: 5)
15:12 上传
Tel: 3-8069
版权所有@苏州灵动帧格网络科技有限公司
Powered by【解放MCU】飞思卡尔KL25使用TPM2触发ADC - NXP MCU 技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
【解放MCU】飞思卡尔KL25使用TPM2触发ADC
12:00:43  
单片机进行定时模拟数据采集通常做法是:定时器中断中触发adc转换,adc转换完毕触发中断,在adc中断中保存adc结果。
kl25提供了丰富的内部信号联接。可以大大解放mcu。
参见kl25民间中文数据手册第3章芯片配置中3.2.1 模块之间的相互关系。
举例使用TPM2触发ADC
//8M晶体
#define AD_DOTS 32& && &//20ms&&采样 32点
#define TPM2_TIME& &&&(INT32U)20000*8/AD_DOTS& && & //定时器时间,单位us
INT16S wpAdcResultDma[AD_DOTS];
void tpm2init(void)
{
& && &&&OSC0_CR |= OSC_CR_ERCLKEN_MASK;
& && &&&SIM_SCGC6 |= SIM_SCGC6_TPM2_MASK;
& && &&&SIM_SOPT2 |= SIM_SOPT2_TPMSRC(2); //晶体
& && &&&TPM2_CNT = 0;
& && &&&TPM2_MOD = TPM2_TIME;& & //20ms&&采样 32点
& && &&&TPM2_SC = TPM_SC_CMOD(0);
& && &&&SIM_SOPT7 |= SIM_SOPT7_ADC0ALTTRGEN_MASK | SIM_SOPT7_ADC0TRGSEL(0x0a);//tpm2触发ad
& && &&&TPM2_CONF = TPM_CONF_TRGSEL_TPM2OF;
& && &&&TPM2_SC = TPM_SC_TOIE_MASK|TPM_SC_CMOD(1);
& && &&&TPM2_C0SC = TPM_CnSC_MSA_MASK|TPM_CnSC_CHIE_MASK;
}复制代码
进一步解放adc。采用dma方式进行
void adc_dma_init(void)
{
& && &&&SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;
& && &&&PORTE_PCR20 = PORT_PCR_MUX(0);& & //开启管脚模拟功能
& && &&&PORTE_PCR21 = PORT_PCR_MUX(0);& & //开启管脚模拟功能&&
& && &&&SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;
& && &&&disable_irq(INT_ADC0 - 16);
& && &&&Master_Adc_Config.CONFIG1&&= ADLPC_NORMAL | ADC_CFG1_ADIV(ADIV_1) | ADLSMP_LONG | ADC_CFG1_MODE(MODE_16) | ADC_CFG1_ADICLK(ADICLK_BUS_2);
& && &&&Master_Adc_Config.CONFIG2&&= MUXSEL_ADCA | ADACKEN_ENABLED | ADHSC_HISPEED | ADC_CFG2_ADLSTS(ADLSTS_2);
& && &&&Master_PARE1 = 0x1234
& && &&&Master_PARE2 = 0x5678
& && &&&Master_Adc_Config.STATUS2&&= ADTRG_SW | ACFE_DISABLED | ACFGT_GREATER | ACREN_DISABLED | DMAEN_DISABLED | ADC_SC2_REFSEL(REFSEL_EXT);
& && &&&Master_Adc_Config.STATUS3&&= CAL_OFF | ADCO_SINGLE | AVGE_ENABLED | ADC_SC3_AVGS(AVGS_32);
& && &&&Master_Adc_Config.STATUS1A = AIEN_OFF | DIFF_DIFFERENTIAL | ADC_SC1_ADCH(0);
& && &&&Master_Adc_Config.STATUS1B = AIEN_OFF | DIFF_DIFFERENTIAL | ADC_SC1_ADCH(0);
& && &&&ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);&&// config ADC
& && &&&ADC_Cal(ADC0_BASE_PTR);& && && && && && &&&// do the calibration
& && &&&ADC_Read_Cal(ADC0_BASE_PTR,&CalibrationStore[1]);& &// store the cal
& && &&&//校准完毕后根据实际需要改变配置
& && &&&Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_DIFFERENTIAL | ADC_SC1_ADCH(0);
& && &&&Master_Adc_Config.STATUS1B = AIEN_OFF | DIFF_DIFFERENTIAL | ADC_SC1_ADCH(0);
& && &&&//硬件触发,dma方式
& && &&&Master_Adc_Config.STATUS2&&= ADTRG_HW | ACFE_DISABLED | ACFGT_GREATER | ACREN_DISABLED | DMAEN_ENABLED | ADC_SC2_REFSEL(REFSEL_EXT);
& && &&&ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);&&// config ADC
}
& && &&&disable_irq(INT_DMA1-16);
& && &&&dmaInitPerToMem (MKL_DMA1, 40, (void*)&ADC0_RA, wpAdcResultDma, AD_DOTS*2, 1);//使用的ZLG的库
& && &&&enable_irq(INT_DMA1-16);set_irq_priority(INT_DMA1-16, 1);
void dma1_isr(void)
{
& && &&&DMA_DSR_BCR1 |= DMA_DSR_BCR_DONE_MASK;
& && &&&DMA_DCR1 &= ~DMA_DCR_EINT_MASK;
& && &&&DMAMUX0_CHCFG(MKL_DMA1) = 0x00;& && && &// 禁能DMAMUX
& && &&&bFlag = 1;//建立完成标志,供主程序进行查询
}复制代码
中断函数的写法相信大家应该已经摸索出套路了吧:
extern void dma1_isr(void);
#undef&&VECTOR_017
#define VECTOR_017 dma1_is复制代码这样就可以。
14:06:15  
好巧,我之前几天刚好搞定这个
13:10:35  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
“kl25民间中文数据手册”,民间。。。大中华区这么重要的市场,官方不出中文版啊,这是太信任国内的基础教育了。
22:17:09  
硬件触发没成功 不知道是哪里没配对
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司}

我要回帖

更多关于 相应中断请求的条件是 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信