前期资料
外形
原理图
参考手册
1.芯片数据手册
2.用户手册
3.固件库使用指南
固件库解析
外设缩写
一些不常见的外设缩写。
BKP 备份寄存器
DBG 调式模块
ENET 以太网控制模块Ethernet
EXMC 外部存储器控制
EXTI 外部中断事件控制器
FMC 闪存控制器
GPIO/AFIO 通用/备用输入输出接口 alternate备用的、替代的、交替的,所以AFIO可翻译为“备用功能I/O”
MISC 嵌套中断向量列表控制器
PMU 电源管理单元
RCU 复位和时钟单元
SDIO SDIO(Secure Digital Input and Output)中文名称:安全数字输入输出,定义了一种外设接口。
USBD 通用串行总线全速设备接口
USBFS 通用串行总线全速接口
GD3210x_Firmware_Libary
GPIO-LED-Key
原理图
测试代码
和32不同的地方在GPIO的配置,相关的库函数不一样。
#include "gd32f10x.h" // Device header
#include "systick.h"
void Key_Init(void)
{
rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1); // APB2时钟分频设置 PC14属于APB2的外设
rcu_periph_clock_enable(RCU_GPIOC); //使能RCU_GPIOC
gpio_init(GPIOC, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
}
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0;
if (gpio_input_bit_get(GPIOC, GPIO_PIN_14) == 0)
{
Delay_ms(20);
while (gpio_input_bit_get(GPIOC, GPIO_PIN_14) == 0);
Delay_ms(20);
KeyNum = 1;
}
if (gpio_input_bit_get(GPIOC, GPIO_PIN_14) == 0)
{
Delay_ms(20);
while (gpio_input_bit_get(GPIOC, GPIO_PIN_14) == 0);
Delay_ms(20);
KeyNum = 2;
}
return KeyNum;
}
比如上面按键的初始化中,时钟先选择分频系数rcu_apb2_clock_config之后,再使能rcu_periph_clock_enable。
GPIO的配置,也有了一个初始化函数gpio_init,不用一个一个的写结构体的参数。
I2C-OLED
一个很bug的函数gpio_bit_write
/*!
\brief write data to the specified GPIO pin
\param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
\param[in] pin: GPIO pin
one or more parameters can be selected which are shown as below:
\arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
\param[in] bit_value: SET or RESET
\arg RESET: clear the port pin
\arg SET: set the port pin
\param[out] none
\retval none
*/
void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value)
{
if(RESET != bit_value){
GPIO_BOP(gpio_periph) = (uint32_t)pin;
}else{
GPIO_BC(gpio_periph) = (uint32_t)pin;
}
}
bit_value 只能是SET or RESET 想弄成 0 1
解决办法:
搞了一天,I2C驱动OLED,没想到问题出在时钟上,不仅要打开GPIO的时钟,I2C也要同时打开。