本应用笔记演示了MAXQ微控制器应用开发的简便性,并提供了IAR嵌入式工作台®集成开发环境和MAXQ®评估(EV)板。演示简单开发过程的最简单方法是使用示例应用程序。本应用使用MAXQ2010 RISC微控制器上的UART、定时器和ADC来监视和报告温度。
应用概述
本文描述的示例应用使用MAXQ2010处理器和MAXQ2010评估(EV)板。本例展示了微控制器的UART、集成ADC控制器和器件定时器的用途。定时器用于每 500ms 生成一次中断。MAXQ2010端口与ADC接口,用于数据采集。然后通过将热敏电阻连接到MAXQ2010的ADC来获取温度读数。当发生中断时,MAXQ2010获取温度读数,并将结果输出到其串行端口之一。
读取 ADC 数据
在示例应用中,ADC控制器读取随温度变化的模拟输入。在读取任何输入之前,应用必须设置ADC的时钟、转换模式(单路或连续)、基准电压源(内部、外部或AVDD),以及感兴趣源的输入通道。需要初始化几个寄存器才能实现ADC转换。
void initADC ( ) { ADCN = 0x00; // Single conversion, external AVDD reference, divide-by-1 clock frequency. ADST = 0x10; //Select configuration register - read/write access on ADDATA. ADDATA = 0x00; //Channel 0 for AN0. ADDATA = 0x01; //Channel 0 for AN1. ADDATA = 0x02; //Channel 0 for AN2. ADDATA = 0x03; //Channel 0 for AN3. ADDATA = 0x04; //Channel 0 for AN4. ADDATA = 0x05; //Channel 0 for AN5. ADDATA = 0x06; //Channel 0 for AN6. ADDATA = 0x07; //Channel 0 for AN7, thermistor is attached on this channel. ADADDR = 0x07; //Selecting 0x07 as the last conversion configuration register. }
初始化后,设置ADST寄存器的ADCONV位将启动转换。硬件通过清除相同的位来指示转换完成。要读取结果,请将ADST寄存器的ADIDX[3:0]位设置为目标输入通道。然后,ADDATA寄存器将保存相应通道的数字数据。在本示例应用中,AN7 被分配给 ADC 数据缓冲器 7。因此,要读取热敏电阻数据,请设置 ADST = 0x07 并读取 ADDATA。 对读取的数字值执行以下步骤以达到温度:
unsigned int getADCReading() { unsigned short data = 0; ADST_bit.ADCONV = 1; //Enable conversion. while( ADST_bit.ADCONV == 0x01 ); //ADST.ADCONV bit indicates conversion in progress. ADST = 0x07; //We are interested in reading only the AN7 input, that is thermistor data. data = ADDATA; //Read AN7 data. return data; }
计算 AN7 处的模拟输入,以伏特为单位,对应于读取的数字值。
计算与AN7处模拟输入相对应的热敏电阻电阻。
以摄氏度为单位计算温度。
写入串行端口
在示例应用中,MAXQ2010的一个串行端口用于输出当前温度读数。在将任何数据写入端口之前,应用程序必须设置波特率和串行端口模式。只需初始化几个寄存器即可启用串行端口通信。
void initSerial() { SCON0_bit.SM1 = 1; // Set to Mode 1. SCON0_bit.REN = 1; // Enable receives. SMD0_bit.SMOD = 1; // Set baud rate to 16 times the baud clock. PR0 = 0x75F7; // Set phase for 115200 with an 8MHz crystal. SCON0_bit.TI = 0; // Clear the transmit flag. SBUF0 = 0x0D; // Send carriage return to start communication. }
在UART中,单个寄存器发送和接收串行数据。写入 SBUF0 寄存器将启动传输。当串行端口上的数据可用时,读取 SBUF0 寄存器将检索输入。 示例程序使用以下函数将数据输出到串行端口。
int putchar(int ch) { while(SCON0_bit.TI == 0); // Wait until we can send. SCON0_bit.TI = 0; // Clear the sent flag. SBUF0 = ch; // Send the char. return ch; }
使用计时器生成周期性中断
此示例应用程序中使用的最后一个组件是 16 位计时器之一。定时器生成中断,每秒触发两次温度读数。要为此示例配置计时器,程序员必须设置重新加载值,指定时钟源,然后启动计时器。以下代码显示了初始化计时器 B 所需的步骤。
TB0V = 0x00000; // Set current timer value. TB0R = 0x0F42; // Set reload value. TB0CN = 0x0506; // Set Timer Clock = SysClk/1024, Reload Timer Mode, Interrupt Enabled.
使用此计时器作为此示例的中断源还需要执行几个步骤。MAXQ架构的中断必须在三个级别上启用:全局、每个模块和本地。使用 IAR™ 编译器,通过调用函数启用全局中断。此功能可有效设置中断和控制 (IC) 寄存器的中断全局使能 (IGE) 位。由于定时器B0位于模块4中,因此设置中断掩码寄存器(IMR)的位4以启用模块的中断。通过在定时器B控制寄存器(TB0CN)中设置启用定时器B中断(ETB)位来启用本地中断。这些步骤如下所示。 最后,使用中断需要初始化中断向量。IAR 的编译器允许为每个模块使用不同的中断处理函数。为特定模块设置中断处理程序需要使用 #pragma 向量指令。中断处理函数声明前面还应带有 __interrupt 关键字。示例应用程序通过以下方式声明模块 4 的中断处理程序。
__enable_interrupt() TB0CN = 0x506; // Enable interrupts along with setting Timer Clock and run Timer. IMR |= 0x10; // Enable the interrupts for module 4.
#pragma vector = 4 __interrupt void timerInterrupt() { // Add interrupt handler here. }
MAXQ2010评估板和IAR IDE设置
运行示例应用程序需要以下设置。
MAXQ2010评估板应具有:
a. JU14 和 JU22 短路以启用通道 AN7 上的热敏电阻读数。
b. JU9 引脚 2 和 3 短路以启用 UART0。
c. JU8开路,让8MHz晶振源控制器。
IAR IDE 项目选项应具有:
a. lnkmaxq2010.xcl 作为链接器命令文件(从“项目”菜单中选择“选项”,然后从“类别”列表中选择“链接器”,然后选择“配置”选项卡)。
b. maxq2010.ddf 作为设备描述文件(从“项目”菜单中选择“选项”,然后从“类别”列表中选择“调试器”,然后选择“设置”选项卡)。
c. JTAG作为驱动程序(从“项目”菜单中选择“选项”,然后从“类别”列表中选择“调试器”,然后选择“设置”选项卡)。
d. COMx端口设置以与JTAG通信(从“项目”菜单中选择“选项”,然后从“类别”列表中选择JTAG)。
电脑超级终端设置应具有:
a. PC COMx端口,MAXQ0的UART2010连接到该端口。
二。配置属性为 115200 波特率、8 个数据位、1 停止位以及无奇偶校验和流量控制。
该样应用使用MAXQ IAR嵌入式工作台V2.12A进行了测试。
图 1
显示了预期的输出。
图1.示例应用程序输出。
结论
如这些代码示例所示,通过学习几个外设寄存器的细节,程序员能够轻松开发MAXQ2010微控制器和MAXQ系列处理器的应用。IAR 嵌入式工作台的添加允许使用符合 ANSI 标准的 C 代码编写代码,从而加快了开发过程。在此处下载此示例应用程序的完整源代码。阅读代码开头的说明和注释,了解有关所需设置和 IAR 编译器版本的详细信息。
审核编辑:郭婷
-
微控制器
+关注
关注
48文章
7542浏览量
151310 -
处理器
+关注
关注
68文章
19259浏览量
229647 -
寄存器
+关注
关注
31文章
5336浏览量
120224
发布评论请先 登录
相关推荐
评论