网站专业销售团队介绍合肥网站推广培训
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:20
当前位置: 首页 > news >正文
网站专业销售团队介绍,合肥网站推广培训,广州越秀区发布,美文分享网站源码在使用51单片机的时候基本上不需要额外的配置IO#xff0c;不过在使用特定的IO的时候需要额外的设计外围电路#xff0c;比如PO口它是没有内置上拉电阻的。因此若想P0输出高电平#xff0c;它就需要外接上拉电平。#xff08;当然这不是说它输入不需要上拉电阻#xff0c;… 在使用51单片机的时候基本上不需要额外的配置IO不过在使用特定的IO的时候需要额外的设计外围电路比如PO口它是没有内置上拉电阻的。因此若想P0输出高电平它就需要外接上拉电平。当然这不是说它输入不需要上拉电阻主要是它作为输入端的时候接收高电平就是共外围电路的上拉电阻。
操作目标是控制STM32F103C8T6上某个IO口让其置1或者置0. GPIO是APB2上的外设资源。
APB2是AMBA总线结构中的一种主要用于低带宽的周边外设之间的连接。
APB2Advanced Peripheral Bus 2是ARM公司提出的AMBA总线结构之一属于一种片上总线结构。APB2主要用于连接低速外设如I2C、UART、SPI等这些外设通常具有低带宽和低功耗的需求。
APB2的特点
低带宽APB2主要用于连接低速外设适合那些不需要高速数据传输的外设。非流水作业APB2的传输至少需要两个时钟周期且数据在时钟的上升沿变化不需要等待周期和回应信号。控制逻辑简单APB2只有四个控制信号传输可以采用状态机表示控制逻辑相对简单。
APB2与其他总线的区别
与AHB的区别AHB是高级高性能总线主要用于连接高性能模块如CPU、DMA和高速存储器。APB2则是用于连接低速外设。与APB3和APB4的区别APB3增加了PREADY和PSLVERR信号用于反馈读和写的状态APB4增加了PPROT和PSTRB信号用于提供保护机制和字节选通功能。 在51单片机中如果我们要是某个IO口比如P1.0端口输出高电平 直接赋值即可。但作为输入端就稍微麻烦点需要先赋值P1.0为高电平再读取P1.0端口的电压。需要两步走。
GPIO作为一种外设资源在使用它的时候要经过这么几步走
第一步假设要是能PC13使其输出高电平经查得知PC13是GPIOC的编号13的IO口按照顺序因该是第14位IO是从0开始编的所以第一步使能能APB2外设总线时钟寄存器
APB2这个外设使能时钟寄存器名字是RCC_APB2ENR作为32位的单片机它的特殊功能寄存器一般也是32位点一下APB2上的外设个数刚好是16个GPIOC是其中的一位然后我们看一下手册上的描述(库函数里有21个)
确实是0-15位可控制后16位是保留的。从他的复位值可知默认的都是0详细查看可知 可知位4是第5位至1即可使能GPIOC I/O口。即 RCC-APB2EBR 0x00000010 0B 0000 0000 0000 0000 0000 0000 0001 0000
第二步GPIO和51单片机的IO口的不同之处是它的输入输出是分开的需要额外的进行功能选择的而且对应IO口处于什么结构模式也是需要选择的 在STM32中控制这些功能每个IO口需要4位16个IO就是64位因此这些IO口的功能选择控制寄存器就分成了两个端口控制高寄存器CRH和端口控制低寄存器CRLPC13应是由CRH控制打开手册得知 先看一下它的复位值0x4444 4444 0b0100 0100 0100 0100 0100 0100 0100 0100
可以看到0100代表的是浮空输入模式即STM32上电后的复位状态都是浮空输入模式。 浮空输入GPIO_Mode_IN_FLOATING 电路结构无内部上下拉电阻引脚悬空。特点 电平由外部电路决定。未连接外部电路时电平可能不稳定易受干扰。
因此控制这个IO口我们选择0011 通用推挽输出模式速度50HZ 即我们赋值寄存器
GPIOC-CRH 0x0030 0000;当然这个写法是不太对,其它位我们都赋值为0了
一般来说需要先把该处的控制位清0即GPIOC-CRH 0x1101 1111
然后再通过或运算给控制位赋值即GPIOC-CRH | 0x0030 0000;(1个16进制数代表4个2进制数)
第三步选择输出高电平还是低电平在51机中我们直接就是使用赋值语句进行赋值如P1.0 0但是在STM32中是在专用的寄存器里操作的而且分输入和输出端口输出数据寄存器(GPIOx_ODR) (xA..E)端口输入数据寄存器(GPIOx_IDR) (xA..E)目前是需要输出一个低电平
我们是需要在位13处写0正常情况下还是需要经过与或运算才是正确的赋值方式这边就直接赋值其它位都置0
GPIOC-ODR 0x0000 0000;//输出低电平
GPIOC-ODR 0x0000 2000//输出高电平 经过这三步我们就成功使PC13端口输出低电平或者高电平通用推挽输出方式50MHZ
这是使用寄存器的方式进行操作。还有使用库函数的库函数就不叙述了。
笔者的资料来自B站江协科技。 模式电平特性驱动能力适用场景注意事项模拟输入模拟信号-ADC/DAC禁用数字功能浮空输入由外部决定-外部有上下拉的总线避免悬空下拉输入默认低电平-检测高电平有效信号外部信号需强驱动上拉输入默认高电平-检测低电平有效信号外部信号需强驱动推挽输出主动驱动高 / 低电平强LED、高速信号避免总线冲突开漏输出需外部上拉弱I2C、电平转换必须外接上拉电阻复用推挽外设驱动高 / 低电平强定时器 PWM、USART_TX需配置外设功能复用开漏外设驱动 外部上拉弱I2C、CAN 总线需配置外设功能 一、输入模式 1. 模拟输入GPIO_Mode_AIN 电路结构引脚直连 ADC/DAC 模块断开内部上下拉电阻。特点 无施密特触发器直接传递模拟信号。禁止数字信号输入无法读取高低电平。 应用 ADC 电压采集如传感器信号。DAC 模拟输出某些引脚支持。 2. 浮空输入GPIO_Mode_IN_FLOATING 电路结构无内部上下拉电阻引脚悬空。特点 电平由外部电路决定。未连接外部电路时电平可能不稳定易受干扰。 应用 需要外部上拉或下拉的场景如总线通信I2C 的 SDA/SCL 需外部上拉。电平由外部设备驱动如中断信号线。
- 下拉输入GPIO_Mode_IPD 电路结构内部连接下拉电阻约 20-50kΩ默认低电平。特点 引脚悬空时默认读取低电平。外部高电平可覆盖下拉。 应用 避免引脚悬空引发误触发如按键检测低电平有效。
- 上拉输入GPIO_Mode_IPU 电路结构内部连接上拉电阻约 20-50kΩ默认高电平。特点 引脚悬空时默认读取高电平。外部低电平可覆盖上拉。 应用 避免引脚悬空引发误触发如按键检测高电平有效。
二、输出模式 5. 推挽输出GPIO_Mode_Out_PP 电路结构P-MOS 和 N-MOS 组合可主动输出高 / 低电平。特点 高电平P-MOS 导通输出 VDD。低电平N-MOS 导通输出 GND。驱动能力强适合高速切换。 应用 驱动 LED、继电器等负载。高频信号如 PWM、SPI 时钟。 6. 开漏输出GPIO_Mode_Out_OD 电路结构仅 N-MOS需外部上拉电阻输出高电平。特点 高电平N-MOS 关闭电平由外部上拉电阻决定。低电平N-MOS 导通输出 GND。支持 “线与” 逻辑但上升沿较慢。 应用 I2C、SMBUS 等总线通信。电平转换如 5V 与 3.3V 设备通信。 7. 复用推挽GPIO_Mode_AF_PP 电路结构与普通推挽相同但输出由外设控制如 USART、SPI。特点 外设自动管理电平输出如定时器 PWM、串口 TX。高驱动能力适合高频外设。 应用 外设功能引脚如 TIMx_CHx、USART_TX。需要硬件自动控制的场景。 8. 复用开漏GPIO_Mode_AF_OD 电路结构与普通开漏相同但输出由外设控制。特点 需外部上拉电阻支持 “线与” 逻辑。由外设自动管理电平如 I2C 的 SDA/SCL。 应用 I2C、CAN 总线等复用功能。多设备共享总线通信。 这是驱动电路然后我们调用端口各个功能测试一下他们的区别 GPIO_Mode_IPU 使PC13处于输入状态并且内部设置上拉电阻LED熄灭端口电压3.2V 可以设置端口电压为低电平这时LED会点亮不过亮度不够端口电压为1V。 GPIO_Mode_IPD 使PC13处于输入状态并且内部设置下拉电阻LED依然会点亮不过亮度不够 端口电压1V GPIO_Mode_IN_FLOATING LED熄灭端口电压1.3V推测是是驱动电流不够。当设置IO输出端口的时候如果忘记设置频率将无法正确使IO工作同理如果忘记设计其它参数IO口也无法正确使能从测试结果看电压是1.3V即端口状态是之前的浮空输入状态。 使用库函数配置IO口使PC13端口输出低电平 #include stm32f10x.h // Device header int main(void) {//RCC-APB2ENR 0x00000010; //APB2 外设时钟使能寄存器//GPIOC-CRH 0x00300000; //端口配置高寄存器//GPIOC-ODR 0X00000000; //端口输出数据寄存器RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOC,GPIO_InitStructure);//GPIO_SetBits(GPIOC,GPIO_Pin_13);//端口设置为1GPIO_ResetBits(GPIOC,GPIO_Pin_13); //端口设置为0while(1){} } GPIOpin的选择上可以用或运算 GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 ; //GPIO引脚赋值为0,23,4,6,7 库函数与对应的寄存器列举 下面的程序是PB14外部中断的初始化过程 void CountSensor_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//AFIO时钟使能/*GPIO初始化 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU ;//上拉GPIO_InitStructure.GPIO_Pin GPIO_Pin_14 ; //14位GPIO_InitStructure.GPIO_Speed GPIO_Speed_10MHz;GPIO_Init(GPIOB,GPIO_InitStructure); //使能GPIOB_14设置/AFIO选择引脚/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);///EXIT初始化/EXTI_InitTypeDef EXIT_InitStructure;EXIT_InitStructure.EXTI_Line EXTI_Line14 ;EXIT_InitStructure.EXTI_LineCmd ENABLE ;EXIT_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; //选择外部中断EXIT_InitStructure.EXTI_Trigger EXTI_Trigger_Falling ;//下降沿EXTI_Init(EXIT_InitStructure);//使能外部中断设置/*设置NVIC中断优先级设置 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority 2 ;NVIC_Init(NVIC_InitStructure); //使能NVIC中断设置 配置外部中断PB14、上拉电阻、下降沿触发。中断优先级 抢占2 响应2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB时钟使能 寄存器 APB2ENR bit 3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//AFIO时钟使能 寄存器 APB2ENR bit 0 GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU ;//上拉GPIO_InitStructure.GPIO_Pin GPIO_Pin_14 ; //14位GPIO_InitStructure.GPIO_Speed GPIO_Speed_10MHz;GPIO_Init(GPIOB,GPIO_InitStructure); //使能GPIOB_14设置 见前文的说明不赘述其中的上下拉模式要特别说明一下 由手册发现上拉/下来输入模式由同一组控制位控制怎么区分设置呢 输入模式下的上拉电阻和下拉电阻寄存器配置 由GPIOx_ODR寄存器控制为0则为下拉为1则为上拉。ODR寄存器原先是数据输出寄存器。由上述的两图可以看到当配置为GPIO_Mode_IPU;时ODR14为1下拉时为0. /AFIO选择引脚/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);// AFIOAlternate Function Input/Output复用端口选择寄存器配置 该端口本例采用的是中断配置因此不设置默认。 端口复用功能配置本案都是使用主功能因此也不配置。 外部中断配置寄存器 1~4(AFIO_EXTICR1) 外部中断配置寄存器共4个pb14使用的是第4个 AFIO_EXTICR4 因为是配置PB14因此控制的是8-11 EXTI14[3:0]位共4位控制位因为是GPIOB 因此这4位是 0001 0x01 EXTI_InitTypeDef EXIT_InitStructure;EXIT_InitStructure.EXTI_Line EXTI_Line14 ;EXIT_InitStructure.EXTI_LineCmd ENABLE ;EXIT_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; //选择外部中断EXIT_InitStructure.EXTI_Trigger EXTI_Trigger_Falling ;//下降沿EXTI_Init(EXIT_InitStructure);//使能外部中断设置 配置外部中断寄存器 ● 配置 20个中断线的屏蔽位(EXTI_IMR) IMR( Interrupt Mask Register ) EXIT_InitStructure.EXTI_Line EXTI_Line14 ;EXIT_InitStructure.EXTI_LineCmd ENABLE ; EXIT_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; //选择外部中断 默认是全屏蔽的程序是使能bit14 默认是全屏蔽的即复位值是0x0000 0000. EMR(Event Mask Interrupt) ● 配置所选中断线的触发选择位 (EXTI_RTSR 和 EXTI_FTSR) RTSR(Rising Trigger Selection Register),我们选择的是下降沿因此无需设置即默认。 FTSR(Falling edge Trigger Selection Register) 我们配置是bit14位因此需要设置为1 //EXIT_InitStructure.EXTI_Line EXTI_Line14 ;//EXIT_InitStructure.EXTI_LineCmd ENABLE ;EXIT_InitStructure.EXTI_Trigger EXTI_Trigger_Falling ;//下降沿 软件中断是通过代码或者寄存器操作触发中断之前代码中是采用GPOI触发是硬件触发中断因此无需设置即默认即可。 PRPull Reques挂起寄存器是操作事件触发的因此这里也无需设置。至此外部中断EXTI寄存器完毕。 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority 2 ;NVIC_Init(NVIC_InitStructure); //使能NVIC中断设置 至于NVIC是内核中的寄存器KEIL5中有相应的查看界面但是里面的参数好像有点问题以本案为 例 未使能NVIC之前的数据可以看到优先级分组里的选项就不符合STM32F103C8t6里的分法使能后的数据 SCB-AIRCR根据手册因是 他的掩码是0x05FA0000分组是2组即0x500所以结果是0x05FA0500和这个界面里显示的也不一样因此这里面的 然后再看一张分组1的NVIC界面是1抢占3响应 记过几次设置分组的比较可以得出以下几个结果 这里的数据代表分组是第几组至于组内里面的响应设置变动不会改变这个值 这个里面是数据 1是抢占优先级48 16*3 响应优先级是3即1抢占3响应。176不清楚这是观察结果可能只适合STM32F103C8T6 硬件事件选择 通过下面的过程可以配置 20 个线路为事件源 ● 配置 20 个事件线的屏蔽位 (EXTI_EMR) ● 配置事件线的触发选择位 (EXTI_RTSR 和 EXTI_FTSR) 软件中断 / 事件的选择 20 个线路可以被配置成软件中断 / 事件线。下面是产生软件中断的过程 ● 配置 20 个中断 / 事件线屏蔽位 (EXTI_IMR, EXTI_EMR) ● 设置软件中断寄存器的请求位 (EXTI_SWIER) 以下来自DEEPSEEK 一、定义与核心功能 事件寄存器 功能用于配置和控制硬件事件的触发条件如边沿检测及是否允许事件信号传递到硬件模块如DMA、ADC等。典型寄存器 EMR事件屏蔽寄存器控制事件触发是否有效。RTSR/FTSR上升沿/下降沿触发选择寄存器配置事件的触发条件。 中断寄存器 功能管理中断请求的触发、优先级配置及中断屏蔽状态直接关联CPU的中断响应流程12。典型寄存器 IMR中断屏蔽寄存器控制中断请求是否被CPU响应。EXTICR外部中断配置寄存器设置中断线对应的GPIO引脚及触发方式。 二、触发机制差异 特性事件寄存器中断寄存器触发目标直接驱动硬件模块如DMA、ADC触发CPU中断服务程序ISR13响应方式硬件自动处理无需CPU介入需CPU保存现场并执行ISR12典型应用低延迟数据传输、周期性触发操作异步任务处理、紧急事件响应23 三、配置流程对比 事件寄存器配置示例 通过RTSR设置上升沿触发事件。通过EMR使能事件触发信号直接传递至外设模块。 中断寄存器配置示例 通过EXTICR绑定GPIO引脚到中断线。通过IMR使能中断请求并设置NVIC优先级。 四、关键设计差异 事件寄存器 通过硬件链路实现快速响应适用于实时性要求高且无需复杂逻辑的场景。典型应用DMA触发、定时器同步23。 中断寄存器 依赖CPU介入适合需要执行复杂逻辑或修改程序流程的场景。典型应用按键检测、通信协议处理。 五、总结 事件寄存器通过硬件链路实现快速响应中断寄存器依赖CPU处理异步任务。两者常结合使用例如事件触发DMA传输传输完成后通过中断通知CPU23。 ● 配置对应到外部中断控制器 (EXTI) 的 NVIC 中断通道的使能和屏蔽位使得 20 个中断线中的 请求可以被正确地响应。
- 上一篇: 网站专业销售团队介绍百度收录率高的网站
- 下一篇: 网站转wordpress行业网站的优势
相关文章
-
网站专业销售团队介绍百度收录率高的网站
网站专业销售团队介绍百度收录率高的网站
- 技术栈
- 2026年04月20日
-
网站专业设计中国建筑网官网测评
网站专业设计中国建筑网官网测评
- 技术栈
- 2026年04月20日
-
网站专题制作wordpress meta slider
网站专题制作wordpress meta slider
- 技术栈
- 2026年04月20日
-
网站转wordpress行业网站的优势
网站转wordpress行业网站的优势
- 技术栈
- 2026年04月20日
-
网站转移wordpress 蜘蛛爬行插件
网站转移wordpress 蜘蛛爬行插件
- 技术栈
- 2026年04月20日
-
网站资料南昌手机模板建站
网站资料南昌手机模板建站
- 技术栈
- 2026年04月20日
