当前位置:首页 > 第5章-作业题
第5章 ARM Cortex_M3微控制器
一 填空题
LM3S微控制器的片上资源有I/O口、UART、A/D、GPTM、SSI总线、I2C总线、PWM、CAN、以太网、USB。
1. Stellaris微控制器提供一个集成的LDO稳压电源,电压调节范围是:2.25-2.75V。 2. Stellaris微控制器通常情况下有__系统时种、PWM时种、A/D采样时种、CAN模块时钟输出。
3. 睡眠模式指的是内核和存储器都不工作,外设可以正常工作,系统时钟与运行模式相同。
4. 深度睡眠模式指的是内核和存储器都不工作,外设可以正常工作,系统时钟只能使用主振荡器。
5. Stellaris微控制器系统需要_3.3_V的电源供电。
6. Stellaris微控制器的每一个I/O口都可用于通用I/O、中断、特殊功能等功能。
7. LM3S的定时器包含4个GPTM模块,可工作于32、16位定时模式,16位输入捕获
模式,16位PWM模式。
8. MCS-51单片机中的16位定时器属于加1计数模式,LM3S微控制器的GPTM属于
减1计数模式。
9. LM3S的串口功能有通用异步串口通信_、_红外通信模式两种主功能。 10. LM3S的ADC模块是属于10位A/D转换器。最大转换频率为1Mbps。工作时采用基于序列采样方式使一次可以完成多路模拟量的采集。 二 简答题
11. Stellaris微控制器内部和外部的晶振频率范围是多少?使用PLL功能时的工作频率是
多少? 答:内部采用12MHz时种,外部采用0~8MHz,PLL工作可以将低频时钟倍频到200MHz。 12. 请利用库函数设置外部晶振8MHz,利PLL后,让系统内核时钟为20MHz。 答:
SysCtlClock(SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN|SYSCTL_USE_PLL|SYSCTL_SYSDIV_10)
13. 请利用库函数设置处理器进入睡眠模式,并说明如何退出睡眠模式? 答:进入睡眠模式:SysCtlSleep()
退出睡眠模式:任何一个中断都可以使进入睡眠状的处理器退出睡眠模式。 14. 操作定时器让开发板上的4只LED软流流发光,其亮灭时间为0.5s。
发光二极管电路原理如图所示,系统时钟采用外接6MHz,先进行预分频100,变成频率为60000Hz,周期为
11(s),再计数30000次(x30000(s)?0.5s)。
6000060000
代码:
主程序:时种配置、外围模块的使能、定时器0设置成16位周期定时,预分频100,初值为30000。 void main() {
SysCtlClockSet(SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ |SYSCTL_SYSDIV_1); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); //使能B口
GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); //管脚输出 SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); //使能Timer0模块
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |TIMER_CFG_A_PERIODIC); //16位周期定时 TimerPrescaleSet(TIMER0_BASE, TIMER_A, 99); //预先进行100分频(6M/100)=60000 TimerLoadSet(TIMER0_BASE, TIMER_A, 30000);// 设置Timer初值,定时500ms TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //使能Timer超时中断 IntEnable(INT_TIMER0A); // 使能Timer中断 IntMasterEnable(); //使能处理器中断 TimerEnable(TIMER0_BASE, TIMER_A); //使能Timer计数 while(1){;} //循环 }
中断服务程序:间隔0.5s,PB1、PB4、PB5、PB6依次输出1,点亮四只发光二极管。 void Timer0A_ISR(void) {
unsigned char i; unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态 TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要 switch (i) {
case 0:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X02); break; case 1:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X10); break; case 2:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X20); break; case 3:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X40); break;} i++; if(i==4) {i=0} }
15. 编写程序实现将开发板上的A/D模块采集到的电压数据用串行通信口送到PC机,PC
机通过串口调式精灵或超级终端端观看数据。 答:
void uartInit(void) {
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // 使能UART模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 使能RX/TX所在的GPIO端口 UARTConfigSet(UART0_BASE, // 配置UART端口 115200, // 波特率:9600
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 配置RX/TX所在管脚为
UART_CONFIG_WLEN_8 | // 数据位:8 UART_CONFIG_STOP_ONE | // 停止位:1 UART_CONFIG_PAR_NONE); // 校验位:无 UARTEnable(UART0_BASE); // 使能UART端口 }
void adcInit(void) {
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块的时钟 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //125KSps采样率 ADCSequenceDisable(ADC_BASE, 0); //禁能所有采样序列
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); //采样序列0为处理器触发,优先级为0
ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_END); //样序列0的第0步使用ADC0通道,完成第0步后结束
ADCSequenceEnable(ADC_BASE, 0); // 使能采样序列0 }
Include <
#define HWREG(x) (*((volatile unsigned long *)(x))) #define UART0_DATA 0x4000C000
#define UART0_FLAG 0x4000C018 /*UART标置寄存器*/ Void main() {
unsigned int ulData; uartInit(); adcInit(); while(1) {
ADCProcessorTrigger(ADC_BASE, 0); //处理器触发采样序列0 while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) );
// 等待FIFO 0为非空,即等待转换结束
ADCSequenceDataGet(ADC_BASE, 0, &ulData); //读出10位转换结果 ulData = (ulData * 1000 * 3.3) / 1024; //换算成真实电压值,单位mV HWREG(UART0_DATA)=ulData; //数据发给你串口 while((HWREG(UART0_FLAG)&0x8)); //检测发送完毕 } }
16. 编程实现SSI驱动8位数码管显示,并显示0、1、2、3、4、5、6、7,结合RTC显
示实时时钟。 答:
程序代码:
#include 《lm3sxxxx.h》
#define BitRate 115200 //设定波特率
#define DataWidth 16 //16位宽
unsigned char dispBuf[8]; // 定义显示缓冲区
unsigned short DISP_TAB[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //段码 const unsigned char DigTab[8] = {0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08 }; // 定义数码管位选数据 int main (void) {
unsigned char n=0; unsigned short t;
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); //为SSI提供时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //为GPIOA端口提供时钟 /* 设置SPI为主机模式0,16位数据宽度,115200的波特率*/
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth); SSIEnable(SSI_BASE); // 使能SPI
/* 设定 GPIO A 2~5 引脚为使用外设功能*/
GPIOPinTypeSSI(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5)); //设置SSI管脚 while (1) {
for (n=0; n<=7; n++) {
t = DigTab[n]; // 获取位选数据 t <<= 8; // 位选数据放在高8位 t |= DISP_TAB[dispBuf[n]];; // 段选数据放在低8位 SSIDataPut(SSI_BASE, t); // 输出数据,共16个有效位 } }
//SysCtlDelay(20 * (TheSysClock / 3000));
}
17. 编程用PWM实现直流电机转速控制。 答:
/******************************************************************************************* LM3S系列PWM例程:在PB0/PWM2和PB1/PWM3管脚产生占空比不同的PWM方波
*******************************************************************************************/ #include \#include \#include \#include \#include \
#define PB0_PWM2 GPIO_PIN_0 #define PB1_PWM3 GPIO_PIN_1 int main (void) {
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //使能PWM2和PWM3输出所在GPIO SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); //使能PWM模块 SysCtlPWMClockSet(SYSCTL_PWMDIV_1); //PWM时钟配置:不分频
GPIOPinTypePWM(GPIO_PORTB_BASE, (GPIO_PIN_0 | GPIO_PIN_1)); //PB0和PB1配置为PWM功能
PWMGenConfigure(PWM_BASE, PWM_GEN_1, //配置PWM发生器1:加减计数 PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 6000); //设置PWM发生器1的周期 PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 4200); //设置PWM2输出的脉冲宽度 PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 2100); // 设置PWM3输出的脉冲宽度 PWMOutputState(PWM_BASE, (PWM_OUT_2_BIT | PWM_OUT_3_BIT), true); //使能PWM2和PWM3的输出
PWMGenEnable(PWM_BASE, PWM_GEN_1); // 使能PWM发生器1, 开始产生PWM方波 for (;;) { } }
共分享92篇相关文档