1. 开漏模式 2.推挽模式 3.复用开漏模式 4.复用推挽模式。
开漏模式:(写入位设置,输出数据寄存器来控制MOS)
只有N-MOS管导通。PMOS不导通。
当N-MOS的栅极为0,N-MOS管导通。那么I/o输出0。
当N-MOS的栅极为1,N-MOS管截止。那么I/o为高阻态。需要接上拉电阻。
推挽模式:(写入位设置,输出数据寄存器来控制MOS)
当N-MOS的栅极为0,N-MOS管导通。P-MOS截止。那么I/o输出0
当N-MOS的栅极为1,N-MOS管截止。P-MOS导通。那么I/o输出1.
复用开漏模式 /推挽模式:( 由复用功能输出控制MOS,主要跟开漏/推挽的区别在这)
在板子的硬件里有两个LED如下:
可以看出只要PB0,PB1输出高电平就让两个LED灯亮。
程序设计:让LED1与LED2交替亮灭。时间自由。相当于不断地给PB1与PB2高低电平。
所以选择推挽模式。
LED.h
#ifndef _LED_H
#define _LED_H
#include "gd32f10x.h"
#include
#define LED1 1
#define LED2 2
void Led_Init(void);
void Led_Open(unsigned char LED_Number);
void Led_Close(unsigned char LED_Number);
#endif
LED.c
#include "LED.h"
void Led_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOB); /* 使能GPIOB外设时钟 */
/* 初始化GPIO 参数1:端口号 参数2:端口模式(这里选择推挽) 参数3:端口的速率 参数4:端口引脚
(为什么可以设置多个引脚用位或就可以) 按照1,2,4,8,16......对应每一bit */
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1);
/* 把PB1,PB2设置为0(根据硬件图一开始灯是熄灭) */
gpio_bit_reset(GPIOB, GPIO_PIN_0 | GPIO_PIN_1);
}
void Led_Open(unsigned char LED_Number){
switch(LED_Number){
case LED1:
gpio_bit_set(GPIOB, GPIO_PIN_0); /* 把引脚设置为1 */
break;
case LED2:
gpio_bit_set(GPIOB, GPIO_PIN_1);
break;
default:
break;
}
}
void Led_Close(unsigned char LED_Number){
switch(LED_Number){
case LED1:
gpio_bit_reset(GPIOB, GPIO_PIN_0); /* 把引脚设置为0 */
break;
case LED2:
gpio_bit_reset(GPIOB, GPIO_PIN_1);
break;
default:
break;
}
}
main.c
#include "LED.h"
#include "DELAY.h"
int main(){
Led_Init();
while(1) {
Led_Open(LED1);
Led_Close(LED2);
delay_ms(1000);
Led_Open(LED2);
Led_Close(LED1);
delay_ms(1000);
}
}
程序实现:每1s两个LED交替亮灭。
gpio_bit_set与 gpio_bit_reset可以用gpio_bit_write来替换。
gpio_bit_write可以设置bit的值。比如:
gpio_bit_write(GPIOB, GPIO_PIN_1, SET) 设置1
gpio_bit_write(GPIOB, GPIO_PIN_0, RESET) 设置0