历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2018年10月21日 | STM32学习之:USART中断方式

2018-10-21 来源:eefocus

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

   步骤一:初始化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);

    }

 }



推荐阅读

史海拾趣

Force Technologies Ltd公司的发展小趣事

背景:随着全球对环境保护意识的增强,Force Technologies Ltd积极响应号召,将绿色环保理念融入企业发展中。

发展:公司投入巨资研发环保型电子产品和制造工艺,致力于减少生产过程中的废弃物排放和能源消耗。同时,公司还积极推动供应链的绿色化转型,与供应商共同制定环保标准和措施。这些努力不仅提升了公司的社会形象,还为其赢得了更多消费者的信赖和支持。

BETA Transformer Technology Corp公司的发展小趣事

随着全球环保意识的不断提高,BETA Transformer Technology Corp公司积极响应国家绿色发展的号召,将环保理念贯穿于产品研发、生产和销售的全过程。公司推出了一系列节能环保的变压器产品,深受客户好评。同时,BETA公司还加强了对生产废弃物的处理和回收利用,实现了资源的循环利用和减少环境污染。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

格莱尔(GLE)公司的发展小趣事

格莱尔积极响应国家“双碳”政策,将绿色生产理念贯穿于企业发展的全过程。公司不仅实现了产品的无铅化生产,还注重节能减排和资源循环利用。通过优化生产工艺、引进环保设备等措施,格莱尔有效降低了生产过程中的能耗和排放,为企业的可持续发展奠定了坚实的基础。

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC始终将技术创新作为企业发展的核心动力。公司不断投入大量资源进行技术研发和产品升级,以保持其在RFID领域的领先地位。近年来,FEIG推出了多款具有高性能、高可靠性、高安全性的RFID产品,如长距离读写器、智能门禁系统等。这些产品的推出不仅满足了客户的多样化需求,还进一步巩固了FEIG在RFID领域的市场地位。

以上五个故事大纲简要概述了FEIG ELECTRONIC在电子行业中的发展历程和关键事件。虽然每个故事的具体细节可能有所不同,但它们共同展示了FEIG在技术创新、市场拓展、合作创新、战略合作和持续创新方面的努力和成就。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

经过近百年的发展,CDE公司始终坚守品质至上的原则,为全球客户提供高品质的电容器产品。公司通过不断的技术研发和产品升级,逐步在全球市场上树立了良好的口碑。如今,CDE的电容器产品已广泛应用于电源、电机、驱动器、航空电子、电力和军用电子设备等多个领域,赢得了全球客户的信赖。

Aces Electronics Co Ltd公司的发展小趣事

Aces Electronics Co., Ltd.自成立之初,就致力于电子技术的研发与创新。在公司发展早期,Aces面临技术壁垒和市场竞争的双重压力。然而,公司通过不断投入研发资源,终于在某一关键领域取得了重大技术突破,推出了一款具有颠覆性的电子产品。这款产品凭借其卓越的性能和创新的设计,迅速在市场上获得了广泛认可,为Aces打开了新的发展空间。

问答坊 | AI 解惑

电子尺/位移/电位器/角度 线性传感器专用变送器

电子尺/位移/电位器/角度 线性传感器专用变送器电子尺/位移/电位器/角度等线性传感器信号的放大、转换、隔离及变送  顺源科技研发生产的位移传感器专用变送器,采用输入滤波保护电路,高精度稳压基准电源电路,放大转换电路,零位满度调节变换电 ...…

查看全部问答>

2009年题目方向讨论

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 2009年题目方向讨论  …

查看全部问答>

电机驱动电路原理。可控制多种型号电机

本帖最后由 paulhyde 于 2014-9-15 03:43 编辑 该电机驱动电路已经跟随我经历了校内电子竞赛,07年电子竞赛和08年电子竞赛。  …

查看全部问答>

弱弱问一个,AVR中的熔丝是不是只可编程一次?

小弟初学AVR,改了一下有关时钟源的熔丝位,发现写进去的程序都不正常了,延时程序无效,但IO操作似乎正常,是不是改错了熔丝的缘故?…

查看全部问答>

win ce arm汇编高手请进

// 预定义函数 inline f32 Mulfx(f32 x, f32 y) {            return ((y) * (x)) >> 12; } inline f32 Divfx(f32 x, f32 y) {         return (((x) 12); } inline float f32toflo ...…

查看全部问答>

关于wince下的应用程序开发

我的本科毕业设计是做wince下的应用程序开发, 现在还没选定题目,不知道做什么比较好? 本人VC基础不是很好,如果太难肯定做不出来, 请问有比较简单的应用程序开发比较适合本科毕业设计吗?…

查看全部问答>

Wince5.0在存储卡上写文件失败?

   现在有一个基于WINCE5.0的GPS设备,想在他的存储卡上写一个临时文件保存信息    开发环境是VS2005和开发板导出的SDK    代码如下    void WriteFileEx() {           ...…

查看全部问答>

FLASH锁死了这是为什么,有没有办法解锁。

FLASH锁死了这是为什么,有没有办法解锁。为什么会有类似下面这几种报错: Read status value 0x0001 from symbol PRG_status(24x系列) ADC Calibration not complete, check if device is unlocked and recalibrate.(2833x系列)   答:FL ...…

查看全部问答>

请问各位大侠

dap里各种模块程序中,PWMDAC模块是什么东西,看了pdf文件说是把s/w变量转成PWM波,实在不懂什么是s/w变量  …

查看全部问答>

LDPC码IP核求购

有没有公司或个人已经对ccsds标准下的LDPC码的编码和译码研发出来了?最近工程应用时间比较紧,紧急求购,,,,联系qq:124920754…

查看全部问答>