1、串口时钟

  • GPIO外设时钟都挂载在APB1总线上
  • 串口1的时钟挂在APB2上,而串口2、串口3则是挂在APB1上

所以,在初始化串口1时,我们可以使用以下代码:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

却不可以使用以下代码初始化串口2、串口3:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART2|RCC_APB2Periph_GPIOB, ENABLE);

若要正确初始化串口相关时钟并且兼顾代码风格的统一性,推荐使用:

//串口1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);          //使能USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       //使能GPIOA时钟//串口2:
RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART2, ENABLE);          //使能USART2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       //使能GPIOA时钟//串口3:
RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART3, ENABLE);          //使能USART3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       //使能GPIOB时钟

2、串口中断

在进入串口中断后,需要对中断的类型进行判断,这里有两个容易混用的函数:

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint32_t USART_IT)

  该函数不仅会判断标志位是否置1,同时还会判断是否使能了相应的中断。所以在串口中断函数中,如果要获取中断标志位,通常使用该函数。

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG)

  该函数只判断标志位。在没有使能相应的中断时,通常使用该函数来判断标志位是否置1。

在串口中断中,使用的应该是函数USART_GetITStatus(),而USART_GetFlagStatus()通常用在串口轮询的场合。

参考:https://www.cnblogs.com/leo0621/p/8709944.html

串口中断函数常用代码如下:

void USART1_IRQHandler(void)
{uint8_t data;if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)       //接收寄存器非空中断{data = USART_ReceiveData(USART1);      //读取字符//添加你的代码}if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)       //发送寄存器空中断{ //添加你的代码//如果所有数据都已发送完毕,则关闭发送中断USART_ITConfig(USART1, USART_IT_TXE, DISABLE);}
}

更加丧心病狂一点的写法:(参考资料:https://blog.csdn.net/xiahailong90/article/details/94595005)

void USART1_IRQHandler(void)
{uint8_t data;if (USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET){USART_ReceiveData(USART1);USART_ClearFlag(USART1, USART_FLAG_PE);}if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET){USART_ReceiveData(USART1);USART_ClearFlag(USART1, USART_FLAG_ORE);}if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET){USART_ReceiveData(USART1);USART_ClearFlag(USART1, USART_FLAG_FE);}if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //接收寄存器非空中断{USART_ClearFlag(USART1, USART_FLAG_RXNE);USART_ClearITPendingBit(USART1, USART_IT_RXNE);data = USART_ReceiveData(USART1);      //读取字符//添加你的代码}if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)       //发送寄存器空中断{USART_ClearFlag(USART1, USART_FLAG_TXE);USART_ClearITPendingBit(USART1, USART_IT_TXE);//添加你的代码//如果所有数据都已发送完毕,则关闭发送中断USART_ITConfig(USART1, USART_IT_TXE, DISABLE);}
}

三、结构体局部变量

STM32的库函数大量使用了结构体,不够规范的使用方法会导致奇怪的问题,比如说PWM上电初始化后正常输出,程序内再次初始化后没有输出这样莫名其妙的BUG。

1、通常的写法

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

2、保险一点的写法

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure = {0};

3、规范的写法

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_TimeBaseStructInit(TIM_TimeBaseStructure );

细数STM32F103的那些坑相关推荐

  1. 细数AVPlayer的那些坑

    http://ivanyuan.farbox.com/post/shi-pin-bo-fang-de-na-xie-keng 最近一直在做视频动态挂件以及一个视频播放的功能,在开始做之前,先学习了苹果 ...

  2. 细数ST-LINK的种种坑:ST-LINK Connection error,USB communication error,NO target connected等

    一.正确配置ST-LINK 此部分可以帮助解决ST-LINK Connection error的问题 ST-LINK有两种接线方式,一种是JTAG,一种是SWD(SW),网上购买的ST-LINK(下图 ...

  3. 细数sass安装中遇到的坑

    前言: 前两天打算清理电脑的时候,遇到了一点特殊的问题,打算重装一些东西,其中就有我一直用的顺手的SASS预编译工具. 但是在重装的时候,我发现我居然不会用了??? 靠,要不是我用了半年的Sass,我 ...

  4. 细数Qt开发的各种坑(欢迎围观)

    1:Qt的版本多到你数都数不清,多到你开始怀疑人生.从4.6开始到5.8,从MSVC编译器到MINGW编译器,从32位到64位,从Windows到Linux到MAC.MSVC版本还必须安装对应的VS2 ...

  5. 百密一疏,防不胜防,细数那些大型数据库建设过程中绕不开的坑

    构建大型数据库时,无论最开始的设计多么精妙,到后续操作的时候或多或少都会遇到一些问题,本文将来细数大型数据库中不可避免会遇到的问题. 原文标题:Feature Casualties of Large ...

  6. 细数近年来机器学习研究的几大怪现状

    人工智能领域的发展离不开学者们的贡献,然而随着研究的进步,越来越多的论文出现了「标题党」.「占坑」.「注水」等现象,暴增的顶会论文接收数量似乎并没有带来更多技术突破.最近,来自卡耐基梅隆大学的助理教授 ...

  7. 年终盘点丨细数2017云栖社区20大热点话题(附100+话题清单)

    2017,你在聚能聊里分享了多少内容?贡献了多少话题?又收获了多少呢?社区聚能聊不仅可以请教技术难题,探讨热点话题,也可以八卦日常生活,分享码农们的点点滴滴. 程序员的世界不止是眼前的代码,一样有诗和 ...

  8. 《八股文》细数Java线程、并发、锁,温故而知新

    <八股文>细数Java线程.并发.锁,温故而知新 基础 1. 并行.并发有什么区别? 2. 说说什么是进程和线程? 3. 说说线程有几种创建方式? 4. 为什么调用start()方法时会执 ...

  9. 怼完Sophia怼深度学习!细数完大神Yann LeCun 这些年怼过的N件事,原来顶级高手是这样怼人的...

    图片来源:PCmag.com 十多个小时前,深度学习大神Yann LeCun语出惊人,他宣布放弃"深度学习"这个词.因为媒体对这个词的炒作言过其实,混淆了大家真正的工作,而&quo ...

最新文章

  1. java 遍历方法_Java ArrayList遍历的3种方法
  2. Spring OXM-XStream转换器
  3. Linux中自动删除n天前日志
  4. 批量添加DNS的A记录和PTR记录
  5. 特例模式(Special Case Pattern)与空对象模式(Null Pointer Pattern)—— 返回特例对象而非 null
  6. 【黑马JS笔记】JavaScript基础语法
  7. python基础编码规范_Python基础:编码规范(4)
  8. Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2
  9. 由QCustomplot引发drawPolyline和drawLine的区别
  10. tp5第三方支付-支付宝
  11. 主观唯心、客观唯心、朴素唯物、历史唯物、辩证唯物主义的内涵、区别和联系
  12. Eureka注册服务列表显示ip+端口
  13. 互联网和大数据是什么意思_互联网大数据是什么,求详细的解答
  14. ArcEngine IProximityOperator踩坑小记
  15. java Base64加密解密中文乱码处理
  16. Python 关于浮点数取整详解
  17. 计算机应用专业成绩汇总表,计算机应用基础第7章Excel综合应用1—成绩表统计与分析.ppt...
  18. Oracle的安装及导入.dmp文件教程
  19. 秀动脚本增加微信通知和多账号抢购
  20. 遍历报错: Uncaught ReferenceError: key is not defined

热门文章

  1. 计算机专业好的广东二本学校排名2015,2021广东二本大学排名 最好二本院校名单...
  2. java设计模式1,单一职责原则
  3. python安装pandas错误怎么解决,在Python中我安装了pandas,但它无法正常工作
  4. CLUECorpus2020: A Large-scale Chinese Corpus for Pre-training Language Model
  5. 电脑出现initialization failure:0x0000000c的问题
  6. 2021年电工(高级)考试题库及电工(高级)免费试题
  7. 用python做软件开发有前途吗_做软件开发有前途吗?
  8. Jupyter Notebook中numpy什么意思 import numpy as np详解
  9. flutter 使用百度定位进行定位以及配置
  10. 搭建unbound转发服务器分流国内外及内网域名