说来惭愧,前日在调试stm32f10系列的单片机的时候,想做一个关于串口发送的状态机,每隔100毫秒发送一次命令。没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,然后查看sr寄存器,发现是TC位只要打开发送中断就会被置位,看到这里我嘴角微微上扬,轻蔑一笑,(ˉ▽ ̄~) 切~~清掉标志位就好啦。
事实证明,我是愚蠢的,我在中断那里TC位清零后,再次仿真,呃,怎么还不出去?_?
好吧,我在使能发送中断之前清一下好吧。~~(╯﹏╰)b,还不走……
三板斧耍完了,(~ ̄▽ ̄)~,度娘,你在哪?
百度关键字“STM32发送中断”,哈,一堆的人有和我一样的问题。问题总该迎刃而解了吧。
度娘出来的答案好多,总结一下有这么几个原因。
1、发送中断打开就会一直进入中断啊,要用的时候再打开就好了。
我的想法:好像很有道理的样子,但是,(╯‵□′)╯︵┻━┻这不是我要的答案啊。
2、打开发送中断前将标志位清零啊,不然会一直进入的,在中断里面也要将标志位清零。
我的想法:(╯‵□′)╯︵┻━┻我不就是这么做的吗,不行啊。
3、用DMA啊,为什么一定要用发送中断,DMA只要进两次中断就好了,占用的cpu时间更少。
我的想法:(╯‵□′)╯︵┻━┻,老子就是要用发送中断
4、用轮询啊,为什么一定要……巴拉巴拉
我的想法:(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─)╯
第一个原因的论调比较多人支持,我个人猜测是第二原因,然后到处去把标志位清除,在开启中断前清除,不信;在开启中断后清除,不行;在中断里面清除,不行;
……深受打击,这明明很简单的问题,为什么就是解决不了呢?
痛腚思痛,我去找大神,datasheet
看完后,我真想说一句,ヾ(。`Д´。)shit。
老子打开了发送寄存器空检测中断,不是打开发送完成检测中断,寄存器一直就是空的,当然就会一直进入中断啊。
对比英文版的,我发现讲的其实不够透彻,起码“空”这个字眼我就没看到。
我打开串口调试窗口看一下,╮(╯▽╰)╭,就是这货“TXEIE”被使能了,导致程序一直进入中断,我需要的是发送完成中断,不是发送缓冲区中断。MCU是没错的,错的是我。
人家说的很明白,寄存器空了就进去中断,而这个碗一直就是空的,怎么会不进呢。
以后第一时间还是看看手册,百度不一定找得到,找到的不一定对,对的不一定看得懂,看得懂的不一定是我要的。
关键字:STM32 串口中断 调试
引用地址:
STM32中关于串口中断的调试
推荐阅读最新更新时间:2024-03-16 16:05
泰克加速400G PAM4设计调试
中国北京2018年3月28日 – 泰克科技公司日前推出业内首款用于 DPO70000SX 系列实时示波器的光学探头。最新推出的59 GHz DPO7OE2单模光探头 与去年推出的屡获大奖的33 GHz DPO7OE1相结合,为调试400G PAM4元件及缩短产品开发周期提供了所需的性能和高级调试功能。 在刚结束的OFC光网络和通信展览会上,泰克演示了DPO7OE2和DPO7OE1光学探头以及用于100G/400G光学表征和验证开发的全套解决方案。泰克还在展会上为DSA8300等效时间示波器推出最新的400G PAM4光模块。 与采用NRZ调制方案的100G相比,400G采用PAM4信令,复杂度大大提高,设计验证、调试和排
[测试测量]
使用JTAG连接STM32 SWD模式 (STM32L011为例)
使用JLINK的JTAG接口连接STM32的SWD模式 近期使用STM32L011做产品,第一次接触SWD模式,之前都是使用JTAG接口进行下载仿真。初次使用,问题多多。现在将我遇到的问题,和解决办法贴出来,希望能够帮到后来人。 使用的软件 Keil 5 硬件芯片 STM32L011F4P6 连接器 J-LINK V9 1:KEIL 设置 这个比较简单,在DEBUG选项,选择使用J-LINK 然后点击settings,将port由JTAG 改为SW 如果连接成功,则会在SW Device栏显示信息。 2:连线 在使用JTAG连接SWD时,比较茫然,网上搜索一番,得到信息是JTAG完全胜任SW
[单片机]
STM32 ADC的采样周期确定
一 STM32 ADC 采样 频率的确定 先看一些资料,确定一下STM32 ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。 (2)一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同 RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); (3)在时钟配置寄存器(RCC_CFGR) 中 有 为ADC 时钟提供一个专用的可编程预分器
[模拟电子]
如何使用STM32的窗口看门狗
32F的窗口看门狗中有一个7位的递减计数器,它会在出现下述2种情况之一时产生看门狗复位: 1)当计数器的数值从0x40减到0x3F时 2)当刷新看门狗时计数器的数值大于某一设定数值时,此设定数值在WWDG_CFR寄存器定义 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。 WWDG与
[单片机]
STM32 UART 初始化
因为想用串口3,但配置了很长时间还是不行,为什么UART1,2行,UART3就不行的,最后原因是:使能GPIOB,端口时钟 USART3时钟,我只使能了UART3时钟,没有使能UART3所在端口GPIOB的时钟,所以导致无法正常启动串口3。 下面具体写下串口配置过程: 1:系统时钟初始化,包括系统时钟和要开放的IO口和串口的时钟配置。 2:IO口初始化,包括引脚,速率,输入输出模式等。 3:配置USART的波特率,数据位等。 对应的3个函数,相当有条理 /--------------——————--------------------------------------------------------------
[单片机]
STM32串口工作在DMA模式下有时接收异常
前言 客户反馈在使用STM32F205的串口工作在DMA模式时,有时能够接收数据,有时完全没有数据,但如果换成中断模式来接收又能100%正常收到数据。 一 复现现象 问题背景 与客户沟通,客户使用的是STM32F2标准库V1.1.0,串口波特率为1.408Mbps,不经过串口RS232,直接连接主CPU和从MCU(STM32F205)的串口发送和接收引脚,如下图所示: 尝试重现问题 由于客户使用的是主从架构,实验采用两块STM3220G-EVAL评估板来重现现象。一块用来不间断发送串口数据,另一块采用串口DMA进行接收,直接通过杜邦线连接串口PIN脚并共地,不使用评估板上的RS232收发器。接收端使用STM32F2xx_Std
[单片机]
stm32 can通信发送解释
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) { uint8_t transmit_mailbox = 0; /* Check the parameters */ assert_param(IS_CAN_ALL_PERIPH(CANx)); assert_param(IS_CAN_IDTYPE(TxMessage- IDE)); assert_param(IS_CAN_RTR(TxMessage- RTR)); assert_param(IS_CAN_DLC(TxMessage- DLC)); /* Select one empty tr
[单片机]
STM32 时钟输出MCO功能
一、数据手册: 使用步骤: 1、开时钟输出时钟控制; RCC_MCOConfig(RCC_MCO_SYSCLK); // 实际是对RCC_CFGR寄存器的24-26位配置。 2、配置时钟输出管脚PA8为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);
[单片机]