STM32学习之:USART中断方式

发布者:美丽花朵最新更新时间:2018-10-21 来源: eefocus关键字:STM32  USART  中断方式 手机看文章 扫描二维码
随时随地手机看文章

 前面我们接收了串口通信的查询方式,现在我们来介绍中断方式。

   步骤一:初始化GPIO

GPIO_InitTypeDef GPIO_InitStructure;

 /* Configure USART1 Tx (PA.09) as alternate function push-pull */

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

 GPIO_Init(GPIOA, &GPIO_InitStructure);

 /* Configure USART1 Rx (PA.10) as input floating */

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

步骤二:开时钟

/* Enable USART1, GPIOA, GPIOD and AFIO clocks */

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD

                         | RCC_APB2Periph_AFIO, ENABLE);

在此说明,不用设置RCC_APB2Periph_AFIO也是可以的,也就是在此没有使用复用功能。

这两个步骤与查询方式是一样的。

 

步骤三:初始化USART1

USART_InitStructure.USART_BaudRate = 115200;

 USART_InitStructure.USART_WordLength = USART_WordLength_8b;

 USART_InitStructure.USART_StopBits = USART_StopBits_2;

 USART_InitStructure.USART_Parity = USART_Parity_No;      //设置奇校验时,通信出现错误

 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

 /* Configure the USART1 */

 USART_Init(USART1, &USART_InitStructure);

 /* Enable the USART Transmoit interrupt: this interrupt is generated when the

     USART1 transmit data register is empty */ 

 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

 /* Enable the USART Receive interrupt: this interrupt is generated when the

     USART1 receive data register is not empty */

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 /* Enable USART1 */

 USART_Cmd(USART1, ENABLE);

在这里要使能USART1的外设中断,如USART_ITConfig(USART1, USART_IT_TXE, ENABLE);这就是使能发送中断,但发送寄存器空时能产生中断。

 

步骤四:编写中断函数

uint8_t TxBuffer[] = "\n\rUSART Hyperterminal Interrupts Example: USART-Hyperterminal\

 communication using Interrupt\n\r";

uint8_t RxBuffer[RxBufferSize];

uint8_t NbrOfDataToTransfer = TxBufferSize;

uint8_t NbrOfDataToRead = RxBufferSize;

uint8_t TxCounter = 0;

uint16_t RxCounter = 0;

 

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

 {

    /* Read one byte from the receive data register */

    RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x7F);

    if(RxCounter == NbrOfDataToRead)

    {

      /* Disable the USART Receive interrupt */

      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

    }

 }

 

 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

 {  

    /* Write one byte to the transmit data register */

      USART_SendData(USART1, TxBuffer[TxCounter++]);

    if(TxCounter == NbrOfDataToTransfer)

    {

      /* Disable the USART1 Transmit interrupt */

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

    }

 }

}

 

至此程序就结束了。

 

我们就会有个疑问,main()只包括前三个步骤的初始化和一个死循环,那么中断又是如何触发的呢,main()的结构如下:

int main(void)

{

 /* System Clocks Configuration */

 RCC_Configuration();

 /* NVIC configuration */

 NVIC_Configuration();

 /* Configure the GPIO ports */

 GPIO_Configuration();

 USART_Configuration();

 

 while (1)

 {

 }

}

原来是这样的:状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE=1,表明发送数据寄存器为空, TC=1表明发送已完成。而在USART的设置中有

USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

这两句使能中断,也就是说当TXE=1就会进入中断,所以程序初始化后就能进入中断,执行

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

 {  

    /* Write one byte to the transmit data register */

      USART_SendData(USART1, TxBuffer[TxCounter++]);

    if(TxCounter == NbrOfDataToTransfer)

    {

      /* Disable the USART1 Transmit interrupt */

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

    }

 }



关键字:STM32  USART  中断方式 引用地址:STM32学习之:USART中断方式

上一篇:STM32学习之:GPIO最简单操作步骤
下一篇:STM32学习之:NVIC的初步理解

推荐阅读最新更新时间:2024-03-16 16:17

stm32专题二十七:MPU6050 驱动程序
提供了一个简单的mpu6050的驱动: mpu6050.h #ifndef __MPU6050_H #define __MPU6050_H #include stdint.h #include i2c.h #include usart.h #include stm32f1xx_hal.h /* MPU6050 */ #define DELAY_MS 10 // 初始化延时 #define DEVICE_ADDR (0XD0) // 8位设备地址 #define PWR_MGMT_1 (0X6B) // 电源管理1 #define MPU6050_
[单片机]
<font color='red'>stm32</font>专题二十七:MPU6050 驱动程序
STM32使用SWD默认管脚PA13 PA14
前天在STM32一个项目开发时,遇到了一个问题即想使用STM32的SWD默认管脚PA13或者PA14,当时使用的单片机型号为STM32F103VET6,该单片机为100pin单片机,这么多的管脚按理说一般的应用不会出现使用这么的管脚的,但是,在绘制原理图和设计PCB时并未将全部的引脚引出,到最后焊好后可供扩展的IO就只有这个PA13 PA14了,所以就只能使用这个两个IO口了。 实际使用这个两个IO口十分简单,但考虑到很多人没有试过,且肯定和我开始一样存在一个疑问且不敢轻易尝试,那就是:将这个SWD改成普通IO口后,我用SWD方式还能烧写程序么?单片机会不会锁死? 首先,先讲述下怎样将这个SWD端口做为普通IO,总共
[单片机]
STM32 GPIO使用超强总结
STM32 GPIO使用超强总结 STM32GPIO使用 操作步骤: 1. 使能GPIO对应的外设时钟 例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); 2. 声明一个GPIO_InitStructure结构体 例如: GPIO_InitTypeDef GPIO_InitStructure; 3. 选择待设置的GPIO管脚 例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号 GPIO_InitStruc
[单片机]
STM32的IIC应用详解3
这两天将STM32的IIC按照原子哥的程序,大致走了一遍,多少对IIC不是那么地陌生了,也多少有了自己的一些感悟,在这里,将这两天的学习的一个大致步骤总结下,一来可以让自己形成一个清晰地思路,二来,希望能给一些新手一点启发。 首先IIC是一种通信协议,通信方式相对比较简单,主要有两条线,SDA,SCL。SDA是串行数据线,上面走命令和数据,而SCL只是一条时钟线,其保证数据是按照时钟节拍来进行传输。IIC上面可以外挂很多的IIC芯片,每一个芯片对应着不同的地址,通过地址来将不同的芯片进行分开,保证不同芯片之间的数据传输,由于每一个芯片都是可以独立地收发,故,每一个芯片都是主机/从机。接下来,就是数据的传输过程了, 大致的一个数
[单片机]
<font color='red'>STM32</font>的IIC应用详解3
STM32 时钟配置之寄存器操作
1 时钟 1.1时钟树 Stm32 的时钟配置必须要参考时钟树,时钟树决定了时钟的配置的路径,兼着参考RCC寄存器就可以配置不同的时钟频率了。另外STM32外部晶振推荐为8M,所以用外部时钟时最好采用推荐值。 1.2 时钟配置 程序刚启动的时候,stm32采用的为内部高速时钟,通过上图的时钟树可以发现内部8M时钟通过SW成为系统时钟。RCC_CR的复位值为0x000XX83,展开后为HSION为1,也印证了时钟默认为内部高速时钟。如果需要采用外部时钟,需要按照如下的方式配置。 1、时钟初始化,即将时钟的寄存器采用默认值。 2、开始外部时钟且外部时钟起震准备就绪。 3、设置PLLXTPRE(只能在关
[单片机]
<font color='red'>STM32</font> 时钟配置之寄存器操作
stm32 中关于nvic的形象化解释
看到了一片关于stm32 nvic的解释,使用到了阶级 和阶层的概念,很形象化也很容易理解。 链接:http://blog.sina.com.cn/s/blog_5f17618501012rpp.html NVIC——Nested Vectored Interrupt Controller(嵌套中断向量控制器) STM32有43个channel的settable的中断源:AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4bits。这4个bits用于分配pre-emption优先级和sub优先级,在STM32的固件库中定义如下: //---------------
[单片机]
STM32学习笔记——USART串口
一、USART简介   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。   STM32 的串口资源相当丰富的,功能也相当强劲。STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 二、USART功能概述   接口通过三个引脚与其他设备连接在一起。
[单片机]
STM32单片机I/O的工作模式
最近有个朋友在设计低功耗设备,用的是STM32的主控,他知道我做过很多类似的超低功耗项目,于是向我咨询了一些问题,其中就包括I/O口的几种工作模式。今天我就详细的来总结一下这几种工作模式,让大家在以后的设计中知其然也知其所以然。 先说说GPIO 在聊这8种工作模式之前,我想先说一下GPIO的概念—通用输入输出GeneralPurposeInputOutput简称GPIO,就是芯片引脚可以通过它们输出高、低电平,也可以通过他们输入、读取引脚的电压、电平状态。 下面的8种工作模式我将围绕下图进行分析介绍,读懂这一张图大家基本就可以完全理解STM32的GPIO了。希望大家仔细的看一看。 四种不同的输出模式 推挽输出:该模式下引脚
[单片机]
<font color='red'>STM32</font>单片机I/O的工作模式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved