历史上的今天
返回首页

历史上的今天

今天是:2025年06月26日(星期四)

正在发生

2018年06月26日 | STM32问题记录:外设初始化与外设时钟使能

2018-06-26 来源:eefocus

最近在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);  



推荐阅读

史海拾趣

Beckhoff Automation GmbH公司的发展小趣事

随着电子行业的全球化趋势日益明显,BCD Semi公司积极拓展国内外市场,与众多知名企业建立了紧密的合作关系。公司通过与合作伙伴共同研发、生产和销售半导体产品,实现了资源共享和优势互补,进一步提升了市场竞争力。同时,BCD Semi还积极参加国际电子展会和交流活动,展示公司的最新技术和产品,为公司的品牌建设和市场拓展奠定了坚实的基础。

ERNI Electronics公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ERNI Electronics开始积极拓展全球市场。1980年,公司在美国建立了分公司,为后续成为全球供应商打下了坚实的基础。此后,ERNI在新加坡建立了亚洲区总部,并在中国、台湾、韩国、泰国、马来西亚和印度等地设立了销售办事处。这一系列举措使得ERNI的产品能够覆盖更广泛的市场,满足了全球客户的需求。

BERNSTEIN公司的发展小趣事

在公司的快速发展中,BERNSTEIN公司逐渐将目光投向了国际市场。通过与国际知名企业的合作与交流,公司不断引进先进的技术和管理经验,提升了自身的竞争力。同时,BERNSTEIN公司的产品也逐渐在国际市场上赢得了广泛的认可和好评,为公司的发展注入了新的动力。

ETI Systems公司的发展小趣事

ETI Systems深知人才是企业发展的核心竞争力。因此,公司一直注重人才培养和引进工作。通过建立完善的人才培养机制和激励机制,ETI Systems吸引了一批具有丰富经验和专业技能的优秀人才加入公司。同时,公司也积极为员工提供广阔的发展空间和良好的工作环境,让员工能够充分发挥自己的才能和创造力。这种重视人才的企业文化,为ETI Systems的长期发展提供了有力的人才保障。

ATO SOLUTION公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。ATO SOLUTION公司始终坚持以质量为核心,建立了严格的质量管理体系。公司从原材料采购到产品生产的每一个环节都进行严格把控,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使公司赢得了客户的信任和口碑,为公司的长期发展奠定了坚实基础。

Amidon Associates Inc公司的发展小趣事

随着公司规模的扩大,ATO SOLUTION公司开始实施全球化战略布局。公司先后在多个国家和地区设立了研发中心和生产基地,充分利用当地资源和市场优势,提升整体竞争力。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和创新。

问答坊 | AI 解惑

USBISP下载线

自制的一块USBISP下载线 接口电路是用mega8来做的 然后用一个并口下载器来向其烧写程序(并口下载线是买的) 用的软件是ponyprog2000 安装完ponyprog2000后进行并口下载线联机测试 所选参数为: parallel  AVR ISP I/O LPT1 BIOS中 ...…

查看全部问答>

1N4148

1N4148的最大连续电流是300ma,那么这个快速开关二极管要导通的话,需要的电流是多大?假如我用4.7K电阻与1N4148串联,再加5V电压的话,这个二极管能导通吗?…

查看全部问答>

准备恶搞PSP

    近来相对空闲,在玩一下M3,单纯的学习比较无聊,所以突发奇想。想做一个山寨PSP。特意把想法总结一下和把工作进度分享一下。       其实我当然不是真的想做一套PSP啦,买一个还划得来,主要我 ...…

查看全部问答>

STM32SPI问题

SPI 总线配置为主模式,单线制双向传输方式。使用MOSI引脚。 发送数据无问题,在接收时,我只需接收一个字节数据就够了,但SPI总线SCK总会多出一些,看了手册里的DISABLE SPI 时要注意的一些问题,但仍然没解决。 我的顺序是:   &nbs ...…

查看全部问答>

哪位大侠了解MSP的水流旋转检测算法

如题,哪位大侠了解MSP的水流旋转检测算法。请指教。谢谢!…

查看全部问答>

关于AD输入的差分信号的寄存器设定

大家好,请教一下大家关于AD差分信号的寄存器配置,我用的芯片是MPC5644A 是否将ADC Command中的CHANNEL_NUMBER位设置成DAN1(91),然后2个信号分别接AN2/DAN1+口和AN3/DAN1-口,其余还需要设置什么吗?我第一次用差分信号,结果一直不出来,郁闷 ...…

查看全部问答>

(转帖)LINUX字符驱动结构分析

 好长时间没怎么看书了,最近把字符设备驱动部分又复习了一下,写个笔记.   Char Device Driver   相关数据结构:   struct cdev {   struct kobject kobj;   struct module *owner;   const struct file_operations *ops;   ...…

查看全部问答>

LM3S以太网DHCP问题

大概按academic的帖子https://bbs.eeworld.com.cn/thread-222963-1-2.html在9B96上写了个以太网的程序,是TCP做客户端,静态IP的话没有问题,可以将数据发到PC上,可设置成DHCP就不行了,与PC同连一个路由上,登录路由可以看到2个IP,是在一个网段 ...…

查看全部问答>

四轴飞行器

本人想制作一个四轴飞行器去参加明年的“挑战杯”学术竞赛,不知道能不能用51单片机实现,另外我还要学哪些和编程有关的东西,希望有人能指导一下,谢谢!…

查看全部问答>

如何用智能手机客户端控制电灯开关

大家好!小弟我是做手机软件开发的,想用iphone或者android手机软件控制电灯的开关,小弟我只会软件开发,对硬件不了解,有教程或者例子最好,需要什么配件,具体型号啥的,我从淘宝上买的开发板,还有zigbee模块,能做一些简单的试验,能得到zigbe ...…

查看全部问答>