版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统导论嵌入式系统导论主讲教师:第6章CM3异常和STM32中断本章内容提要6.1Cortex-M3的异常6.2STM32的中断应用6.3EXTI应用示例:按键中断数据传送方式程序查询传送中断传送DMA传送6.1Cortex-M3的异常异常(Exception)是导致程序流程改变的事件ARM的中断(Interrupt)是异常的一种类型中断通常由外设或外部输入产生有些情况下也可以由软件激发针对中断的异常处理程序也被称为中断服务程序ISR异常由嵌套向量中断控制器NVIC处理(NestedVectoredInterruptController)CM3异常的来源中断请求IRQ(IntrruptRequest)通常来自片上外设或经I/O端口的外部中断输入非屏蔽中断NMI(Non-MaskableInterrupt)请求可来自看门狗定时器或供电电压下降探测电路系统时钟(滴答)SysTick,可以产生周期性中断请求可用于嵌入式操作系统的时间记录或者作为监督的定时控制处理器本身也是异常事件的来源例如,失效事件、软件异常等复位是一种特殊的异常CM3
的
异
常异常编号IRQn优先级名称1--3Reset2-14-2NMI3-13-1HardFault4-120MemManage5-111BusFault6-102UsafeFault7—10---11-53SVCall12-44DebugMonitor13---14-25PendSV15-16SysTick16—2550—2557—255IRQ优先级定义CM3的一个异常是否被处理器接收并处理取决于它的优先级以及处理器当前的优先级有些异常(复位、NMI和HardFalult)具有固定优先级是一个负值,表示其优先级高于其他优先级其他异常的优先级可以编程确定,范围是0~255异常优先级数值越小、优先权越高CM3支持3个固定最高优先级和256级可编程优先级但实际支持的优先级有半导体芯片设计者决定多数只支持8、16、32等种优先级优先级编程由优先级寄存器控制8、16、32、256种优先级依次需3、4、5、8位优先级寄存器组(抢占)优先级和子(响应)优先级3~8位的优先级寄存器又分成两个部分组优先级(GroupPriority)确定是否可以打断正在执行的中断,实现嵌套早期技术手册中,被称为抢占优先级(Pre-emptionPriority)子优先级(Sub-Priority)只用于在相同组优先级,多个子优先级同时出现时 高优先权(低优先级值)的异常首先被处理也有译为响应优先级嵌套向量中断控制器NVICNVIC是处理器的一部分,可以编程处理异常和中断的配置、优先权和中断屏蔽6.2STM32的中断应用STM32具有多达68个中断(不包括16个Cortex-M3中断线)STM32把编号-3~6的中断定义为系统异常编号7开始的是外部中断(所有外设都具有中断请求能力)编号为负的3个中断不能设置优先级其他都可以自行设置不同型号STM32微控制器的向量表略有区别启动文件包含了其支持的所有中断并给出了中断服务函数名STM32
的
中
断异常编号IRQn优先级名称1607WWDG1718PVD…………22613EXTI023714EXTI124815EXTI225916EXTI3261017EXTI4271118DMA1_Channel1…………392330EXTI9_5…………564047EXTI15_10…………NVIC库函数函数名函数功能NVIC_InitNVIC初始化NVIC_PriorityGroupConfig配置优先权组NVIC_SetVectorTable设置向量表位置和偏移NVIC_SystemLPConfig为系统进入低功耗模式选择条件SysTick_CLKSourceConfig配置系统时钟SysTick时钟源1.NVIC优先级配置STM32使用4位优先级寄存器、支持16种异常优先级4位分成组(抢占)优先级和子(响应)优先级有5组分配形式(下页表)STM32库中文件misc.c提供了NVIC的配置函数
voidNVIC_PriorityGroupConfig(uint32_t
NVIC_PriorityGroup)参数NVIC_PriorityGroup对应5组分配形式NVIC_PriorityGroup_0~NVIC_PriorityGroup_4使用中断一定要在工程项目中添加misc.c文件STM32的5组优先级配置组号组(抢占)优先级子(响应)优先级0无4位都配置子优先级16种子优先级(0~15)11位配置组优先级2种组优先级(0、1级)3位配置子优先级8种子优先级(0~7)22位配置组优先级4种组优先级(0~3级)2位配置子优先级4种子优先级(0~3)33位配置组优先级8种组优先级(0~7级)1位配置子优先级2种子优先级(0、1)44位都配置组优先级16种组优先级(0~15级)无2.NVIC初始化NVIC初始化函数void
NVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)NVIC_InitTypeDef结构typedef
struct{uint8_tNVIC_IRQChannel;uint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;
FunctionalState
NVIC_IRQChannelCmd;}
NVIC_InitTypeDef;STM32的外部中断/事件EXTIEXTI控制器具有19个边沿检测器(中断通道)EXTI0~EXTI15:对应GPIOx_Pin0~GPIOx_Pin15EXTI16:连接PVD(电源电源检测)输出EXTI17:连接RTC(实时时钟)的闹钟事件EXTI18:连接USB唤醒事件(EXTI19:连接以太网唤醒事件,仅互联型产品)用于检测19个输入线,每个都可以单独地被配置为中断或事件也都可以选择上升沿、下降沿或上下沿均触发每个输入线都可以单独进行屏蔽EXTI:ExternalInterrupt/event通用I/O引脚作为外部中断所有I/O端口都可以配置为EXTI外部中断模式用来检测外设中断请求,可以配置为 下降沿触发、上升沿触发或上升下降沿触发所有GPIO引脚都可以作为中断源连接到16个EXTI外部中断线(Line)上PAx~PGx引脚连接到EXTIxEXTI0~EXTI4分别占用一个中断向量EXTI9~EXTI5共用一个中断向量、被称为EXTI9_5EXTI15~EXTI10共用一个中断向量、被称为EXTI15_10EXTI:ExternalInterrupt/eventGPIO的EXTI连接PAx~PGx引脚连接到EXTIx同一个时刻EXTIx只能响应一个端口引脚x的中断事件EXTI寄存器寄存器缩写寄存器英文名称EXTI_IMRInterruptMaskRegisterEXTI_EMREventMaskRegisterEXTI_RTSRRisingTriggerSelectionRegisterEXTI_FTSRFallingTriggerSelectionRegisterEXTI_SWIERSoftwareInterrupt/EventRegisterEXTI_PRPendingrequestRegisterEXTI结构中断(Interrupt)与事件(Event)对于外部触发信号来说,没有区别在微控制器芯片内部,处理不同中断是某个事件发生向处理器发出中断请求,并跳转到中断服务程序中可以被更高优先权的中断屏蔽(禁止)事件是检测到某个事件发生可向其他模块发送触发信号对应模块决定如何响应(触发或不触发中断)事件不会被屏蔽,但可以屏蔽发送触发信号(这是事件屏蔽寄存器的作用)EXTI库函数函数名函数功能EXTI_InitEXTI初始化EXTI_DeInitEXTI解除初始化EXTI_StructInit填充EXTI初始化结构成员EXTI_GetITStatus获取中断状态EXTI_ClearITPendingBit中断挂起位清除EXTI_GetFlagStatus获取标志状态EXTI_ClearFlag挂起标志清除EXTI_GenerateSWIInterrupt产生软件中断外设的中断相关函数函数名函数功能PPP_ITConfig设置外设PPP某个(些)中断请求是允许或禁止PPP_GetITStatus获取外设PPP某个中断状态PPP_ClearITPendingBit清除外设PPP某个挂起的中断标志PPP_GetFlagStatus获取标志状态:检测某个外设标志是否置位PPP_ClearFlag挂起标志清除:清除某个外设的挂起标志6.3EXTI应用示例:按键中断【例6-1】根据按键状态控制LED灯亮灭2个按键KEY有按下来,产生中断请求KEY在目标板上的连接PA0和PC13分别连接2个KEY1和KEY2按钮按下时,GPIO引脚输入低电平(0)否则输入高电平(1)程序的功能是按下某个按钮KEYx对应LEDx亮一段时间,然后熄灭中断初始化配置复位后,所有中断都被禁止,并赋予优先级0使用任何中断,都需要设置中断,具体是:1.NVIC初始化配置配置优先级组为每个中断通道进行NVIC初始化2.外设初始化配置3.外设中断配置启动GPIO的复用功能(AFIO)时钟
为每个中断请求的GPIO引脚指明外部中断EXTI线为每个中断请求引脚进行EXTI初始化NVIC初始化配置首先,选择优先级组号(即0~4共5种形式)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);其次,配置中断通道:PA0(KEY1)NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //指明IRQ通道(EXTI0_IRQn)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //指明IRQ通道的组(抢占)优先级(0)NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //指明IRQ通道的子优先级(0)NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //允许IRQ通道中断(ENABLE)NVIC_Init(&NVIC_InitStructure);启动GPIO的复用功能(AFIO)时钟STM32的I/O引脚,不仅能够作为通用I/O端口GPIO还可以作为片上外设(如串口、ADC等)的I/O引脚这称为复用I/O端口AFIO大多数GPIO都有默认的复用功能部分GPIO还有重映射功能把原来是A引脚的默认复用功能,映射到B引脚使用当把GPIO用作EXTI外部中断或者使用重映象功能时必须在设置GPIO引脚之前启动AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);AFIO:Alternate-FunctionI/O选择作为EXTI中断的GPIO引脚 void
GPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource)GPIO_PortSource选择作为EXTI线的GPIO端口
形如GPIO_PortSourceGPIOx(x是A~G)GPIO_PinSource指明配置的EXTI线(GPIO引脚) 形如GPIO_PinSourcex(x是0~15)选择PA0(KEY1)作为外部中断EXTI GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)EXTI初始化配置调用stm32f10x_exti.c中的EXTI初始化配置
voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct)参数EXTI_InitStruct是指向EXTI_InitTypeDef结构的指针typedef
struct{uint32_tEXTI_Line; /*指明EXTI线*/
EXTIMode_TypeDef
EXTI_Mode; /*指明工作模式*/
EXTITrigger_TypeDef
EXTI_Trigger; /*指明有效边沿*/
FunctionalState
EXTI_LineCmd; /*ENABLE或DISABLE*/}EXTI_InitTypeDef;帮助文档示例:PA0引脚的EXTI初始化
EXTI_InitTypeDef
EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line0;//指明EXTI线(EXTI_Line0)
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//指明EXTI工作模式(EXTI_Mode_Interrupt)
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//
指明触发有效边沿(EXTI_Trigger_Falling)
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //允许中断(ENABLE)
EXTI_Init(&EXTI_InitStructure);主程序流程intmain(void){LED_Config(); //LED初始化
……EXTI_Config();//外部中断初始化(含KEY初始化)while(1){}//循环等待中断}中断服务程序stm32f10x_it.c专用于编写中断服务函数中断服务函数名必须与启动代码中定义的相同KEY1(PA0)的中断服务函数voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)==
SET)
{LED_On(1);Delay(5000000);
LED_Off(1);EXTI_ClearITPendingBit(EXTI_Line0);
}}中断状态获取与清除函数中断状态获取函数,用于确认发生了中断
ITStatus
EXTI_GetITStatus(uint32_tEXTI_Line)参数EXTI_Line是EXTI线编号:
EXTI_Linex(x是0~19)返回值ITStatus是EXTI线的状态: 触发(SET)、没有触发(RESET)中断状态清除函数,用于清除EXTI线挂起的位
voidEXTI_ClearITPendingBit(uint32_tEXTI_Line)帮助文档挂起(Pending)是暂停中断处理挂起状态表明中断还没有处理结束嵌入式系统导论主讲教师:第7章
STM32的USART本章内容提要7.1串行异步通信7.2通用同步异步接收发送器(USART)7.3USART应用示例: 实现C语言标准输入输出函数串行通信并行传输7.1串行异步通信串行数据传输将数据分解成二进制位用一条信号线一位一位顺序传输数据通信线路少,远距离通信的成本低适合于远距离数据传送和近距离数据传送可以减小芯片尺寸、提升传输速率需制定通信协议(通信规程),解决传送速率、信息格式、数据同步、数据校验等问题串行异步通信:以字符为单位进行传输串行同步通信:以一个数据块(帧)为传输单位串行串行异步通信字符格式起始位——每个字符开始传送的标志,起始位采用逻辑0电平数据位——数据位紧跟着起始位传送。由5~8个二进制位组成,低位先传送校验位——用于校验是否传送正确;可选择奇检验、偶校验或不传送校验位停止位——表示该字符传送结束。停止位采用逻辑1电平,可选择1、1.5或2位起始位校验位停止位空闲位数据位低位高位字符0/10/10/10/110111…空闲位——传送字符之间的逻辑1电平,表示没有进行传送串行同步通信以一个数据块(帧)为传输单位每个数据块附加1个或2个同步字符最后以校验字符结束同步通信的传输效率和速率较高,硬件电路较复杂串行同步通信主要应用在网络当中最常使用高级数据链路控制协议HDLC~~~~同步字符数据数据数据校验字符数据传输速率(带宽)数据传输速率=比特率(BitRate)每秒传输的二进制位数bps字符中每个二进制位持续的时间长度都一样, 是数据传输速率的倒数进行二进制数码传输,每位时间长度相等: 比特率=波特率(BaudRate)过去,限制在50bps到9600bps之间现在,可以达到115200bps或更高异步串行接口标准美国电子工业协会EIA制定1962年公布,1969年修订1987年1月正式改名为EIA-232D数据终端设备DTE与数据通信设备DCE标准接口25针插口9针插口232C接口的引脚定义TxD:发送数据RxD:接收数据RTS:请求发送CTS:清除发送(允许发送)DTR:数据终端准备好DSR:数据装置准备好GND:信号地
CD:载波检测(DCD)
RI:振铃指示保护地(机壳地)TxC:发送器时钟RxC:接收器时钟232C接口的连接连接调制解调器:通过电话线路远距离通信直接(零调制解调器)连接:进行短距离通信不使用联络信号的3线相连微机TxDRxDGND微机微机DSRDTRTxDRxDRTSCTSGND微机“伪”使用联络信号的3线相连传输制式全双工通信同时双向传输站A站B站A站B站A站B半双工通信分时双向传输单工通信单向传输7.2通用同步/异步接收/发送器实现串行数据传输需要并行到串行和串行到并行的转换并按照传输协议发送和接收每个字符(或数据块)可由软件实现,也可用硬件实现通用同步异步接收发送器USART是用硬件实现 串行通信的接口电路UniversalSynchronousAsynchronousReceiver/Transmitter处理器USARTSTM32的串行通信接口USARTSTM32具有多达5个USART接口USART1连接高速APB2总线、运行速度为72MHz(支持高达4.5Mbps的传输速率)其他位于APB1总线、36MHz(2.25Mbps传输速率)STM32的USART接口具有多种操作模式异步全双工通信、同步单路通信和半双工单线通信支持LIN、智能卡、IrDA、多处理器通信每个USART接口具有两个DMA通道用于接收Rx和发送Tx数据与存储器之间的高速传送UniversalSynchronousAsynchronousReceiver/TransmitterUSART结构图USART的增强功能局部互联网络LIN(LocalInterconnectionnetwork)主要针对车辆中低成本的LIN总线智能卡(SmartCard)内嵌芯片的集成电路(IC)卡兼容ISO7816-3标准的异步智能卡协议红外线接口IrDA(InfraredDataAssociation)短距离、点对点直线数据传输支持SIRENDEC传输编码解码协议USART接口的引脚USART接口通过3个引脚连接外设Tx
发送数据输出(TransmitDataOut)Rx
接收数据输入(ReceiveDataIn)CK
发送时钟输出,用于同步传输模式(CK引脚早期版本被称为SCLK)实现硬件流程控制需要如下引脚nCTS
清除发送(ClearToSend) 若为高电平,在当前传输结束前阻止下个数据发送nRTS
发送请求(RequestToSend) 若为低电平,表明USART准备好接收数据USART寄存器寄存器缩写寄存器中文名称USART_SR状态寄存器USART_DR数据寄存器USART_BRR波特率寄存器USART_CR1控制寄存器1USART_CR2控制寄存器2USART_CR3控制寄存器3USART_GTPR时间保护和预分频寄存器异步串行通信协议嵌入式开发系统可以连接PC机串口用于程序下载、系统调试等嵌入式开发板与PC机的串口连接通常采用简单的交叉3线、不采用联络信号支持全双工通信异步串行通信协议以字符为单位,需设置波特率(传输率)、数据位数奇偶校验、停止位个数7.3USART应用示例:实现标准输入输出函数使用3线交叉线连接USART1端口与PC机串口1编写USART1初始化配置函数将输入输出函数重定向到USART1端口编写字符发送fputc函数编写字符接收fgetc函数不使用半主机模式复用功能USART1_REMAP=0USART1_REMAP=1USART1_TXPA9PB6USART1_RXPA10PB7USART初始化配置启动USART时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)
GPIO复用引脚初始化USART1_Tx(发送信号)复用PA9引脚USART1_Rx(接收信号)复用PA10引脚USART初始化配置为:115200-8-N-1(波特率-数据位数-校验方式-停止位数)允许USART工作
USART_Cmd(USART1,ENABLE)GPIO复用引脚初始化启动GPIOA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Perih_GPIOA,ENABLE)
使用GPIO_Init函数初始化GPIO引脚PA9(USART1_TX)需设置为推挽复用输出PA10(USART1_RX)需配置为浮空输入或上拉输入USART引脚通信配置GPIO配置USARTx_TX全双工复用推挽输出半双工同步模式复用推挽输出USARTx_RX全双工浮空输入/上拉输入半双工同步模式未用。可用于通用I/O参考手册USART初始化USART初始化函数
voidUSART_Init(
USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct)
USARTx(要配置的串口):USART1~UART5USART_InitStruct指向USART_InitTypeDef结构变量的指针typedef
struct{uint32_tUSART_BaudRate;/*通信波特率*/uint16_tUSART_WordLength;/*数据位数*/uint16_tUSART_StopBits;/*停止位数*/uint16_tUSART_Parity;/*校验模式*/uint16_tUSART_Mode;/*接收发送模式*/uint16_tUSART_HardwareFlowControl;/*硬件流控制*/}USART_InitTypeDef;帮助文档USART初始化(115200-8-N-1)USART_InitTypeDef
USART_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_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);重定向(Retarget)C语言输入输出函数默认设备:键盘和显示器要使用scanf和printf函数,需要重定向将输入的信息重新定向来自外设(USART1端口)将输出的信息重新定向去到外设(USART1端口)用户可以重新编写C语言的库函数当C编译器检查到与C库函数相同名称的函数时优先采用用户编写的函数,实现重定向1.编写fputc函数2.编写fgetc函数3.不使用半主机模式printfHello×USART的数据收发函数接收数据的函数uint16_tUSART_ReceiveData(USART_TypeDef*USARTx)函数调用的返回值就是最新接收的数据发送数据的函数voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData)参数Data就是要发送的数据虽然是一个16位数据,实际上只使用其低8位1.编写fputc函数在C标准库函数中,printf函数实质是一个宏需要调用fputc实现一个字符输出int
fputc(int
ch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);returnch;}USART_GetFlagStatus用于检测发送完成USART_GetFlagStatus函数用于检测发送完成
FlagStatus
USART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG)要检测的状态是参数USART_FLAG·USART_FLAG_CTS(CTS改变标志,UART4和UART5上不可用)·USART_FLAG_LBD(LIN中止检测标志)·USART_FLAG_TXE(发送数据寄存器空标志)·USART_FLAG_TC(发送完成标志)·USART_FLAG_RXNE(接收数据寄存器非空标志)·USART_FLAG_IDLE(空闲线检测标志)·USART_FLAG_ORE(溢出错误标志)·USART_FLAG_NE(噪声错误标志)·USART_FLAG_FE(帧错误标志)·USART_FLAG_PE(校验错标志)返回值USART_FLAG说明置位(SET)或复位(RESET)帮助文档2.
编写fgetc函数标准输入函数scanf函数通过调用fputc实现int
fgetc(int
ch,FILE*f){intch;while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);ch=USART_ReceiveData(USART1);/*实现键盘输入的回显功能*/while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);USART_SendData(USART1,(uint8_t)ch);returnch;}3.
不使用半主机模式半主机模式(Semihosting)将ARM应用程序的I/O在主机(PC机)上体现出来printf、scanf等函数使用主机的屏幕和键盘使开发人员可以通过PC机的标准输入设备(键盘)和标准输出设备(显示器)调试ARM处理器代码将printf、scanf等函数重定向到USART端口 就不能再采用半主机模式,方法有两种(1)使用微库(2)添加retarget.c文件使用C标准输入输出函数,需包含stdio.h(1)使用微库(UseMicroLIB)KeilMDK特别为嵌入式应用编写的小型C库仅实现了基本的、简单的函数,例如printf、scanf不能使用高级的fprintf、fopen等微库不使用半主机模式在MDK集成环境的目标选项中,从代码生成栏(CodeGeneration),选择使用微库MicroLib的选择(目标选项)(2)添加retarget.c文件如果仍使用标准C库需要用户重新编写使用半主机模式的函数在MDK安装目录中有一个文件retarget.c为用户编写自己的函数提供的模板用户可以将文件复制到工程目录中,添加到项目中,并进行修改retarget.c主要修改是编辑fputc、fgetc函数的实现代码本例删除(已在其他文件实现了这两个函数)
#include<stdio.h>#pragma
import(__use_no_semihosting_swi)FILE__stdout;FILE__stdin;void_sys_exit(int
return_code){while(1);/*endlessloop*/}【例7-1】信息交互应用程序实现在PC机终端程序中进行信息交互intmain(void){ charmsg[100]; inttemp; USART1_Config(); //USART1配置
printf("\r\n演示printf和scanf函数\r\n"); printf("输入一个字符串:"); scanf("%s",msg); printf("\r\n输入的字符串是:%s\r\n",msg);
……}调试运行软件模拟查看View→串行窗口SerialWindows→UART#1程序调试运行时,该窗口有printf输出结果激活该窗口也可利用scanf函数输入信息在线硬件仿真使用3线交叉串口电缆连接PC机串口和目标板USART1端口运行PC机的超级终端程序,设置其传输协议是“1152008-N-1”连接好目标板硬件仿真器,打开电源,运行程序在PC机超级终端程序中,与目标板交互【例7-2】接收中断驱动LED灯点亮USART接口的中断应用、实现功能从PC机键盘输入数字1、2或3,从PC机串口发送给嵌入式系统的USART1接口USART1接收数字后,触发中断中断服务程序获取具体的数字, 并相应控制LED1、LED2或LED3灯点亮USART中断连接USART中断相关函数USART中断配置函数voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalState
NewState)
获取中断状态函数ITStatus
USART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT)
清除中断标志函数voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT)USART中断标志和事件标志中断请求中断标志事件标志CTS改变USART_IT_CTSUSART_FLAG_CTSLIN中止检测中断USART_IT_LBDUSART_FLAG_LBD发送数据寄存器空中断USART_IT_TXEUSART_FLAG_TXE发送完成中断USART_IT_TCUSART_FLAG_TC接收数据寄存器非空中断USART_IT_RXNEUSART_FLAG_RXNE空闲线检测中断USART_IT_IDLEUSART_FLAG_IDLE校验错中断USART_IT_PEUSART_FLAG_PE错误中断USART_IT_ERR溢出错误中断USART_IT_OREUSART_FLAG_ORE噪声错误中断USART_IT_NEUSART_FLAG_NE帧错误中断USART_IT_FEUSART_FLAG_FEUSART中断初始化(1)NVIC初始化配置
……NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; ……(2)USART初始化配置
……(3)USART中断配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USRAT1中断服务程序voidUSART1_IRQHandler(void){uint8_tch;LED_Off_all();if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){ch=(uint8_t)USART_ReceiveData(USART1); printf("%c\n",ch); switch(ch) { case'1':LED_On(1);printf("LED1灯亮\n");break;
……
}}}软件模拟运行嵌入式系统导论主讲教师:第8章STM32的DMA接口本章内容提要8.1DMA控制器8.2DMA应用示例:USART接口的DMA传输8.3DMA、USART和GPIO的综合应用数据传送方式程序查询传送中断传送DMA传送8.1DMA控制器DMA传送希望克服程序控制传送的不足:外设→CPU→存储器外设←CPU←存储器直接存储器存取DMA:外设→存储器外设←存储器CPU释放总线,由DMA控制器管理查询要等,中断太烦,来个直接的DMA传送过程1)DMA预处理2)DMA请求和应答3)DMA传送DMA读:存储器→外设DMA写:存储器←外设4)增减地址和计数,判断传送是否完成STM32的DMA控制器直接存储器存取DMA(DirectMemoryAccess)利用系统总线直接在外设与存储器之间进行 大量和高速数据传输的方法STM32设计有2个DMA控制器单元DMA1单元,支持7个DMA通道DMA2单元,支持5个DMA通道具有多达12个独立的可配置DMA通道支持存储器到存储器、外设到存储器、 存储器到外设和外设到外设的自动传输每个通道都支持软件触发DMA框图DMA1各通道的请求外设通道1通道2通道3通道4通道5通道6通道7ADC1ADC1SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TXUSARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXI2CI2C2_TXI2C2_RXI2C1_TXI2C1_RXTIM1TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3TIM2TIM2_CH3TIM2_UPTIM2_CH1TIM2_CH2TIM2_CH4TIM3TIM3_CH3TIM3_CH3TIM3_UPTIM3_CH1TIM3_TRIGTIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UPDMA1各条通道连接的外设参考手册STM32主要外设都支持DMADMA2各通道的请求外设通道1通道2通道3通道4通道5ADC3ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TXUART4UART4_RXUART4_TXSDIOSDIOTIM5TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM6/DAC_Channel1TIM6_UP/DAC_Channel1TIM7TIM7_UP/DAC_Channel2TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1TIM8_CH2DMA2各条通道连接的外设DMA通道的优先级和中断每个DMA通道可以由应用程序赋予4个优先级之一(很高、高级、中级和低级)在仲裁阶段,高优先级的通道优先获得总线响应相同优先级时,通道号小的通道优先获得总线响应每个DMA通道都可以在3个时刻产生中断请求DMA传输过半HTIFDMA传输完成TCIFDMA传输错误TEIF每个DMA通道都有自己的中断向量(除大容量产品中,DMA2通道4和DMA2通道5的中断被映射在同一个中断向量上)DMA通道的寄存器每个DMA通道由4个寄存器控制配置寄存器CCR定义DMA传输的特性传输数量寄存器CNDTR保存传输的数据个数外设地址寄存器CPAR保存外设的地址存储器地址寄存器CMAR保存存储器的地址中断操作由两个中断寄存器控制中断状态寄存器ISR中断标志清除寄存器IFCR参考手册DMA寄存器寄存器缩写寄存器中文名称DMA_CCR配置寄存器DMA_CNDTR传输数量寄存器DMA_CPAR外设地址寄存器DMA_CMAR存储器地址寄存器DMA_ISR中断状态寄存器DMA_IFCR中断标志清除寄存器8.2DMA应用示例:USART接口的DMA传输【例8-1】将主存一个数据块采用DMA方式传输到USART1发送接口(TX)DMA传输前,让所有LED灯灭DMA传输中,处理器继续执行程序让LED1灯亮DMA传输后,产生中断让LED2灯亮将USART1端口连接PC机串口,重定向在PC机远程终端程序中显示传输结果使用DMA方式进行USART1发送属于DMA1单元的通道4(USART1_TX)DMA传输的开发方法使用DMA传输之前,需要进行DMA初始化配置(1)开启DMA时钟:RCC_AHBPeriphClockCmd函数(2)如果使用中断,进行DMA的NVIC配置(3)DMA传输的参数配置:DMA_Init函数(4)允许DMA传输:DMA_Cmd函数(5)如果使用中断,设置DMA传输何时产生中断:
DMA_ITConfig函数当进行DMA传输时,需要进行DMA请求例如,USART使用USART_DMACmd函数开始DMA传输后,处理器可以继续执行程序启动DMA单元时钟使用STM32库函数
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx,ENABLE);DMAx是DMA1或DMA2直接寄存器编程通过允许RCC单元的AHB时钟寄存器实现
RCC->AHBENR|=0x000000001; //允许DMA时钟DMA初始化DMA初始化函数
voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)按照DMA_InitStruct结构变量初始化DMAy通道x(y=1、2,x=1~12)DMA_InitStruct是指向DMA_InitTypeDef结构体的指针,包含对DMA通道的配置信息帮助文档DMA初始化结构类型DMA_InitTypeDeftypedef
struct{uint32_tDMA_PeripheralBaseAddr; /*外设基地址*/uint32_tDMA_MemoryBaseAddr;/*存储器基地址*/uint32_tDMA_DIR; /*传输方向:外设是源还是目的*/uint32_tDMA_BufferSize; /*缓冲区大小*/uint32_tDMA_PeripheralInc; /*外设地址是否增量*/uint32_tDMA_MemoryInc; /*存储器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外设数据宽度*/uint32_tDMA_MemoryDataSize; /*存储器数据宽度*/uint32_tDMA_Mode;
/*操作模式*/
uint32_tDMA_Priority; /*软件优先级*/uint32_tDMA_M2M; /*是否存储器到存储器传输*/}DMA_InitTypeDef;DMA_InitTypeDef成员-1成员1:DMA_PeripheralBaseAddr,外设基地址本例的外设是USART1数据寄存器(USART1_DR)需要用户定义给出这个地址(STM32库没有定义)成员2:DMA_MemoryBaseAddr,存储器基地址通常是用户程序定义的主存缓冲区首地址成员3:DMA_DIR,传输方向选择外设是源(DMA_DIR_PeripheralSRC)还是目的(DMA_DIR_PeripheralDST)成员4:DMA_BufferSize,缓冲区大小传输的数据量(直接给出数值)单位是成员7给出的DMA_PeripheralDataSizeDMA_InitTypeDef成员-2成员5:DMA_PeripheralInc,外设地址增量允许(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成员6:DMA_MemoryInc,存储器地址增量允许(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成员7:DMA_PeripheralDataSize,外设数据宽度字节(DMA_PeripheralDataSize_Byte)半字(DMA_PeripheralDataSize_HalfWord)字(DMA_PeripheralDataSize_Word)DMA_InitTypeDef成员-3成员8:DMA_MemoryDataSize,存储器数据宽度字节(DMA_MemoryDataSize_Byte)半字(DMA_MemoryDataSize_HalfWord)字(DMA_MemoryDataSize_Word)成员9:DMA_Mode,操作模式正常(DMA_Mode_Normal):一次性传输循环(DMA_Mode_Circular):自动重复传输DMA_InitTypeDef成员-4成员10:DMA_Priority,软件优先级选择通道的4个优先级之一很高(DMA_Priority_VeryHigh)高级(DMA_Priority_High)中级(DMA_Priority_Medium)低级(DMA_Priority_Low)成员11:DMA_M2M,存储器到存储器传输允许(DMA_M2M_Enable)禁止(DMA_M2M_Disable)DMA初始化配置头文件dma.h配置DMA传输的外设基地址(USART1数据寄存器DR)(DMA_InitStructure.DMA_PeripheralBaseAddr)STM32库的头文件没有定义USART1_DR地址查阅STM32参考手册USART1的起始地址(0x40013800)数据寄存器DR在USART的偏移量(0x04)相加得到USART1_DR地址(0x40013804)
#defineUSART1_DR_Base0x40013804#defineSENDBUF_SIZE0x4000 //缓冲区大小voidDMA1_Config(void);DMA配置源文件dma.c-1/*DMA的中断配置函数*/voidNVIC_Config(void){NVIC_InitTypeDef
NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}DMA配置源文件dma.c-2//USART1进行DMA传送的初始化配置(含中断配置)uint8_t
SendBuf[SENDBUF_SIZE];//发送缓冲区voidDMA1_Config(void){DMA_InitTypeDefDMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); NVIC_Config(); /*配置DMA中断
*/
//设置DMA源:串口数据寄存器地址
DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuf;/*内存地址(要传输的变量的指针)*/
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/*方向:从内存到外设*/DMA配置源文件dma.c-3
DMA_InitStructure.DMA_BufferSize=SENDBUF_SIZE; /*传输大小*/
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外设地址不增*/
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
/*内存地址自增*/
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
/*外设数据单位,字节*/
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
/*内存数据单位,字节*/
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; /*DMA模式:一次传输,不循环*/DMA配置源文件dma.c-4
DMA_InitStructure.DMA_Priority=MA_Priority_Medium; /*优先级:中*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*禁止内存到内存的传输 */
DMA_Init(DMA1_Channel4,&DMA_InitStructure);
/*配置DMA1的4通道*/
DMA_Cmd(DMA1_Channel4,ENABLE); /*允许DMA1的4通道进行DMA传输
*/
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*设置DMA1的4通道DMA传输完成产生中断*/}帮助文档进行DMA传输的主程序main.c-1int
main(void){ inti; USART1_Config();
//
USART1配置:1152008-N-1
DMA1_Config();
LED_Config();
LED_Off_all(); //LED灯全灭
for(i=0;i<SENDBUFF_SIZE;i++) {SendBuf[i]='A'; //填充缓冲区
}进行DMA传输的主程序main.c-2
printf("\r\nDMA传输开始\r\n"); //USART1接口发出DMA请求
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); LED_On(1); //点亮LED1灯
while(1) { //循环
}}中断服务程序stm32f10x_it.cvoidDMA1_Channel4_IRQHandler(void){ //判断是否为DMA发送完成中断
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
{LED_On(2);
//LED2灯亮
DMA_ClearFlag(DMA1_FLAG_TC4);
//清除标志
printf("\r\nDMA传输结束\r\n");} }8.3DMA、USART和GPIO的综合应用【例8-2】按键控制的应用项目按下KEY1键,触发KEY1中断, 让3个LED灯逐个点亮、并停留在LED3灯上按下KEY2键,触发KEY2中断,
让主存数据DMA传输给USART1发送接口
DMA传输前、灭灯,DMA传输中、LED1灯亮,
DMA传输后、LED2灯亮USART接口连接PC机串口,
在PC机上查阅发送结果KEY2键中断能够打断KEY1键中断【例8-2】综合应用项目分析源程序文件文件功能led.c和led.hLED灯初始化和驱动程序key.c和key.h按键初始化和驱动程序key.ini软件模拟按键的调试函数usart1.c和usart1.hUSART1初始化和驱动程序exti.c和exti.hEXTI初始化和驱动程序dma.c和dma.hDMA初始化和驱动程序nvic.c和nvic.hNVIC的中断配置程序stm32f10x_it.c和stm32f10x_it.h中断服务程序main.c主程序文件嵌入式系统导论主讲教师:第9章STM32的定时器接口本章内容提要9.1系统时钟(SysTick)9.2STM32看门狗9.3STM32定时器(TIMx)9.4STM32实时时钟(RTC)定时器基于计数器电路实现STM32微控制器的定时器接口系统时钟(SysTick)看门狗WatchDog独立看门狗(IWDG)独窗口看门狗(WWDG)通用定时器基本定时器(TIM6和TIM7)通用定时器(TIM2、TIM3、TIM4和TIM5)高级控制定时器(TIM1和TIM8)实时时钟RTC9.1系统时钟(SysTick)Corte-M3在内核包含的简单定时器该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”SysTick定时器是一个24位递减计数器设置初值、允许计数,每来一个时钟,计数值减1计数值减为0,计数器被自动载入初值、继续计数同时内部标志COUNTFLAG被置位、并触发中断SysTick中断连接中断控制器NVIC,异常号为15SysTick寄存器SysTick是CM3内核的定时单元参阅“Cortex-M3一般用户手册”(不是“STM32参考手册”)寄存器缩写寄存器中文名称SysTick_CTRL控制和状态寄存器SysTick_LOAD重载值寄存器SysTick_VAL当前值寄存器SysTick_CALIB校准值寄存器控制和状态寄存器(SysTick_CTRL)用于控制SysTick工作和获取计数归0的状态名称功能ENABLE计数器使能:0=禁止SysTick定时器,1=允许SysTick定时器TICKINTSysTick异常请求使能:0=不触发异常请求,1=触发异常请求(中断)CLKSOURCE选择时钟源:0=外部时钟,1=处理器时钟COUNTFLAG计数状态:上次读取后定时器计数到0,返回1SysTick寄存器编程(1)禁止SysTick定时器(因为SysTick可能已经被允许了)
SysTick->CTRL=0;//关闭SysTick(2)写入重载值
SysTick->LOAD=256-1;//假设计数值为256(3)清除当前值为0(向当前值寄存器SysTick_VAL写入任何值)
SysTick->VAL=0;(4)允许SysTick定时器
SysTick->CTRL=5;//使用处理器时钟SysTick结构定义系统时钟SysTick属于Cortex内核部件驱动程序定义在core_cm3.h(不是core_cm3.c)文件SysTick寄存器的结构类型
typedef
struct {__IOuint32_tCTRL; __IOuint32_tLOAD; __IOuint32_tVAL; __Iuint32_tCALIB; }SysTick_Type;有关地址定义的语句如下:
#defineSCS_BASE(0xE000E000) #defineSysTick_BASE(SCS_BASE+0x0010) #defineSysTick((SysTick_Type*)SysTick_BASE)SysTick配置函数_STATIC__INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); }
SysTick->LOAD=(uint32_t)(ticks-1UL);NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);
SysTick->VAL=0UL;
SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|
SysTick_CTRL_TICKINT_Msk|
SysTick_CTRL_ENABLE_Msk;return(0UL);}初始化、并启动SysTick计数器和中断设置每隔ticks脉冲引起一次中断配置成功返回0值,不成功则返回1值SysTick_Config函数-11、将ticks参数作为重载值赋给重载值寄存器(SysTick_LOAD)定时时间T是:T=ticks×(1/f)秒f是时钟源的时钟频率2、使用NVIC_SetPriority函数 配置系统时钟中断(SysTickIRQ)为15如果要改变SysTick中断的优先级,使用
NVIC_SetPriority(SysTick_IRQn,...)(定义在core_cm3.h文件)SysTick_Config函数-23、复位SysTick计数器(清零)4、设置控制和状态寄存器(SysTick_CTRL)允许计数和中断选择处理器时钟源(STM32是“AHB时钟”)如果使用STM32的“AHB时钟/8”直接编程控制和状态寄存器(SysTick_CTRL) 设置CLKSOURCE(D2位)为0使用STM32库的SysTick_CLKSourceConfig函数(在misc.c文件中)SysTick应用示例:精确定时SysTick可服务于操作系统也可用于精确定时、时间测量等系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒结合GPIO控制LED灯的示例【例9-1】使用SysTick精确的硬件定时主程序需要对SysTick进行初始化例如配置1ms产生一次中断SysTick初始化主程序SysTick_Config函数配置1ms产生一次中断
if(SysTick_Config(SystemCoreClock/1000)){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学生就业焦虑测量量表
- 2026医院感染工作总结防控会议记录
- 观课议课的新构架建设理想课堂
- 西师版小学数学六年级上册《比的意义》
- 2026年北京市第四中学七年级英语第7单元词汇测试卷及答案
- 2026年大学生创业综合素质训练模拟试卷及答案
- 康复治疗技术专业沟通能力专项训练习题及答案
- 湖南省湘教版八年级英语下册第10单元同步练习题及答案
- 西师大版数学四下探索规律课件之二
- 班主任工作总结
- 小学生责任意识培育路径教学研究
- 2026基因检测行业市场接受度分析及未来发展路径评估报告
- 《八仙》主题开学第一课课件:八仙过海显神通、共筑新学期成长梦
- 2025内蒙古通辽扎旗能投集团敦德诺尔露天煤矿招聘人员1人实施考试参考题库附答案解析
- 绵阳中科绵投环境服务有限公司绵阳市餐厨废弃物资源化利用和无害化处理扩建项目(重新报批)环评报告
- 《幼儿营养与膳食管理》课件-【第4章】婴幼儿膳食的搭配制作
- 居间协议格式(2025年版)
- 门诊诊断培训班
- 范里安微观经济学现代观点讲义
- 地质灾害调查与防治基础知识单选题100道及答案
- 《混凝土外加剂应用技术规程》
评论
0/150
提交评论