?單片機輸出速度對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);}
}
......