野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15737|回复: 8

F1系列学习以来的小疑惑

[复制链接]
发表于 2020-8-3 23:17:55 | 显示全部楼层 |阅读模式
Q1#<[size=12.6667px]stdio.h>:包含了这个头文件为什么还要手动添加int fputc(int ch, FILE *f)  函数这个函数?这个函数的名字又是从哪里找到的?(因为stdio那个头文件根本打不开)如果我要找scanf的话去哪里找要添加的函数名称?(我的意思能从什么头文件里面找吗?不是上网找)
Q2:中断服务函数必须要填加清除中断吗(那个是叫清除中断标志位吗?),因为火哥的用KEY1产生中断控制LED强调了一下,但是后面在串口通信的时候,产生中断,然后向电脑发送数据那里的函数是没有加USART_ClearITPendingBit(后面这个虽然没加,但也没啥问题,我加上过后也没问题,前面那个不加就有问题),不知道为什么。
Q3:EXTI没有时钟吗?为什么开RCC的函数里面根本就没有EXTI的时钟?还是说EXTI的时钟只要AFIO开了就行?
Q4:(这个是上课没听懂,卑微勿喷)USART是叫串口,那个霸道配的那个类似于电脑显示屏插口那个也叫串口吗?串口线好像就是那个大插口的线吧?不太分的请那个大插口和USART的关系。
回复

使用道具 举报

发表于 2020-8-4 09:23:42 | 显示全部楼层
说一下Q2吧,如果进入中断不清除标志位,那么中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 10:21:10 | 显示全部楼层
本帖最后由 骁骑校尉-小黑 于 2020-8-4 10:35 编辑
Wangwwd 发表于 2020-8-4 09:23
说一下Q2吧,如果进入中断不清除标志位,那么中断服务程序结束后由于标志位还是置位的并且中断是允许的,那 ...

好滴,谢谢。我今天看存储器那一节的时候,老师在初始化的DMA的时候加了clearflag,虽然不是中断,但原理应该差不多。那这么说来的话,串口通信那一节,接收和发送数据那里还是应该加上清除好一点是吧?上课的截图我放在帖子上了,我觉得是应该加一个中断标志位的清除,USART_ClearITPendingBit(DEBUG_USARTx,USART_IT_TC);(另外如果加的话应该是这样加吧,当发送完成时清除)

老师上课截图

老师上课截图
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:28:47 | 显示全部楼层
有些中断标志位可以通过读某些寄存器,自己清除,如串口接收可以通过读取接收寄存器,自动清除,有些中断必须要软件清除。
至于printf scanf重定向问题,需要看下stdio.h或者相关文件,里面有些函数是weak的,留给使用者重定义的。
类似gcc的重定向:
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 17:19:18 | 显示全部楼层
a5820736 发表于 2020-8-4 15:28
有些中断标志位可以通过读某些寄存器,自己清除,如串口接收可以通过读取接收寄存器,自动清除,有些中断必 ...

感谢,之前可能是哪里没弄好打不开<stdio.h>(所以我才问的),刚刚重新试了一下,打的开了。
1.所以意思是说<stdio.h>这个里面为我们提供了如果要调用类似printf函数的函数,只是没有定义具体怎么写,要调用的话就自己补上定义。弱定义刚好在中断服务函数那里学到过。
2.后面那个我有点想当然了,我去翻了一下手册,好像确实如大佬所说是硬件自动清除(截图在帖子上)。
另外还有一点,因为肯定还有一些寄存器是自动清除中断标志位的,但要注意手册里面的内容。
所以我不知道能不能耍一个小聪明,因为写了软件清除其实也没问题,所以我全都加上不知道可不可以(怕忽略有些没有自动清除)。会不会有一些不能加的情况?

手册截图

手册截图
回复 支持 反对

使用道具 举报

发表于 2020-8-4 19:32:48 | 显示全部楼层
骁骑校尉-小黑 发表于 2020-8-4 17:19
感谢,之前可能是哪里没弄好打不开(所以我才问的),刚刚重新试了一下,打的开了。
1.所以意思是说这个里 ...

一般来说,你主动清是没问题的
回复 支持 反对

使用道具 举报

发表于 2020-8-9 11:06:18 | 显示全部楼层
我也对Q1有过疑问,后来害自己去查了一下,我说一下我的看法,stdio里面的函数都是封装后经过编译的,但这种被编译的函数定义应该是一种类似于汇编的弱定义,如果你在项目某个地方重定义后,具体的定义实现就以你的自定义为准,至于从哪里找的话,直接百度不就可以搜到了吗。。。
回复 支持 反对

使用道具 举报

发表于 2020-8-9 11:07:27 | 显示全部楼层
MOWANG 发表于 2020-8-9 11:06
我也对Q1有过疑问,后来害自己去查了一下,我说一下我的看法,stdio里面的函数都是封装后经过编译的,但这 ...

如果有谁知道,麻烦大佬和我也说一下在哪里查找printf中调用了fput().
回复 支持 反对

使用道具 举报

发表于 2020-8-10 11:33:06 | 显示全部楼层
MOWANG 发表于 2020-8-9 11:07
如果有谁知道,麻烦大佬和我也说一下在哪里查找printf中调用了fput().

printf是一个c库,在keil的安装目录下,是以dll的格式提供的,没有源码,里面就调用了fput
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 12:46 , Processed in 0.032164 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表