《STM32Cube嵌入式系统应用》 习题及答案_第1页
《STM32Cube嵌入式系统应用》 习题及答案_第2页
《STM32Cube嵌入式系统应用》 习题及答案_第3页
《STM32Cube嵌入式系统应用》 习题及答案_第4页
《STM32Cube嵌入式系统应用》 习题及答案_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《STM32Cube嵌入式系统应用》标准库习题答案第1章【答案】2.简述冯·诺依曼结构和哈佛结构的区别。【答案】【答案】4.什么是嵌入式系统?【答案】5.嵌入式系统与通用计算机系统的异同点?【答案】6.嵌入式系统的特点主要有哪些?【答案】7.常见的嵌入式操作系统有哪几种?【答案】8.ARM处理器有什么特点?【答案】因为ARM处理器采用RISC结构,所以它具有RISC架构的一些经典特点。(1)体积小、功耗低、成本低、性能高。(2)支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件。(3)大量使用寄存器,指令执行速度更快。(4)大多数数据操作都在寄存器中完成。(5)寻址方式灵活简单,执行效率高。内含嵌入式在线仿真器。9.简述ARM处理器的应用领域。【答案】ARM处理器可广泛应用于以下领域。(1)为通信、消费电子、成像设备等产品,提供可运行复杂操作系统的开放应用平台。(2)在海量存储、汽车电子、工业控制和网络应用等领域,提供实时嵌入式应用。在军事、航天等领域,提供宽温、抗电磁干扰、耐腐蚀的复杂嵌入式应用。10.什么嵌入式微处理器分类。【答案】嵌入式微处理器、嵌入式微控制器、嵌入式DSP、嵌入式SoCCortex-M系列处理器有哪些特征?【答案】Cortex-M系列处理器的特征如下:第2章【答案】【答案】【答案】如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源。【答案】LSI校准的分四步进行:【答案】【答案】【答案】第3章1.STM32CubeMX软件是什么?【答案】STM32CubeMX软件是ST有限公司为STM32系列微控制器快速建立工程,并快速初始化使用到的外设、GPIO等而设计的,大大缩短了开发时间。2.STM32CubeMX软件的特点是什么?【答案】(1)集成了ST有限公司的每一款型号的MCU/MPU的可配置的图形界面,能够自动提示IO冲突并且对于复用IO可自动分配。(2)具有动态验证的时钟树。(3)能够很方便的使用所集成的中间件。(4)能够估算MCU/MPU在不同主频运行下的功耗。(5)能够输出不同编译器的工程,比如能够直接生成MDK、EWARM、STM32CubeIDE、MakeFile等工程。3.STM32CubeMX软件的工作区有哪4个界面?(1)Pinout&Configuration(引脚与配置)界面,这是对MCU的系统内核、外设、中间件和引脚进行配置的界面,是主要的工作界面。(2)ClockConfiguration(时钟配置)界面,通过图形化的时钟树对MCU的各个时钟信号频率进行配置的界面。(3)ProjectManager(项目管理)界面,对项目进行各种设置的界面。(4)Tools(工具)界面,进行功耗计算、DDRSDRAM适用性分析(仅用于STM32MP1系列)的操作界面。第4章1.STM32CubeIDE软件是什么?【答案】STM32CubeIDE是STM32Cube生态系统中的一个重要软件工具,是ST官方免费提供的STM32MCU/MPU程序开发IDE软件。2.STM32CubeIDE有什么特点?【答案】STM32CubeIDE就是在TrueSTUDIO基础上改进和升级得来的,有如下一些特点。(1)STM32CubeIDE使用的是EclipseIDE环境,具有强大的编辑功能,其使用习惯与TrueSTUDIO相同。(2)STM32CubeIDE使用的是GNUC/C++编译器,支持在STM32项目开发中使用C++编程。(3)STM32CubeIDE内部集成了STM32CubeMX,在STM32CubeIDE里就可以进行MCU图形化配置和代码生成,然后在初始代码基础上继续编程。当然,STM32CubeIDE也可以和独立的STM32CubeMX配合使用。3.STM32CubeProgrammer软件有什么特色?(1)可对片内Flash进行擦除或编程以及查看Flash内容。

(2)支持s19、hex、elf和bin等格式的文件。

(3)支持调试接口或bootloader接口。=1\*GB3①STLINK调试接口(JTAG/SWD)=2\*GB3②UART或USBDFUbootloader接口

(4)支持对外部的存储器的擦除或编程。

(5)支持STM32芯片的自动编程(擦除、校验、编程、选项字配置)。

(6)支持对STM32片内OTP区域的编程。

(7)既支持图形化界面操作也支持命令行操作。

(8)支持对ST-Link调试器的在线固件升级。

(9)配合STM32TrustedPackageCreatortool实现固件加密操作。

(10)支持Windows、Linux和MacOS多种操作系统。第5章1.列举GPIO的工作模式。【答案】(1)输入浮空模式。(2)输入上拉模式。(3)输入下拉模式。(4)模拟功能模式。(5)具有上拉/下拉功能的开漏输出模式。(6)具有上拉/下拉功能的推挽输出模式。(7)具有上拉/下拉功能的复用功能推挽模式。(8)具有上拉/下拉功能的复用功能开漏模式。2.STM32F407系列微控制器每个GPIO端口有__16个__引脚。3.当引脚被配置为模拟功能模式时,上拉/下拉功能应被_禁止_。4.当引脚被配置为输出模式,而输出类型被配置为开漏时,引脚要输出高电平,需要__使能引脚上拉功能____。5.控制引脚输出电平时,需要操作__ODR____寄存器;获取引脚状态需要操作__IDR____寄存器。6.在stm32f407的库函数中,使能GPIOA时钟,使用的库函数是_voidRCC_AHB2PeriphClockCmd(uint32_tRCC_AHB2Periph,FunctionalStateNewState)____。7.在stm32f407的库函数中,初始化GPIO功能,使用的库函数是voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)____。8.当要同时初始化某个GPIO的1号、2号引脚,赋给GPIO_InitTypeDef结构体类型成员GPIO_Pin的值是__GPIO_Pin_1|GPIO_Pin_2____。9.在stm32f407的库函数中,读取某个特定GPIO引脚状态,使用的库函数是GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)____。10.在stm32f407的库函数中,设定某些特定GPIO引脚输出状态,使用的库函数是voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal)。11.结合电路说明推挽输出和开漏输出的区别。【答案】在推挽输出下,输出电路中有PMOS和NMOS管组成的推挽结构电路,当ODR寄存器中对应位写‘1’时,NMOS管截止,PMOS管导通,引脚输出高电平。当ODR寄存器中对应位写‘0’时,NMOS管导通,PMOS管截止,引脚输出低电平。在开漏输出下,输出电路中有只有NMOS管,当ODR寄存器中对应位写‘1’时,NMOS管截止,这是引脚处于浮空状态,必须通过上拉电阻使引脚输出高电平。当ODR寄存器中对应位写‘0’时,NMOS管导通,PMOS管截止,引脚输出低电平。12.当把引脚配置为模拟输入模式时,那么它是否还具备耐5V功能?【答案】不具备耐5V功能。此时,引脚输入通道和数字电路隔离,处于模拟电路状态13.简述片上外设使用初始化流程。【答案】(1)使能GPIO的时钟(非常重要),涉及以下文件。(2)设置对应于片上外设使用的GPIO工作模式。(3)如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。(4)在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能。14.编写程序,将GPIOD的1号、3号、5号、7号、9号引脚配置为推挽输出模式,速度为50MHz,将0、2号、4号、6号、8号引脚配置为上拉输入模式。【答案】GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOD,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);15.编写程序,将GPIOD的1号、5号、7号引脚输出高电平,3号、9号引脚输出低电平,并将引脚2号、6号、8号上的状态读到处理器中。【答案】unsignedshortinta,b,c;GPIO_SetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_7);GPIO_ResetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_9);a=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2);b=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6);c=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8);16.有独立按键电路,连接在STM32F407ZGT6微控制器的GPIOE的5号引脚,要求在每次按键后将连接GPIOB的2号引脚上的LED灯反转,电路如图所示。请编写程序实现按键动作的检测,编写以下程序。(1)主程序。(2)连接按键引脚和LED引脚的初始化程序。(3)按键检测程序。假设已有延时函数voiddelay_ms(u16nms);,此函数可直接调用。【答案】#defineKEY_ON 1#defineKEY_OFF 0GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin))GPIO_ResetBits(GPIOx,GPIO_Pin);elseGPIO_SetBits(GPIOx,GPIO_Pin);}(1)intmain(void){delay_init(168);//初始化延时函数 LED_GPIO_Config(); Key_GPIO_Config(); while(1) { if(Key_Scan(GPIOE,GPIO_Pin_5)==KEY_ON) { GPIO_TogglePin(GPIOB,GPIO_Pin_2); }}}(2)voidKey_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOE,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStructure);}voidLED_GPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}(3)uint8_tKey_Scan(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON) { delay_ms(100);//去抖动 if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON) return KEY_ON; else returnKEY_OFF; } else returnKEY_OFF;}17.有矩阵按键,其电路如图所示。(1)矩阵按键扫描原理和流程图。(2)编写程序实现矩阵按键控制,按键S1~S4分别对应数字1~4(引脚初始化程序和按键控制程序)。【答案】(1)①将列线设置为输出模式(图中PB0和PB1),并分别在PB0和PB1上输出低电平。行线设置为输入模式(图中PB2和PB3)。都使能上拉。②读取PB2和PB3状态,判断是否有按键按下。(判断原则:PB2和PB3都是高电平时,没有按键按下。PB2和PB3有任何一个为低电平是,有按键按下。判断原理:在没有按键按下去的时候,由于上拉电阻的存在,PB2和PB3都是高电平,读取状态时,PB2=1,PB3=1。如果有按键按下去的话,摸一个行线和列线连接在一起。由于PB0和PB1都为低电平,因此连接在一起的行线会被列线下拉到低电平。这时,在读取PB2和PB3状态时,就不会全是高电平。例如:当按下S1时,PB1和PB2连在一起,PB2被PB1拉低到低电平。读取PB2和PB3状态时,PB2=0,PB3=1。)有按键按下则继续③,反之则结束。③延时去抖动。典型值是延时10ms,不同的按键类型,时间长度不一样。④在此判断是否有按键按下,原理同步骤②②④都判断有按键按下时,继续⑤。反之则结束。⑤保存读取的PB2和PB3的状态,作为判别行号的依据。⑥将行线设置为输出模式(图中PB2和PB3),并分别在PB2和PB3上输出低电平。列线设置为输入模式(图中PB0和PB1)。都使能上拉。⑦读取PB0和PB1的状态,并保存。作为判别列线的依据。⑧根据⑤⑦两个步得到的信息,算出是哪一个按键被按下去了。矩阵键盘扫描流程图:(2)/*将列设置为输入,行设置为输出*/voidGPIO_LieIN_HangOUT(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIO_InitStructure);}/*将列设置为输出,行设置为输入*/voidGPIO_LieOUT_HangIN(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIO_InitStructure);}voidKEY_SCAN(void){u8Lie_Data,Hang_Data;GPIO_LieOUT_HangIN();GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);//将列设置为低电平,扫描行if((GPIO_ReadInputData(GPIOB)&0x0a)!=0x0a){ delay_ms(100);//去抖动 if((GPIO_ReadInputData(GPIOB)&0x0a)!=0x0a) { Hang_Data=GPIO_ReadInputData(GPIOB)&0x0a;//保存行扫描结果 GPIO_LieIN_HangOUT(); GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);//将行设置为低电平,扫描列 Lie_Data=GPIO_ReadInputData(GPIOB)&0x0a;//保存列扫描结果 switch(Hang_Data|Lie_Data) { case0x09:// return(1); break; case0xa:// return(2); break; case0x05:// return(3); break; case0x06:// return(4); break; default: break; } } } else return(0); }第6章1.简述STM32F407微控制器中的NVIC中断管理方法。【答案】Cortex-M4内核中定义了两个优先级的概念:抢占优先级和响应优先级,每个中断源都需要被指定这两种优先级,由两者的组合得到中断的优先级别。NVIC对中断优先级的管理方法如下。(1)抢占优先级较高的中断可以打断正在进行的抢占优先级较低的中断,不同抢占优先级的中断可以实现中断的嵌套。(2)抢占优先级相同的中断,响应优先级高的不可以打断响应优先级低的中断。(3)当两个抢占优先级相同的中断同时发生的情况下,哪个中断响应优先级高,哪个中断就先执行。(4)(5)如果两个中断的抢占优先级和响应优先级都一样,且同时请求,则根据异常中断向量表中的排位顺序决定哪个中断先执行。2.中断优先级编号越小,则其优先级越高。3.中断抢占优先级高的是否可以抢占优先级低的中断流程?可以。4.响应抢占优先级高的是否可以抢占优先级低的中断流程?在抢占优先级一致时,不可以。5.两个中断抢占优先级和响应优先级都相同,同时向内核申请中断,怎么响应中断?【答案】按照两个中断在中断向量表中的位置决定。向量表中位置靠前的先被响应。6.假定设置中断优先级组为1,然后设置:中断3(RTC中断)的抢占优先级为1,响应优先级为1;中断6(外部中断0)的抢占优先级为3,响应优先级为0;中断7(外部中断1)的抢占优先级为1,响应优先级为6。那么,这3个中断的优先级顺序为(由高到底):中断3、中断7、中断6。7.设置结构体变量NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority和NVIC_InitStructure.NVIC_IRQChannelSubPriority,并初始化结构体NVIC_Init(&NVIC_InitStructure);用于设置中断抢占优先级和子优先级。8.设置结构体NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE,并初始化结构体NVIC_Init(&NVIC_InitStructure);用于使能中断。9.voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)函数用来配置中断优先级组。10.在头文件stm32f4xx.h中定义的中断编号,是以枚举类型定义的。请问外部中断0的编号是____6____。11.当中断优先级组设置为2组时,抢占优先级和响应优先级可以分别设置为哪些优先级?【答案】抢占优先级:0~3响应优先级:0~312.编写NVIC中断初始化程序实现如下功能。(1)设置中断优先级组为2组。(2)设置外部中断2的抢占优先级为0,响应优先级为2。(3)设置定时器2中断的抢占优先级为2,响应优先级为1。(4)设置USART2的中断抢占优先级为3,响应优先级为3。并说明当同时出现以上3个中断请求时,中断服务程序执行的顺序。【答案】staticvoidMX_NVIC_Init(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}//初始化函数结束外部中断2、定时器2中断、USART2的中断13.外部中断的中断请求信号可以是控制器外部产生由GPIO引脚引入的,也可以是由控制器内部一些片上外设产生的。这一说法是否正确?___正确_____。14.每个GPIO引脚都可以作为外部中断信号输入引脚,GPIO引脚编号相同的映射到同一个EXTI线,那么GPIOA的0号引脚映射到EXTI线___0_____,GPIOD的0号引脚映射到EXTI线_____0___,GPIOC的5号引脚映射到EXTI线_____5___,GPIOG的10号引脚映射到EXTI线____10____。15.外部中断信号输入的触发信号形式可以是__上升沿触发_、_下降沿触发_、_边沿触发_、。16.每个外部中断在中断向量表中,是否都独立占用一个位置?__不是__17.外部中断___5~9_____共用一个中断向量和外部中断__10~15__共用一个中断向量。18.外部中断的中断0在库函数启动文件中定义的默认中断函数名是__EXTI0_IRQHandler__。19.结构体\o"EXTIInitStructuredefinition."EXTI_InitTypeDefEXTI_InitStructure有什么功能?【答案】配置EXTI中断线。20.函数voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)有什么功能?【答案】初始化中断优先级和使能状态。21.应用外部中断,需要先使能GPIO端口的时钟和___SYSCFG___时钟。22.试述初始化外部中断的步骤。【答案】(1)使能用到GPIO时钟。(2)初始化相应GPIO的引脚为输入。(3)设置GPIO引脚与EXTI线的映射关系。(4)初始化工作类型、设置触发条件、使能等等。(5)配置中断分组(NVIC),并初始化相应中断通道的优先级及使能/禁止。(6)编写中断服务函数。(7)编写中断服务程序处理内容。23.初始化外部中断1:将GPIOA的1号引脚作为输入引脚,中断模式,上升沿触发,中断优先级组为3组,抢占优先级为3,响应优先级为1,并使能中断。GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);EXTI_InitStructure.EXTI_Line=EXTI_Line1;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);24.外部中断被挂起后,不能硬件清除,需要在相应的中断服务程序中将挂起标志清除,使用的函数是__voidEXTI_ClearITPendingBit(uint32_tEXTI_Line)。25.根据下图所示,编写程序以完成外部中断初始化,中断输入引脚为PE5,上升沿检测方式。【答案】EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;//-------------------第1步--------------------/*初始化IO口为输入*/GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStructure);//-------------------第2步--------------------/*开启IO口复用时钟。*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//-------------------第3步--------------------/*设置IO口与中断线的映射关系。*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);//-------------------第4步--------------------/*初始化线上中断,设置触发条件等。*/EXTI_InitStructure.EXTI_Line=EXTI_Line1;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);//-------------------第5步--------------------/*配置中断分组(NVIC),并使能中断。*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);15.编写14题的外部中断的服务程序,完成LED灯(PB2)的开关控制。【答案】GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin))GPIO_ResetBits(GPIOx,GPIO_Pin);elseGPIO_SetBits(GPIOx,GPIO_Pin);}voidEXTI5_IRQHandler(void){ //LED状态转换 GPIO_TogglePin(GPIOB,GPIO_Pin_2);}第7章1.STM32F407定时器的计数方式有__递增计数__、__递减计数_、___中心对齐_。2.STM32F407计数寄存器是__TIMx_CNT__,自动重载寄存器是__TIMx_ARR_,预分频寄存器是__TIMx_PSC__。3.若TIMx_PSC=4,则时钟源的预分频系数是____5____。4.若TIMx_ARR=89,则一次计数溢出的计数次数是___90_____。5.什么是PWM信号?什么是占空比?请绘图举例。【答案】PWM(PulseWidthModulation):脉冲宽度调制,简称脉宽调制。PWM信号:周期内高电平占空比可调的信号。占空比:一个周期内高电平持续时间与一个周期时间的比值。6.递增计数模式是从0计数到___ARR_____的值,然后产生一次__溢出事件___。7.递减计数模式是从_ARR_计数到0的值,然后产生一次向下溢出。中心对齐计数模式是先以递增计数模式,从0计数到__ARR-1___,然后产生一次向上溢出,再在从___ARR_____计数到____1____,然后产生一次向下溢出。8.当使能了比较输出功能,输出PWM波,在边沿比较模式下,寄存器___ARR_____控制PWM周期,寄存器___CCR___控制占空比。9.当使能了比较输出功能,输出PWM波,在边沿比较模式下,当TIMx_CNT计数值在_0~CCR-1寄存器___范围时,输出有效电平;在CCR~ARR范围时,输出反向电平。10.【答案】11.编程序,使用TIM1产生1s的定时。【答案】TIM1挂载在APB2总线上,在系统时钟=180MHz时,PCLK2=90MHz,TIM1的内部时钟源=PCLK2*2=180MHz。Tout(定时时间)=1s=(ARR+1)(PSC+1)/1800000000,则可以取PSC=18000-1,ARR=10000-1。/*-------------------第1步--------------------*/ //开启TIM1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); /*-------------------第2步--------------------*/TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=10000-1;TIM_TimeBaseStructure.TIM_Prescaler=18000-1;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIMTIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM1,TIM_FLAG_Update);TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);TIM_Cmd(TIM1,ENABLE); /*-------------------第3步--------------------*///配置中断分组(NVIC),并使能中断。NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);12.编程序,使用TIM3产生PWM波。【答案】(1)通过TIM3的CH1输出PWM波。(2)PWM波周期为200KHz,占空比为20%。(3)TIM3的CH1对用的引脚为PA6。GPIO_InitTypeDefGPIO_InitStruct;TIM_TimeBaseInitTypeDefTIM_InitStruct;TIM_OCInitTypeDefTIM_OCInitStruct; /*-------------------第1步--------------------*/ /*开启相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能TIM3时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); /*-------------------第2步--------------------*/ /*TIM3输出通道1引脚配置*/GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct); /*-------------------第3步--------------------*/ //定时器时钟源TIMxCLK=HCLK/2=90MHz //设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=200KHz //定义PWM波的周期//当定时器从0计数到999,即为1000次,为一个定时周期TIM_InitStruct.TIM_Prescaler=449;TIM_InitStruct.TIM_Period=999;TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_InitStruct);TIM_InternalClockConfig(TIM3);TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Reset);TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Disable); /*-------------------第4步--------------------*/ /*设置比较输出通道,PWM模式配置*/TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_Pulse=200;TIM_OC1Init(TIM3,&TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); /*-------------------第5步--------------------*/ //使能定时器TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);TIM_Cmd(TIM3,ENABLE);13.编程序,使用TIM2检测外部一未知时钟的频率。【答案】信号从TIM2的通道1输入。使用的引脚是PA5。定时器初始化voidTIM_Config_IC(void){GPIO_InitTypeDefGPIO_InitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructInit;TIM_ICInitTypeDefTIM_ICInitStruct;NVIC_InitTypeDefNVIC_InitStructure; /*-------------------第1步--------------------*/ //使能TIM2和相关GPIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启APB时钟函数RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); /*-------------------第2步--------------------*/ //配置输入通道引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);\o"Changesthemappingofthespecifiedpin."GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,\o"AF2selection."GPIO_AF_TIM2); /*-------------------第3步--------------------*/ //初始化定时器测量时钟 //定时器时钟源TIMxCLK=HCLK/2=90MHz //设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHzTIM_TimeBaseStructInit.TIM_Prescaler=89;TIM_TimeBaseStructInit.TIM_CounterMode=TIM_CounterMode_Up;//计数方式TIM_TimeBaseStructInit.TIM_Period=4074967295;TIM_TimeBaseStructInit.TIM_ClockDivision=TIM_CKD_DIV1;//采样时钟分频TIM_TimeBaseStructInit.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructInit);//设置TIM2内部时钟源TIM_InternalClockConfig(TIM2); /*-------------------第4步--------------------*///设置触发相关参数TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);\o"SelectstheTIMxTriggerOutputMode."TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);\o"SetsorResetstheTIMxMaster/SlaveMode."TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Disable); /*-------------------第5步--------------------*/ //设置捕获相关参数 TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕抓到上升沿时,把计数寄存器中的值所存到CCR2寄存器TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//一对一连接TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;TIM_ICInitStruct.TIM_ICFilter=0;TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;TIM_ICInit(TIM2,&TIM_ICInitStruct);/*-------------------第6步--------------------*///开启定时器中断NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);(2)中断服务程序,实现频率计算voidTIM2_IRQHandler(void){if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC1)!=RESET) { /*清除定时器捕获/比较1中断*/TIM_ClearITPendingBit(TIM2,TIM_IT_CC1); /*获取输入捕获值*/ IC_Value=TIM_GetCapture1(TIM2);//得到PWM周期 /*频率计算*/ Frequency=90000000/90/(float)IC_Value; printf("频率:%0.2fHz\r\n",Frequency); }}第8章串行异步通信数据格式是什么?用图说明。【答案】【答案】1600。【答案】USART的工作原理:通用同步异步收发器(USART)提供了一种灵活的方法,与使用工业标准的异步串行外部设备之问进行全双工数据交换。USART利用分数比特率发生器提供宽范围的比特率选择。USART外部接口通过3个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。【答案】USART数据接收配置步骤如下:通过调用USART_Cmd来激活USART;通过配置结构体USART_InitTypeDef的成员USART_WordLength来定义字长;通过配置结构体USART_InitTypeDef的成员USART_StopBits编程停止位的位数;如果采用多缓冲器通信,配置DMA_Cmd函数进行使能。按多缓冲器通信中的描述配置DMA;通过配置结构体USART_InitTypeDef的成员USART_BaudRate要求的比特率调用函数USART_ReceiveData来读取接收缓冲其中的字符【答案】当使用USART模块进行全双工异步通信时,需要配置波特率、数据位数、奇偶校验、硬件流控制、停止位数、工作模式。【答案】编程代码如下:voidMX_USART1_UART_Init(void){USART_InitTypeDefUSART_InitStructure;USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_OverSampling8Cmd(USART1,DISABLE);USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);}【答案】USART的各种中断事件被连接到同一个中断向量,有以下几种中断事件:发送期间:发送完成中断、清除发送中断、发送数据寄存器空中断。接收期间:空闲总线检测中断、溢出错误中断、接收数据寄存器非空中断、检验错误中断、LIN断开符号检测中断、噪声中断(仅在多缓冲器通信)和帧错误中断(仅在多缓冲器通信)。8.编程序配置STM32F407微控制器的USART2为以下功能:波特率=9600bps,8位有效数据位、无奇偶校验、无硬件流控、使能接收和发送、使能接收中断。【答案】USART2发送引脚TX:PA2USART2接收引脚RX:PA3voidUSART_Config(void){GPIO_InitTypeDefGPIO_InitStructure; /*-------------------第1步--------------------*/ /*使能GPIOA时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);/*使能USART2时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART2,ENABLE); /*-------------------第2步--------------------*/ //配置串口相关复用引脚 /*复用PA2、PA3到USART2*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULLGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART1);GPIO_Init(GPIOA,&GPIO_InitStructure); /*-------------------第3步--------------------*//*配置USART2模式*/USART_InitTypeDefUSART_InitStructure;USART_InitStructure.USART_BaudRate=9600;//波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据位USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART2,&USART_InitStructure);USART_Cmd(USART2,ENABLE); /*-------------------第4步--------------------*/ //初始化NVIC中的USART2中断通道NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择嵌套向量中断控制器组2NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct); //使能串口的RXNE中断 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);///使能串口的RXNE中断 }9.编写USART2接收中断的程序。【答案】#defineBUFFERSIZE

(COUNTOF(aTxBuffer)-1)voidUSART2_IRQHandler(void){uint16_tubRxIndex=0x00;uint8_taTxBuffer[];/*USARTinReceivermode*/if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET){if(ubRxIndex<BUFFERSIZE){/*ReceiveTransactiondata*/aRxBuffer[ubRxIndex++]=USART_ReceiveData(USART2);}else{/*DisabletheRxbuffernotemptyinterrupt*/USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);}}10.编写USART2查询式发送数据的程序。【答案】 将字符ch发送出去。/*发送一个字节数据到USART*/ USART_SendData(USART2,(uint8_t)ch); //发送接收到的数据 /*等待发送数据寄存器为空*/ while(USART_GetFlagStatus(USART2,USART_FLAG_TC))!=SET); //等待发送结束11.怎么通过USART接收连续、不定长的数据流?【答案】这里提供两种思路。1)使用定时器配合实现(1)USART接收到第一个字符后(中断),启动一个定时器,定时时间大于一个USART数据帧时间。(2)后续,USART每接收到一个字符,都重新启动定时器,从0开始计数器(只需要将CNT寄存器清0)。(3)在定时器产生溢出中断后,表示USART数据接收结束。(因为连续接收数据的过程中断了。)2)使用USART的IDLE中断检测数据接收结束需要使能USART_IT_RXNE和USART_IT_IDLE中断。USART中断中,如果判定是由于USART_IT_RXNE触发,则接收数据。USART中断中,如果判定是由于USART_IT_IDLE触发,则表示数据接收。3)USART的IDLE中断和DMA实现使能USART的USART_IT_IDLE中断。使能USART的数据接收DMA,USART_DMAReq_Rx。在USART有数据接收时,DMA直接将数据存储到设定的存储器区域。在触发USART_IT_IDLE中断后,表示数据接收结束,并根据此时DMA的数据计数器获得接收数据的数量。第9章【答案】串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。SPI接口还能以多主配置方式工作,它有多种用途,如使用一条双向数据线的双线单工同步传输,还可使用CRC检验的可靠通信。SPI的特点如下:3线全双工同步传输。带或不带第3根双向数据线的双线单工同步传输。8或16位传输帧格式选择。主或从操作。支持多主模式。8个主模式比特率预分频系数(最大为fPCLK/2)。从模式频率(最大为fPCLK/2)。主模式和从模式的快速通信,最大SPI速度达到18MHz。主模式和从模式下均可以由软件或硬件进行NSS管理,主/从操作模式的动态改变。可编程的时钟极性和相位。可编程的数据顺序,MSB在前或LSB在前。可触发中断的专用发送和接收标志。SPI总线忙状态标志。支持可靠通信的硬件CRC。可触发中断的主模式故障、过载以及CRC错误标志。支持DMA功能的1字节发送和接收缓冲器,产生发送和接收请求。【答案】通常SPI通过以下4个引脚与外部期间相连:MISO:主设备输入/从设备输出引脚。该管脚在从模式下发送数据,在主模式下接收数据。MOSI:主设备输出/从设备输入引脚。该管脚在主模式下发送数据,在从模式下接收数据。SCK:串口时钟,作为主设备的输出,从设备的输入。NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通信,避免数据线上的冲突。从设备的NSS引脚可以由主设备当作一个标准的I/O来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI设置为主模式时拉低;此时,所有NSS引脚连接到主设备NSS引脚的SPI设备,会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。【答案】在从配置中,SCK引脚用于接收从主设备来的串行时钟,配置步骤如下:设置结构体SPI_InitTypeDef的成员SPI_DataSize,以定义数据帧格式为8位或16位。选择SPI_CPOL和SPI_CPHA位来定义数据传输和串行时钟之间的相位关系。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。帧格式(MSB在前还是LSB在前取决于结构体SPI_InitTypeDef的成员SPI_FirstBit必须和主设备相同。硬件模式下,在完整的数据帧(8位或16位)发送过程中,NSS引脚必须为低电平。软件模式下,设置为SPI_NSS_Soft。调用函数SPI_Cmd(),使相应引脚工作于SPI模式下。在主配置时,串行时钟在SCK引脚产生,配置步骤如下:设置结构体SPI_InitTypeDef的成员SPI_BaudRatePrescaler;定义串行时钟比特率。设置结构体SPI_InitTypeDef的成员SPI_DataSize,以定义数据帧格式为8位或16位。选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系。帧格式(MSB在前还是LSB在前取决于结构体SPI_InitTypeDef的成员SPI_FirstBit必须和主设备相同。如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS脚连接到高电平:在软件模式中,需设置结构体SPI_InitTypeDef的成员SPI_NSS。如果NSS引脚工作在输出模式,则只需设置SSOE位。必须调用函数SPI_Cmd()(只当NSS脚被连到高电平,这些位才能保持置位)。【答案】应用程序通过BUSY、TXE和RXNE3个状态标志可以完全监控SPI总线的状态。【答案】SPI总线初始化代码如下:【答案】SPI的中断请求有发送缓冲器空标志;接收缓冲器非空标志;主模式错误事件;溢出错误;CRC错误标志。第10章【答案】I2C(芯片间)总线接口连接微控制器和串行I2C总线,它提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时,支持标准和快速两种模式,同时与SMBus2.0兼容。【答案】I2C模块接收和发送数据,并将数据从串行转换成并行,或并行转换成串行,可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线,允许连接到标准(高达l00kHz)或快速(高达400kHz)的I2C总线。I2C模块有多种用途,包括CRC码的生成和检验、SMBus(系统管理总线-SystemManagementBus)和PMBus(电源管理总线-PowerManagemcntBus)。根据特定设备的需要,可以使用DMA以减轻CPU的负担。【答案】只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL。每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器。它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏。串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。连接到相同总线的IC数量只受到总线的最大电容400pF限制。I2C有4种模式可供选择,可以4种模式中的一种运行:从发送器模式。从接收器模式。主发送器模式。主接收器模式。【答案】I2C默认工作于从模式。接口在生成起始条件后自动从从模式切换到主模式:当仲裁丢失或产生停止信号时,则从主模式切换到从模式。允许多主机功能。主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。【答案】在主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件_开始并以停止条件结束。当通过库函数voidI2C_GenerateSTART(I2C_TypeDef*I2Cx,FunctionalStateNewState);设置状态参数为ENABLE在总线上产生了起始条件,设备就进入了主模式,主模式所要求的操作顺序。在I2C_InitStructure中设置I2C_ClockSpeed设定该模块的输入时钟,以产生正确的时序。通过RCC_APB2PeriphClockCmd配置I2C的时钟。在GPIO_InitStructure结构体选择scl和sda端口。I2C_Cmd(I2C,ENABLE);启动I2C外设。写库函数voidI2C_GenerateSTART(I2C_TypeDef*I2Cx,FunctionalStateNewState);产生起始条件。模块的输入时钟频率在标准模式下为2MHz,快速模式下为4MHz。【答案】利用DMA发送:定义I2C结构体\o"I2CInitstructuredefinition."I2C_InitTypeDefI2C_InitStructure;DMA配置结构体\o"DMAInitstructuredefinition."DMA_InitTypeDefDMA_InitStructure;配置DMA通道,DMA_InitStructure.DMA_Channel=I2Cx_DMA_CHANNEL;配置DMA数据传输方向,DMA_InitStructure.DMA_DIR=DMA_DIR_MemoryToPeripheral;使能DMA地址增,DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;设置DMA外设和存储数据对齐方式,DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;设置DMA模式,DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;设置DMA优先级,DMA_InitStructure.DMA_P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论