单片机输出速度对GPIO硬件的影响
如果T为100ns 那么2/3*100ns = 67ns 那么tr + tf = 38 ns (也就是不能超过32ns)
tr 和tf和什么东西有关如何去控制
CL 是一个电容,电容会改变和影响电压变化的速率,输出高低电平也就是对电容进行充电和放电根据上图电容充电的公式DV / DT 电压变化的速率:因此在负载电容一定的情况下,电压变化的速率越快,需要的电流l越大,单片机的功耗越高。
注:
在决定使用多频率时遵循够用原则,尽可能的节省MCU资源
输出交流特性参数
基于hal库的方式驱动点亮发光二级管
嵌入式通用软件架构框图
GD32F303固件库
使用hal库的方式点亮led灯
创建一个项目:在项目下创建4个文件夹,同时在项目的文件路径下创建4个相同的文件夹
拷贝ARM内核文件
在项目中添加文件
添加ARM内核相关文件
配置完成后结果展示
keil配置
路径的添加在c或者c++的选项卡中
创建c文件main.c
led灯闪烁实验
配置hal库函数实现led灯的亮灭(与标准库差不多)
注:查看函数定义的方式有两种
1:一种是直接查看官方给出的参考手册,
2:一种是在keil软件的内部直接查看提供的头文件和c语言文件,我这里推荐两种方式结合使用
本次实验使用到的库函数
void rcu_deinit(void);
/* enable the peripherals clock */
void rcu_periph_clock_enable(rcu_periph_enum periph);
/* disable the peripherals clock */
void rcu_periph_clock_disable(rcu_periph_enum periph);
/* enable the peripherals clock when sleep mode */
void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph);
/* disable the peripherals clock when sleep mode */
void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph);
/* reset GPIO port */
void gpio_deinit(uint32_t gpio_periph);
/* reset alternate function I/O(AFIO) */
void gpio_afio_deinit(void);
/* GPIO parameter initialization */
void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin);/* set GPIO pin bit */
void gpio_bit_set(uint32_t gpio_periph, uint32_t pin);
/* reset GPIO pin bit */
void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin);
/* write data to the specified GPIO pin */
void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value);
/* write data to the specified GPIO port */
void gpio_port_write(uint32_t gpio_periph, uint16_t data);
led灯点亮函数
#include <stdint.h>
#include "gd32f30x.h"
/*1: rcc 外设时钟控制2: 初始化引脚
*/static void Delay(uint32_t count)
{while (count--);
}int main(void)
{// rcu 初始化GPIO时钟,这里初始化的是GPIOA的时钟rcu_periph_clock_enable(RCU_GPIOA);// 初始化GPIO通用输入输出引脚gpio_init( GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);// 第一个参数表示哪一个GPIO口// 第二个参数表示使用哪一种模式// 第三个参数表示时钟频率// 第四个参数表示使用的是哪一个引脚while(1){// 设置引脚电平gpio_bit_set(GPIOA, GPIO_PIN_8); Delay(1000000);gpio_bit_reset(GPIOA, GPIO_PIN_8);Delay(1000000);// // gpio_bit_set可以也可以输出引脚电平
// gpio_bit_write(GPIOA, GPIO_PIN_8, SET);
// Delay(1000000);
// gpio_bit_write(GPIOA, GPIO_PIN_8, RESET);
// Delay(1000000);}
}
按键控制实验
相关库函数
/* get GPIO pin input status */
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin);
/* get GPIO port input status */
uint16_t gpio_input_port_get(uint32_t gpio_periph);
/* get GPIO pin output status */
FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);
/* get GPIO port output status */
uint16_t gpio_output_port_get(uint32_t gpio_periph);
/* configure GPIO pin remap */
void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue);
按键按下时点亮led灯
#include <stdint.h>
#include "gd32f30x.h"
/*1: rcc 外设时钟控制2: 初始化引脚
*/static void Delay(uint32_t count)
{while (count--);
}int main(void)
{// rcu 初始化GPIO时钟,这里初始化的是GPIOA的时钟rcu_periph_clock_enable(RCU_GPIOA);// 初始化GPIO通用输入输出引脚gpio_init( GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);// 第一个参数表示哪一个GPIO口// 第二个参数表示使用哪一种模式// 第三个参数表示时钟频率// 第四个参数表示使用的是哪一个引脚while(1){// 获取GPIO引脚的输入值,如果输入值为0表示按键按下,程序点亮led灯while(gpio_input_bit_get(GPIOA,GPIO_PIN_0) == 0){gpio_bit_write(GPIOA,GPIO_PIN_8,SET);}gpio_bit_write(GPIOA,GPIO_PIN_8,RESET);}
}
......