在中断服务函数里面,千万不能用打印函数,因为打印函数的时间太长,会使中断服务函数长时间没有退出去,将会造成一些想不到的结果。
例如在串口中断中:
void USART2_IRQHandler(void)
{
unsigned char res;
uint16_t uhdata;
uint16_t uhMask = (&huart2)->Mask;
//if(USART2->ISR&(1<<5))//?????
if(((READ_REG((&huart2)->Instance->ISR) & USART_ISR_RXNE) != RESET) && ((READ_REG((&huart2)->Instance->CR1) & USART_CR1_RXNEIE) != RESET))
{
res = 0;
res = USART2->RDR;
printf("\r\n USART2 IRQ....%x %d \r\n",res,cnt2++);
if('$' == res)
{cnt =0;memset(USART2_RMCtmp_BUF,0,256);}
USART2_RMCtmp_BUF[cnt] = res;
if((cnt>=3) && (USART2_RMCtmp_BUF[3] == 'R'))
{
USART2_RMC_BUF[cnt] = res;
}
cnt++;
}
}
结果:
可以看到接收的结果就是0d 0a,然后什么都没有了,因为打印函数的时间过长,RDR寄存器里面的值没有立即读出,会造成溢出错误,从而造成不能一直进入接收中断处理数据。当把打印函数去掉之后一切就正常了。
所以,在中断服务函数里面不要做一些太耗时的操作,特别是在接收中断服务函数里面。
关键字:STM32 接收 中断服务函数 打印函数
引用地址:
STM32接收中断服务函数打印函数会造成错误
推荐阅读最新更新时间:2024-03-16 16:19
SST25VF080B SPI接口FLASH STM32驱动
所有的FLASHA 都一样只能从1变0,要想从0变1 只有擦除一个页扇, SST25VF080B 最小可以擦除4KB的页 速度也不错 50MHz 容量1MB 挺够用的 10万次的擦写寿命。最低2.7V 就可正常工作。 Flexible Erase Capability Uniform 4 KByte sectors Uniform 32 KByte overlay blocks Uniform 64 KByte overlay blocks 先记下 这些个7788的命令 SST25VF080B 的各种命令比较繁琐 Status Register这个设置写保护多点 我这里只用它的判忙BUSY 一样先配
[单片机]
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负峰峰值时,只需要修改正玄波码表即可 2.实现 代码如下所示(采用的是定时器2,DAC引脚是PA4) #define HZ(x) (u16)(72000000/sizeof(Sine12bit)*2/x) //计算Hz #define DAC_DHR12R1 0x40007408 //外设DAC通道1的基地址 u16 Sine12bit = { //正弦波描点 2048, 2098, 2148, 2
[单片机]
嵌入式开发中需要注意的几个C用法介绍
使用STM32开发的朋友不知道是否有发现过这样的一些宏定义?如下: #if defined (__CC_ARM) #pragma anon_unions #endif 看到上面的语句一开始确实搞不懂为什么要写这些东西,通过上网去查询,才搞明白这其中的使用原理。 上面的代码段我们可以看到两部分的内容: 1) __CC_ARM 2) #pragma anon_unions 这两个都有啥用呢?待我一一道来! 1、__CC_ARM 是 ARM 编译中的宏选项 __CC_ARM 是一个编译器的选项,在ARM开发中根据开发环境的不同,有好几个可选的宏选项。 这些选项可以查看所开发的芯片的内核文件,比如我使用
[单片机]
ADC模数转换+实验
ADC概述: Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 STM32F10x ADC特点: 12位逐次逼近型的模拟数字转换器。 最多带3个ADC控制器 最多支持18个通道,可最多测量16个外部和2个内部信号源。 支持单次和连续转换模式 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。 通道0到通道n的自动扫描模式 自动校准 采样间隔可以按通道编程 规则通道和注入通道均有外部触发选项 转换结果支持左对齐或右对齐方式存储在16位数据寄存器 ADC转换
[单片机]
51单片机控制sim900a,接收到短信点亮LED
已经经过测试,直接上程序,不懂@me #include reg52.h #include string.h #define uchar unsigned char #define uint unsigned int //以下是板子上LED的配置,把Px_x改成自己对应的脚。 #define LED1_ON P3_2 = 1 #define LED1_OFF P3_2 = 0 #define LED2_ON P3_3 = 1 #define LED2_OFF P3_3 = 0 #define LED3_ON P3_4 = 1 #define LED3_OFF P3_4 = 0 #define LED4_ON P3_5 = 1 #
[单片机]
STM32独立看门狗:你看狗都独立了
STM32--软看门口--不需要任何硬件支持--它在IC里面已经集成了。(算是独立看门狗的误解吧) 一个倒计数,减减减减减减,减到0就会触发一个系统复位信号也就是单片机重启了。 喂狗呢?就是隔一段时间就给这个倒计数重现装载数据,保持它不要到0. 头文件: #ifndef _WDG_H_ #define _WDG_H_ void watch_dog_init(void); void feed_dog(void); #endif 实现: #include stm32f10x_iwdg.h #include wdg.h void watch_dog_init(void) { IWDG_WriteAc
[单片机]
使用STM32的systick定时器中断实现RTC工作过程出错
开发环境:keil MDK V5.10 操作系统:windows 7(32位) 目标硬件:STM32F103C8 问题描述:使用STM32的systick定时器实现RTC功能。具体方法为systick滴答计时器配置为1ms时间间隔的滴答中断,定义一个RTC结构体,包含年、月、日、时、分、秒。在每进一次systick中断服务程序中更新一次RTC的值。主程序通过不停地获取RTC的时钟,每一秒钟使用printf函数输出当前的时间。测试过程发现绝大多数时间系统正常工作,但依然存在部分情况系统无法进行正常的输出。相关代码和测试结果如下: /** * @brief 系统滴答定时器中断服务程序,主要功能为更新实时时钟 *
[单片机]
三星推电视广播手机 直接从卫星接收信号
据外电报道,全球第三个最大的手机制造商三星电子公司宣布,它已经开发出一宽能够直接从人造卫星上接收无线电信号和电视广播的手机。 三星电子公司表示,它开发的SCH-B500 轻薄型手机能够支持人造卫星数字多媒体广播(S-DMB)服务,新手机的厚度仅13.5毫米,大约是去年早些时候在美国销售的手机厚度的一半。轻薄型手机长101毫米。宽52毫米。重量为100克,比先前的模式更轻薄。 三星电子公司指出,新手机兼容CDMA2000 1x EVDO标准,配备了一个2兆像素的数码照相机,支持240 X 320像素的分辨率,内置MP3播放器,支持蓝牙功能,能够观看文件和电视,并具有韩国、中国、日本和英语四种语言的音频书功能,和其他类
[焦点新闻]