最近在STM32上写了一份串口通信的程序,但下载复位后串口却不能工作,初始化的代码如下:

//发送/接收的GPIO、串口和中断的初始化结构体
GPIO_InitTypeDef GPIO_InitStructureTx;
GPIO_InitTypeDef GPIO_InitStructureRx;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//设置发送和接收引脚
GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructureRx.GPIO_Pin = GPIO_Pin_10;
//发送引脚设置为推挽复用、接收引脚设置为浮空输入
GPIO_InitStructureTx.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//设置引脚工作频率
GPIO_InitStructureRx.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureTx.GPIO_Speed = GPIO_Speed_50MHz;
//引脚初始化
GPIO_Init(GPIOA, &GPIO_InitStructureTx);
GPIO_Init(GPIOA, &GPIO_InitStructureRx);//波特率
USART_InitStructure.USART_BaudRate = USART_BaudRate;
//数据长度
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//校验位
USART_InitStructure.USART_Parity = USART_Parity_No;
//流控制
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//打开发送和接收模式
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//初始化串口1
USART_Init(USART1, &USART_InitStructure);//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
//中断初始化
NVIC_Init(&NVIC_InitStructure);//串口1使能
USART_Cmd(USART1, ENABLE);//打开串口1接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

可以看到,外设时钟使能放在了GPIO和USART的初始化之后。在网上查了下资料,发现STM32外设未被使能的情况下外设的寄存器无法被设置。引用一个解释:

“ARM的芯片,外设通常都是给了时钟后才能设置它的寄存器(即才能使用这个外设)。STM32、LPC1XXX等等都是这样,这么做的目的是为了省电,使用了所谓时钟门控的技术。寄存器是基于触发器的,触发器的赋值是一定需要时钟的,而寄存器的时钟是由总线时钟提供的,就是说没有总线时钟的话,你给寄存器值它是不会读入的。”

因此,把外设时钟使能放在GPIO和USART初始化之前,就解决了这个问题,最终代码如下:

//发送/接收的GPIO、串口和中断的初始化结构体
GPIO_InitTypeDef GPIO_InitStructureTx;
GPIO_InitTypeDef GPIO_InitStructureRx;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//时钟使能(时钟使能放在GPIO和USART初始化之前)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//设置发送和接收引脚
GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructureRx.GPIO_Pin = GPIO_Pin_10;
//发送引脚设置为推挽复用、接收引脚设置为浮空输入
GPIO_InitStructureTx.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//设置引脚工作频率
GPIO_InitStructureRx.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureTx.GPIO_Speed = GPIO_Speed_50MHz;
//引脚初始化
GPIO_Init(GPIOA, &GPIO_InitStructureTx);
GPIO_Init(GPIOA, &GPIO_InitStructureRx);//波特率
USART_InitStructure.USART_BaudRate = USART_BaudRate;
//数据长度
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//校验位
USART_InitStructure.USART_Parity = USART_Parity_No;
//流控制
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//打开发送和接收模式
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//初始化串口1
USART_Init(USART1, &USART_InitStructure);//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
//中断初始化
NVIC_Init(&NVIC_InitStructure);//串口1使能
USART_Cmd(USART1, ENABLE);//打开串口1接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

STM32填坑:时钟使能必须在外设初始化之前相关推荐

  1. STM32片上外设时钟使能、失能和复位的区别

    置顶/星标公众号,不错过每一条消息! 今天分享的关于时钟知识,可能很多人没有在意过.这也是之前有朋友问过的问题,这里就简单给大家普及一下吧. 1 RCC时钟说明 在STM32参考手册中,都有Reset ...

  2. 《二》STM32时钟使能及应用总结

    综述 STM32的新手,一般都会对一个问题很纠结.我也是,就是所谓的"时钟问题".我们在尽心STM32编程时,会痛苦地发现这样一个事实:不管你要干嘛,你首先要做的一件事就是使能时钟 ...

  3. 初涉STM32之浅谈时钟使能问题

    作为一个STM32的菜鸟级人物,我刚开始接触STM32时,其实和当年开始学习51单片机的心理是一样的.茫然,谁说不是呢?但是,正常的学习途径无非就是看书,然后敲代码,最后烧程序,有问题就check,然 ...

  4. 填坑-关于SysTick定时器

    目录 01.坑的由来 02.填坑 03.修改代码验证 04.总结 本文主要来填坑,更正之前文章的错误.也进一步加深了我对SysTick定时器的理解,希望对你有帮助. 01.坑的由来 在之前的推文中&l ...

  5. 【STM32】STM32F4时钟系统

    00. 目录 文章目录 00. 目录 01. STM32F4时钟系统概述 02. STM32F4时钟系统图 03. STM32F4时钟初始化配置 04. 时钟配置总结 05. 预留 06. 附录 07 ...

  6. STM32复位与时钟、定时器

    复位与时钟     1>复位         1,上电复位:MCU当NRST为低电平时产生复位,而C35电容在上电瞬间,快速充电,相当于短路,GND的0v提供给NRST,MCU处于复位状态,当C ...

  7. STM32的AFIO时钟什么时候需要开启

    相比于普通单片机,STM32 拥有复杂的时钟系统,相应的控制器称为 RCC(Reset Clock Controller,复位与时钟控制器).每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可 ...

  8. Stm32之RTC时钟(2021-07-26)

    Stm32之RTC时钟 1.时钟框图: 先将之前没做笔记的时候的时间框架图补上: 同样源自正点原子的PPT,图中红框的部分为RTC的时钟源,有三种: HSE的128分频: LSI(大概40kHz) L ...

  9. HC32F460填坑 - SPI POLLING SEND

    HC32F460填坑 - SPI POLLING 总结 目前,小一点的系统很流行SPI接口的显示屏,有黑白TN,有彩色TFT,有高对比OLED,显示分辨率从3296到320240不等,这些显示屏成本低 ...

最新文章

  1. Matplotlib基础绘图功能 — 以折线图为例
  2. mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...
  3. Python Tornado搭建高并发Restful API接口服务
  4. java学习与总结:计算机网络
  5. 字符串和json之间的互相转化
  6. rest laravel_如何通过测试驱动开发来构建Laravel REST API
  7. Spring注解 @Async 实现异步调用方法
  8. i5+GT730+B85安装OSX10.10.5 (Yosemite Install(14F27).cdr)
  9. 关于GDAL计算图像坐标的几个问题
  10. 复制移动VMware Workstation虚拟机文件产生的问题【转】
  11. 如何成为优秀的技术主管-管理篇
  12. c语言自动按键脚本,纯C语言写的按键驱动,将按键逻辑与按键处理事件分离~
  13. 【青少年编程】【Scratch】03 声音模块
  14. 更改服务器进bios修改启动项,bios设置修改开机启动项的方法
  15. RK987蓝牙键盘使用说明书分享
  16. 第26讲—项目6—存款利息计算器
  17. 【LOJ3124】「CTS2019」氪金手游
  18. python 三维地球代码_Python地图可视化三大秘密武器
  19. 脑网络分析软件Gretna操作--Network Analysis
  20. 跨境电商供应链系统:轻松统筹管理进出口跨境电商系统

热门文章

  1. 全文翻译:Deep Learning for Image Super-resolution: A Survey
  2. English trip 自习内容 英语时态
  3. 解决”error: info is different in .repo/manifests/.git vs .repo/manifests.git报错
  4. 王健林身价暴跌百亿,儿子却在撒钱!
  5. G1垃圾回收器在并发场景调优
  6. 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影
  7. Kafka Message Dilivery Semantics
  8. mysql log-update 错误_记一次修复MySQL socker 错误
  9. 【python爬虫学习】cookie模拟登陆
  10. 陌然系列小程序更新了