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. WPF:如何为程序添加splashScreen(初始屏幕)
  2. tableau实战系列(十七)-如何将 tableau的Server License迁移到新环境中去
  3. MSCRM2011 Current User has Role 【判定当前用户角色方法】
  4. matlab gpu deep learning_优秀!这个库帮你使用GPU加速传统机器学习方法和Pandas数据处理...
  5. 专访ThoughtWorks王磊:从单块架构到微服务架构
  6. webQQ协议——获取信息
  7. 计算机搜索不了硬盘文件资料,解决WINDOWS痛点,本地文件搜索从未如此简单
  8. 使用NDK编译C++代码
  9. LivePlayer H5播放器(实时视频和历史视频)
  10. 【Python】电商用户行为数据可视化分析实战
  11. 媒体报道 | 创业邦:巴别鸟,一款便捷好用的企业级文件协同网盘
  12. 教你怎样维持异地恋!
  13. 杭电通信841考研考研经验交流及资料分享
  14. STM32+OpenMV+AS608实现人脸识别
  15. 人工智能面临的主要威胁是对最终失去实际控制人工智能能力的恐惧
  16. Android View(一)——View的基础知识
  17. 双拼输入法-自然码和微软双拼
  18. DELL Precision T7920加装显卡遇到的坑
  19. 能源36号文解读_河南能源监管办全面落实国家发改委第36号令调整承装(修、试)电力设施许可办理有关事项...
  20. html页面中常见的特殊符号,收集的web页面html中常用的特殊符号大全分享

热门文章

  1. GitHub Interesting Collection
  2. Redis Cluster:Too many Cluster redirections异常
  3. 使用Python读取csv文件并进行分类存储
  4. 手把手教你把网页转为.exe文件.
  5. 2023AU软件,Adobe Audition 全系列软件下载安装教程
  6. 旋翼机控制系统方案学习及总结
  7. 我读DenseNet
  8. 安卓学习之百度地图定位
  9. Android Studio - 在IDE中,输入法切换不了中文
  10. 机器学习决策树DecisionTree以及python代码实现