每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。
数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。
另外,STM32的每个端口使用前都要将其时钟使能,STM32的GPIO的时钟统一挂接在APB2上,具体的使能寄存器为RCC_APB2ENR,该寄存器的第2位到第8位分别控制GPIOx(x=A,B,C,D,E,F,G)端口的时钟使能,当外设时钟没有启用时,程序不能读出外设寄存器的数值,如打开PORTA时钟:
RCC->APB2ENR|=1<<2; //使能PORTA时钟
使能外设时钟后,GPIOA的十六位就可以按照设定的状态工作了,之后就是具体设置哪一位了以第八位为例即高位的首位,在GPIOx_CRH寄存器中进行设置,GPIOA的每一位都有该寄存器的四位来设定相应的参数,这四位中的高两位(CNF0,CNF1)设置GPIO的输入输出模式,低两位(MODE0,MODE1)是设置GPIO的输出频率,具体可以参考STM32参考手册。
GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原来的设置,同时屏蔽其它端口,不影响其它端口的设置
GPIOA->CRH|=0X00000003;//PA8 推挽输出
十六进制中的3 换成二进制 00 11 前两位00表示推挽输出,11代表输出频率50Mhz,若CRH|=0x4,表示模拟输入模式(ADC用),0x3表示推挽输出模式(作输出口用,50M速率),0x8表示上/下拉输入模式(做输入口用),0xB表示复用输出(使用IO口的第二功能,50M速率)。
这是对一位的操作,当然也可以多位操作,因为STM32对GPIO操作必须是32位全字操作,设置完成后GPIOA的第8位就可以使用了之后给GPIOA->ODR=0x xxxx xxxx送数据就行了
总得来说,就是MODEy[1:0] 先配置管脚是输入还是输出,是输入就继续配置CNFy[1:0]来配置输出管脚的连接模式。要是输出的话,就继续配置MODEy[1:0]的管脚速度速度等级,之后再配置管脚的连接模式。上拉,下拉,推免,开漏等等。具体运用的时候看看手册就明白了。
学过AVR的都知道,输出的时候有输出数据寄存器,STM32也一样。思想COPY过来,就自然知道了GPIOX_ODR是做什么的了。不过要注意的是,这个玩意不能一个位一个位的去操作,还是51的简单啊,不过原子大哥已经把那个端口映射可操作位段,不明白,还是看自己的吧。一个GPIOA端口就16位,自然的32位的GPIOX_ODR 就只有低16位有效了,想输出什么就给这个寄存器赋值就OK了。
推荐阅读最新更新时间:2024-03-16 14:27
单片机按键检测函数
/******************************************************************* 函数功能:判断某一按键的状态; 返回值:0x00-未按键,0x01-短按键,0x02-长按键;(本程序不设连发功能) 注意:本长短按键是在同一按键上实现; 长按键是持续按下2秒后认为是长按键,此时可以执行按键功能程序,必须释放 按键后才可以再次执行按键判断; 短按键是按下时间在2秒以内并释放的为短按键,含20ms的防抖,按键执行是在 按键释放后执行的; 为了定时方便,本函数是每10ms执行一次的,如果执行周期有变,注意更改相 关变量。 (可以将此函数以结构体形式扩展为多个通道检
[单片机]
单片机外部中断的两种模式
51单片机的外部中断有两种模式:电平触发模式和跳变沿触发模式 第一,选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。第二,选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 区别: 电平触发模式时,中断标志寄存器不锁存电平中断请求信号。单片机把每个周期的S5P2采样外部中断口的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。 换言之,就是要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执
[单片机]
STM32的sd卡的IAP升级固件教程
一. 1.功能:通过sd卡升级stm32的固件 2.所需要的设备:STM32的最小系统、sd卡模块、sd卡、keil软件,boot升级程序,APP程序 二. 1.据程序中的接口连接好电气关系,具体的电路图根据附件1连接(根据个人,这个附件就不上传了) 2.首先打开附件2的stm32 boot升级程序 3.根据如图所示设置stm32 boot程序下的keil软件 3.如图上第三步的标示是留给64k的boot引导程序区,这一步是根据你的stm32的flash的大小设定的,一般留有64k空间足够用了 4.这个要注意 5.如上图设置好的后,下载到板子里面 三. 1.打开附件3的
[单片机]
PIC16C924型单片机在酒精浓度检测仪中的应用
摘要: 本文介绍PIC16C924型单片机在酒精浓度检测仪中的应用,并给出实际的软件流程。
关健词: 单片机 酒精浓度检测
引言
Microchip Technology公司PIC16C924是一种低价格、高性能、CMOS、全静态、带有集成LCD驱动器模块和5通道8位高速A/D的8位微控制器。指令总线和数据总线分开的哈佛结构可容纳14位指令和8位数据。两级指令流水作业使所有程序跳转指令需2个时钟周期外,其余均为单周期指令。RISC指令集仅35条指令。PIC16C924还具有减少外部元件、降低成本、增加系统可靠性和降低功耗等特点。紫外线可擦除型用于代码开发,OTP型用于批量生产。非常适合
[测试测量]
用普中开发板做的51单片机的智能时钟具有闹钟功能
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。 使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。 单片机源程序如下: #include reg52.h #include key.h #include LCD1602.h #include DS1302.h #include music.h #include DS18B20.H #define no
[单片机]
stm32红外遥控的外部中断实现
花了整整两天时间终于算是基本把红外解码搞明白了,其实并不是很难,用了两天时间,说来惭愧啊,原因就是细节上的问题,不过最终总算找出问题来了。使用外部中断来解码,就先对外部中断进行配置吧 void exti_init() { RCC- APB2ENR|=1 0;//使用外部中断要开AFIO复用时钟,因为要用到用到它的寄存器来选择出发IO口 AFIO- EXTICR |=1 4;//将出发外部中断的IO配置为PB.9 EXTI- IMR|=1 9;//中断线9的中断打开 EXTI- EMR|=1 9;//时间也打开 EXTI- RTSR|=1 9;//上升沿出发中断 } 开始,弄了还几次程
[单片机]
7小技巧:如何选择MCU和电源让您的嵌入式电路设计更高效
1、MCU的选择 选择 MCU 时要考虑 MCU 所能够完成的功能、MCU 的价格、功耗、供电电压、I/O 口电平、管脚数目以及 MCU 的封装等因素。MCU 的功耗可以从其电气性能参数中查到。供电电压有 5V、3.3V 以及 1.8V 超低电压供电模式。为了能合理分配 MCU 的I/O资源,在 MCU 选型时可绘制一张引脚分配表,供以后的设计使用。 2、电源 (1)考虑系统对电源的需求,例如系统需要几种电源,如24V、12V、5V或者3.3V等,估计各需要多少功率或最大电流(mA)。在计算电源总功率时要考虑一定的余量,可按公式“电源总功率=2& TI mes;器件总功率”来计算。 (2)考虑芯片与器件对电源波动性的需求。一
[单片机]
基于Atmega16L单片机的高精度频率调节器
1 引言 在现代化工业生产与高精度测试中,我们需要相当精确的频率来帮助判断设备性能指标。而且我们希望能够微调该频率。采用压控振荡器得到的频率不够精确,微调频率步骤烦琐,耗时漫长,因此有些测试项目限制了压控振荡器的使用。 Mega系列单片机是Atmel公司于2002年起陆续推出的。这款AVR增强型单片机具有速度快,抗干扰能力强,价格低廉等诸多优点。为了加快AVR单片机的软件编制,Atmel以及第三方提供的开发工具多种多样,程序开发方便有效。该单片机内部FLASH结构功能灵活,加锁后很难解密,可以最大限度地保护知识产权。AVR单片机可以广泛应用于通信、野外测试、汽车电子、医疗器械等领域,并且适用于各种低电压、低功耗的场合。 本
[单片机]