简述嵌套向量中断控制器(NVI C)的主要特性。
答:STM32的嵌套向量中断控制器(NVIC) 管理着包括Cortex-M3核异常等中断,其和ARM处理器核的接口紧密相连,可以实现低延迟的中断处理,并有效地处理晚到的中断。
STM32嵌套向量中断控制器(NVIC)的主要特性如下:q 具有43 个可屏蔽中断通道(不包含16 个Cortex-M3 的中断线)。
q 具有16 个可编程的优先等级。
q 可实现低延迟的异常和中断处理。
q 具有电源管理控制。
q 系统控制寄存器的实现。
1.简述STM32的ADC系统的功能特性。
答:STM32的ADC系统的主要功能特性包括如下几个方面:ADC开关控制、ADC时钟、ADC通道选择、ADC的转换模式、中断、模拟看门狗、ADC的扫描模式、ADC的注入通道管理、间断模式、ADC 的校准模式、ADC的数据对齐、可编程的通道采样时间、外部触发转换、DMA请求、双ADC模式和温度传感器。
2.简述STM32的双ADC工作模式。
答:在有两个ADC的STM32器件中,可以使用双ADC模式。
在双ADC模式里,根据ADC_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同时触发。
双ADC工作模式主要包括如下几种:同时注入模式、同时规则模式、快速交替模式、慢速交替模式、交替触发模式和独立模式。
1.简述STM32的USART的功能特点。
、答:STM32的USART为通用同步异步收发器,其可以与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。
USART还可以利用分数波特率发生器提供宽范围的波特率选择。
STM32的USART支持同步单向通信和半双工单线通信。
同时,其也支持LIN(局部互连网),智能卡协议和IrDA(红外数据)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。
STM32还具备多处理器通信能力。
另外,通过多缓冲器配置的DMA方式,还可以实现高速数据通信。
1.简述STM32的高级控制定时器TIM1的结构。
答:STM32提供了一个高级控制定时器(TIM1)。
TIM1由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。
TIM1适合多种用途,包含测量输入信号的脉冲宽度,或者产生输出波形。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器TIM1和通用控制定时器TIMx是完全独立的,它们不共享任何资源,因此可以同步操作。
2.简述STM32时钟的类型。
答:STM32提供了三种不同的时钟源,其都可被用来驱动系统时钟SYSCLK,这三种时钟源分别为:q HSI 振荡器时q HSE振荡器时钟q PLL时钟这三种时钟源还可以有以下2种二级时钟源:q 32kHz低速内部RC,可以用于驱动独立看门狗和RTC。
其中,RTC用于从停机/待机模式下自动唤醒系统。
q 32.768kHz低速外部晶振也可用来驱动RTC(RTCCLK)。
任一个时钟源都可被独立地启动或关闭,这样可以通过关闭不使用的时钟源来优化整个系统的功耗。
1.简述DMA控制器的基本功能。
答:STM32的DMA 控制器有7个通道,每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。
还有一个仲裁器来协调各个DMA 请求的优先权。
DMA 控制器和Cortex-M3 核共享系统数据线执行直接存储器数据传输。
因此,1 个DMA请求占用至少2 个周期的CPU 访问系统总线时间。
为了保证Cortex-M3 核的代码执行的最小带宽,DMA 控制器总是在2 个连续的DMA 请求间释放系统时钟至少1 个周期。
NVIC和外部中断:配置中断0(LED绿灯闪1次),中断1(LED蓝灯闪2次),中断2三个中断(LED 绿灯闪3次),执行顺序为0-->1-->2。
(默认中断0闪烁的是绿灯)按下按键,绿灯闪(一亮一灭)1次,蓝灯闪2次,然后绿灯闪3次,中断结束。
#include "stm32l1xx.h"#include "stdio.h"#include "discover_board.h"#include "stm32l_discovery_lcd.h"#include "stdarg.h"/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);void Init_GPIOs (void);void Delay(uint32_t nTime);void USART_Configuration(void);void EXTI_Configuration(void);void NVIC_Configuration(void);static volatile uint32_t TimingDelay;int main(void){ /* Configure Clocks for Application need */RCC_Configuration();SysTick_Config(16000000/ 2000);NVIC_Configuration();/* Init I/O ports */Init_GPIOs();USART_Configuration();EXTI_Configuration();// printf("\r\nWelcome !!!\r\n");while(1){ // Delay(20);// printf("\r\nWelcome !!!\r\n");}}void RCC_Configuration(void){ RCC_DeInit();/* Enable HSI Clock */RCC_HSICmd(ENABLE);/*!< Wait till HSI is ready */while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET){}/* RCC_PLLCmd(DISABLE);RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_3,RCC_PLLDiv_2);RCC_PLLCmd(ENABLE); *//*!< Wait till PLL is ready */// while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)// {}// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);RCC_MSIRangeConfig(RCC_MSIRange_6);RCC_HSEConfig(RCC_HSE_OFF);if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET ){ while(1); }/* Enable comparator clock LCD and PWR mngt *///RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD | RCC_APB1Periph_PWR, ENABLE); /* Enable ADC clock & SYSCFG */RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG | RCC_APB2Periph_USART1 , ENABLE);}void Init_GPIOs (void){ GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIOs clock */RCC_AHBPeriphClockCmd(LD_GPIO_PORT_CLK|USERBUTTON_GPIO_CLK, ENABLE);/* Configure User Button pin as input */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;//USERBUTTON_GPIO_PINGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;GPIO_Init(USERBUTTON_GPIO_PORT, &GPIO_InitStructure);/* Configure the GPIO_LED pins LD3 & LD4*/GPIO_InitStructure.GPIO_Pin = LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(LD_GPIO_PORT, &GPIO_InitStructure);//GPIO_LOW(LD_GPIO_PORT, LD_GREEN_GPIO_PIN);//GPIO_LOW(LD_GPIO_PORT, LD_BLUE_GPIO_PIN);/*Configure the USART1_GPIO_PORT *//* Connect PA9 to USART1_Tx */GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);/* Connect PA10 to USART1_Rx*/GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);/* Configure USART1_Tx and USART1_Rx as alternate function */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Enable all GPIOs clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD |RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH, ENABLE);}void USART_Configuration(void){USART_InitTypeDef USART_InitStructure;USART_ClockInitTypeDef USART_ClockIni;USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No ;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStructure);USART_ART_Clock = USART_Clock_Disable;USART_ART_CPOL = USART_CPOL_Low;USART_ART_CPHA = USART_CPHA_2Edge;USART_ART_LastBit = USART_LastBit_Disable;USART_ClockInit(USART1,&USART_ClockIni);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1,ENABLE)}void EXTI_Configuration(){ EXTI_InitTypeDef EXTI_InitStructure;/定义PA0,PA1,PA2为外部中断输入通道/SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource2);/* Configure EXT1 Line 0 1 2 in interrupt mode trigged on Falling edge */EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2 ; // PA0 for User button EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}void NVIC_Configuration(){ NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM//Èç¹ûC/C++ Compiler\Preprocessor\Defined symbolsÖе͍ÒåÁËVECT_TAB_RAM£¨¼û³ÌÐò¿â¸ü¸ÄÄÚÈݵıí¸ñ£©NVIC_SetVectorT able(NVIC_VectTab_RAM, 0x0); //ÔòÔÚRAMµ÷ÊÔ#else //Èç¹ûûÓж¨ÒåVECT_TAB_RAMNVIC_SetVectorT able(NVIC_VectTab_FLASH, 0x0);//ÔòÔÚFlashÀïµ÷ÊÔ#endif //½áÊøÅжÏÓï¾äNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* Enable and set EXTI0 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void Delay(uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){ TimingDelay--; }}int fputc(int ch,FILE *f){ USART_SendData(USART1,(unsigned char)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);return ch;}#include "stm32l1xx_it.h"#include "main.h"void NMI_Handler(void){}void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */while (1) { }}void MemManage_Handler(void){ /* Go to infinite loop when Memory Manage exception occurs */ while (1) { }}void BusFault_Handler(void){/* Go to infinite loop when Bus Fault exception occurs */while (1) { }}void UsageFault_Handler(void){ /* Go to infinite loop when Usage Fault exception occurs */ while (1) {}}void SVC_Handler(void){}void DebugMon_Handler(void){}void PendSV_Handler(void){}void SysTick_Handler(void){TimingDelay_Decrement();}void DMA1_Channel1_IRQHandler (void){}void RTC_WKUP_IRQHandler(void){}void EXTI0_IRQHandler(void){ int i;GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}EXTI_GenerateSWInterrupt(EXTI_Line1);EXTI_ClearFlag(EXTI_Line0);}void EXTI1_IRQHandler(void){int i;GPIO_TOGGLE(LD_GPIO_PORT ,LD_BLUE_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_BLUE_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_BLUE_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_BLUE_GPIO_PIN );for(i=0;i<500000;i++){}EXTI_GenerateSWInterrupt(EXTI_Line2);EXTI_ClearFlag(EXTI_Line1);}void EXTI2_IRQHandler(void){int i;GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}GPIO_TOGGLE(LD_GPIO_PORT ,LD_GREEN_GPIO_PIN );for(i=0;i<500000;i++){}EXTI_ClearFlag(EXTI_Line2);}/*void PPP_IRQHandler(void){}*/ * @}(配置的两个定时器通道的中断请求的时间间隔分别为1秒和2秒)红红每隔1秒闪烁1次,绿灯每隔2秒闪烁1次。