STM32是基于ARM Cortex-M3内核的芯片,专为要求高性能、低成本、低功耗的嵌入式应用设计的芯片。1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度。
我学的是STM32F103。它的内核为:ARM 32位的Cortex -M3 CPU,它的工作频率最高可以达到72MHZ。2个12位AD(16路通道),80个通用I/O接口,7个定时器,9个通信接口。
(一)通用I/O接口
主要要达到的目的是:1、了解通用I/O接口的接口和性能。2、了解复用功能和重映射。3、掌握通用I/O接口的程序设计方法。
1.1.1通用I/O(GPIO)接口的结构:
一个GPIO引脚包含以下几个寄存器:①两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH),②两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR),③一个16位的复位寄存器(GPIOx_BRR),④一个32位的置位/复位寄存器(GPIOx_BSRR),⑤一个32位的锁定寄存器(GPIOx_LCKR)。所有寄存器不允许按照半字节或字节访问,必须按32位字访问。
1.1.2每一个GPIO引脚都可以在程序中配置成如下几种模式:输入悬空,输入上拉,输入下拉,模拟输入,开漏输出,推挽式输出,,推挽式复用功能,开漏复用功能。
这些模式通过CNF[1:0]和MODE[1:0]来完成配置
1.2.1通用I/O(GPIO)接口的功能
GPIO有四种功能:1通用的I/O接口。2单独的为设置或者位删除。3外中断/唤醒线、4复用功能(AF)和重映射、5GPIO的功能锁定
1.2.11通用I/O:在复位期间和刚复位之后,复位功能未开启,I/O口被配置成浮空输入模式(CNFx[1:0]=01b,MODE[1:0]=00b)
1.2.12单独的位设置和位清除:当对GPIOx_ODR的个别位进行设置时,在单次APB2写操作里,可以改变一个或多个位。这是通过对GPIOx_BSRR和GPIOx_BRR来实现的。想改变某一位可以单独对这位写1,写0则此位不被更改。
1.2.13外部中断:当使用外部中断线时,相应引脚必须配置成“输入模式”。
1.2.14复用功能(AF)和重映射:
复用输入:端口可以配置成输入模式和输出模式
复用输出:端口必须配置成复用功能输出模式(推挽或开漏),这样使引脚和输出寄存器断开,并和片上外设的输出信号连接。
双向复用功能:端口必须配置成复用模式功能输出模式(推挽和开漏)
1.2.15GPIO的锁定机制:为了防止I/O配置被更改,可以单独对某个位进行锁定使其在下一次复位之前不可以在被更改。
1.2.2GPIO的功能配置
1.2.21输入配置
1.2.22输出配置
1.2.23复用功能配置
1.2.24模拟输入配置
1.2.3复用功能与重映射
①OSC_IN和OSC_OUT引脚通过AFIO_MAPR来实现对他们的重映射。
②BXCAN可以被映射到端A、B、D上,由CAN_REMAP[1:0]来设置
③调试接口信号的映射
④定时器的重映射分别由TIM1_REMAP[1:0],TIM2_REMAP[1:0],TIM3_REMAP[1:0],TIM4_REMAP[1:0]来设置
⑤USART1的重映射由寄存器USART1_REMAP[1:0];来设置=0为PA9和PA10,=1为PB6和PB7。
USART2的重映射寄存器为USART2_REMAP[1:0].
USART3的重映射寄存器为USART3_REMAP[1:0]
⑥I2C的重映射寄存器为I2C_REMAP=0为PB6和PB7,=1为PB8和PB9,
⑦SPI1的重映射寄存器为SPI1_REMAP=0为PA4,PA5,PA6,PA7.SPI1_REMAP=1为PA15,PB3,PB4,PB5
2.1.1通用I/O接口的编程方法
ST公司已经提供了比较完善的通用I/O的接口库,其位于“stm32f10x_gpio.c”中对应的头文件为“stm32f10x_gpio.h”
GPIO_DeInit函数:GPIO寄存器复位为默认值
GPIO_AFIODeInit函数:复用功能寄存器复位为默认值
GPIO_Init函数:用于按照指定参数初始化GPIO部件
GPIO_StructInit函数:用于为GPIO_InitStruct各个成员赋默认值
GPIO_ReadInputDataBit函数:用以读取特定输入端口引脚
GPIO_ReadInputData函数:用于读取特定GPIO输入端口引脚
GPIO_ReadOutputDataBit函数:用于读取特定输出数据端口位
GPIO_ReadOutputData函数:用于读取特定GPIO输出数据端口
GPIO_SetBits函数:用于置位选定的STM32数据端口位
GPIO_ResetBits函数:用于清除选定的数据端口位
GPIO_WriteBit函数:
GPIO_Write函数:用于写数据到特定的端口
GPIO_PinLockConfig函数:用于锁定GPIO引脚配置寄存器
GPIO_EventOutputConfig函数:用于选择GPIO引脚用作事件输出
GPIO_EventOutputCmd函数:GPIO使能(禁用)STM32事件输出
GPIO_PinRemapConfig函数:用于改变特定引脚的映射
GPIO_EXTILineCongig函数:用于选择GPIO引脚作为EXTI线
GPIO寄存器结构
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
}GPIO_TypeDef;
复用功能寄存器结构:
typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
}AFIO_TypeDef;
关键字:STM32 通用IO读写
引用地址:
STM32 通用IO读写
推荐阅读最新更新时间:2024-03-16 15:41
STM32-EXTI中断的分析及应用
EXTI中断/事件控制器,管理了控制器的20根中断/事件线。每个对应了一个边沿检测器,可以实现输入信号的上升沿或者下降沿检测,EXTI可以实现对每个中断或者事件的单独配置 这里中断通常是指GPIO的中断 事件可以是AD/DA转换 TIM定时器等··· 通过书上的EXTI 功能框图可以清楚的知道配置EXTI中断的具体过程 这里拿EXTI控制GPIO为例: 编程要领: 1)初始化用来产生中断的GPIO 2)初始化EXTI 3)配置NVIC 4)编写中断函数 这里只贴出配置EXTI和中断函数的编写: void EXTI_Key_config(void) { GPIO_InitTypeDef G
[单片机]
STM32-自学笔记(14.NVIC和外部中断,程序用到的库函数介绍)
1.GPIO_EXTILineConfig 函数原型:void GPIO_EXTILineConfig(u8 GPIO_PortSource,u8 GPIO_PinSource) 功能:选择GPIO引脚用作外部中断线路 参数: GPIO_PortSource:选择用作外部中断源的GPIO端口 GPIO_PinSource:待设置的外部中断引脚。该参数可以取GPIO_PinSourcex(x可以是0~15) 返回值:无 参数:GPIO_PortSource GPIO_PortSourceGPIOA 选择GPIOA GPIO_PortSourceGPIOB 选择GPIOB GPIO_Port
[单片机]
stm32HAL库之can操作
基于STM32CubeMx的CAN配置信息 volatile 1.系统时钟APB1=36MHZ 2.CAN计算通信率计算公式,参考数据手册, CAN bit timing register (CAN_BTR) 寄存器 NominalBitTime计算公式: NominalBitTime =1 t × q + tBS1 + tBS2 3.STM32CubeMx设置的Prescaler为8- 对应BRP=7,TimeSeg1=6- 对应TS1=5,TimeSeg2=2- 对应TB2=2,STM32F103ZE对应APB1设置为36M,即Time for one Bit的时间为(1 + TimeSeg1+ TimeSeg2)
[单片机]
STM32串口一直进中断解决方法
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。 问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate);
[单片机]
STM32 转换模式
1.ADC的主要特征: 12位分辨率 模式:单次和连续转换模式,扫描模式,间断模式 通道:规则组、注入组 供电要求:2.4V~3.6V 输入范围:Vref- = Vin = Vref+ 16个模拟输入通道(0..15) 温度传感器和通道16相连 内部参照电压Vrefint和通道17相连 2.关于几种转换模式的理解 单次转换模式:ADC只执行一次转换,CONT=0。 连续转换模式:ADC转换一结束就启动另一次转换,CONT=1。 扫描模式:在每个组的每个通道上执行单次转换,在每个转换结束时,同一组的下一个通道被自动转换。 如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道
[单片机]
JFlash ARM对stm32程序的读取和烧录
本篇文章主要是记录一下JFlash ARM 的相关使用和操作步骤,读取程序说不上破解,这只是在没有任何加密情况下对Flash的读写罢了! 在我们装了JLINK驱动后再根目录下找到JFlash ARM ,运行。 读取Flash程序: 第一步:Option-- Project Settings-- CPU下选择 Device 在下拉菜单中找到自己的芯片型号后点击确定。 第二步:Targect-- Connect链接JLINK ;Targect-- Read back-- Entrie chip读取整个Flash区域, 接下来就等待读取完成了。 第三部:File-- Save file as 选择要储存的文件类型如:HE
[单片机]
STM32学习第三课:STM32 c语言学习基础3(内存操作、指针、结构指针)
1.内存操作 在对内存操作头疼的时候我发现了这篇神奇的文章,拜读之后豁然开朗心生崇拜 数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况: (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址; (2) 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元(称为mail box)书写内容以在对方CPU产生中断; (3) 读取在ROM或FLA
[单片机]
基于STM32单片机的数据记录装置设计
引言 本文针对电动汽车研究的实际需求,设计一款数据记录装置,该数据记录装置是搭建在电池能量管理系统基础上的,通过与能量管理系统通信,记录电动汽车实际运行时电池的外部状态(如:电池电压、电流、温度等),一方面为了研究电池的工作特性,另一方面为了对能量管理系统的工作情况做验证,为电动汽车动力电池的理论研究提供数据支持。 1 系统总体设计 本数据记录装置的设计包括硬件设计与软件设计两方面,软件设计主要包括数据接收的编程以及数据存储的编程,而硬件设计主要有几个方面:主控芯片的选择、复位功能的实现、电源模块、实时时钟、通信模块以及SD卡连接等。主控芯片是控制系统的核心,它内部所集成的模块越多,就能省去更多的外部电路,使
[单片机]