STM32问题记录:外设初始化与外设时钟使能

发布者:SereneHeart最新更新时间:2018-06-26 来源: eefocus关键字:STM32  外设初始化  外设时钟使能 手机看文章 扫描二维码
随时随地手机看文章

最近在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  外设初始化  外设时钟使能 引用地址:STM32问题记录:外设初始化与外设时钟使能

上一篇:STM32外设结构体定义和时钟初始化语句顺序导致编译
下一篇:LPC1768菜鸟学习之时钟配置

推荐阅读最新更新时间:2024-03-16 16:07

STM32笔记记录5,捕捉
给等待入门的人一点点建议 : 入门必须阅读的相关文档 1、 几个重要官方文档的功能: a) Datasheet——芯片基本数据,功能参数封装管脚定义和性能规范。 b) 固件函数库用户手册——函数库功能,库函数的定义、功能和用法。 c) 参考手册——各种功能的具体描述,使用方法,原理,相关寄存器。 d) STM32F10xxx硬件开发:使用入门——相关基础硬件设计 e) STM32F10XXX的使用限制:芯片内部未解决的硬件设计bug,开发需要注意绕开。 f) 一本简单的C语言书,相信我,不用太复杂。 2、 其他的有用文档,对初学帮助很大 a) 如何使用STM32的软件库在IAR的EWARM下
[单片机]
工程师笔记|带有空片检测功能的STM32需注意的GPIO设计
引言 从STM32F0部分型号开始,比如STM32F04x和STM32F09x,STM32越来越多的型号具有了空片检测(Empty Check)功能。以前,STM32的启动由BOOT0和BOOT1来决定,在引入了空片检测功能之后,则在BOOT0=0的情况下,还需要分两种情况: 一是内部已经存在代码,则从用户存储区启动; 二是如果是空片,则从系统存储区启动,执行内部Bootloader。 它带来什么好处呢?客户如果是空片上板,无需对BOOT0引脚进行跳线,就可以直接使用内部Bootloader进行串口或其他通讯口进行代码烧录了,可以说非常地方便。但是,这同时为GPIO的设计带来一个非常大的风险,在电路设计时需要引起注意,做好
[单片机]
STM32 Bootloader与启动分析
一、STM32 程序下载与Bootloader 三种启动模式如下表: (截图与stm32中文参考资料) 1、从主闪存存储器启动,即从STM32内置的Flash启动,BOOT0=0,BOOT1=X, 一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,复位(软件复位、手动复位、硬件自动复位)后也直接从这启动程序。不需要使用到系统存储区的Bootloader程序。 2、从系统存储器启动,即STM32的ISP了。B00T0=1,B00T1=0,由于串口不能直接把程序下载到内置的flash里面,所以需要使用到ST公司内嵌于系统存储区(flash的某一部分的地址被编为0x1FFF_F000-0x1FFF_F7FF,这就
[单片机]
<font color='red'>STM32</font> Bootloader与启动分析
STM32不使用外部晶振的接法
STM32上不使用外部晶振,OSC_IN和OSC_OUT的接法 1、对于100脚或者144脚的产品,OSC_IN应接地,OSC_OUT应悬空 2、对于少于100脚的产品,有两种接法: OSC_IN和OSC_OUT分别通过10K电阻接地。 此方法可提高EMC性能 分别重映射OSC_IN和OSC_OUT到PD0和PD1,再配置PD0和PD1为 推免输出并输出0 此方法可以减小功耗(向对于上面),节省电阻。
[单片机]
stm32 奇怪的位赋值问题 出错了
1、在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题! (1) 、OUT1_R1 是单片机的一个IO口 , dat是传进来的一个数据 if ( (dat & 0x80) == 0) OUT1_R1 = 0; // 0是不亮,1是亮 else OUT1_R1 = 1; (2)、 OUT1_R1 = (dat&0x8000); // stm32里,这样操作不行,因为stm32里没有bit ; 在51里会自动把(dat&0x8000)强制转化为bit 。 2、但是在编译 stm32的keil 里编译上面的两个程序,就发生了不同。 在STM32里, (1) 是可以正常的往IO里输入数据的,但是(
[单片机]
STM32系统保存参数到eeprom的实现方法
1 ini.c #include stdio.h #include stm32f10x.h #include string.h #include EEPROMDrv.h #include ini.h //define the memory map in EEPROM #define IniStartAddress 0 #define IniMaxSize 200 /* EEPROM 0________200________________________________________________________________64K | | | |INI | OTHERS |
[单片机]
stm32,ov7670识别二值化并识别黑色物体,串口返回坐标值
自己网上找的代码,根据要求修改可二值化,识别黑色物体,用红色框框框起来,串口返回坐标值 单片机源程序如下: #include led.h #include delay.h #include key.h #include sys.h #include lcd.h #include usart.h #include string.h #include ov7670.h #include tpad.h #include timer.h #include exti.h #include usmart.h #include EasyTracered.h const u8*LMODE_TBL ={
[单片机]
STM32 初学 led 不用库 详细分析
本来只是路过,写详细一点。 我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了, 再动手吧。 我做了个实例,不用ST的库来点LED,解答你的问题 我的 KeilMDK 3.5 我的STM32板子奋斗版是 ,IC 是 STM32F103VET6 调试工具 JLINK V8 LED 接在 PB5 ,高电平点亮 既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?然后查了百度之后又能懂多少? (一)新建 keil 工程,IC选择 ST 公司的 STM32F103VE,keil提示是否copy 启动文件,选择是。 这里有问题问楼主, 你有没有读过这个启动头
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved