实验:按键DIG4(保存键),任意按下一个数字后,再按保存键写入flash;断电后重新上电,从 flash里读值,显示到数码管
实验工具
主芯片GD32E230C8T6 /4段8位数码管/GN1650驱动芯片(IIC通讯)/USART/485通讯芯片
GD32E230C8T6
查看GPIO
查看Datasheet 2.6.7章节GPIO 复用
说明使用PA9、 PA10的USART0时要选择AF1;
初始化USART0 时才有了这两句;
与GD32E103不同的是E230没有gpio_init这个库函数,所以参考例程是有帮助的;
/* connect port to USARTx_Tx */
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
查看用户手册
可以看到E230有64K的主flash,这里我选了0x0800 FC00,操作最后一页;
代码
main.h
//IIC所有操作函数
void i2c_init(void); //初始化IIC的IO口
static void IIC_Start1(void);
static void IIC_Stop1(void);
uint8_t IIC_Rev_Byte(void); //对IIC数据进行读出
void IIC_Wrt_Byte(uint8_t data); //IIC发送一个字节
void IIC_ACK(void); //IIC发送信号
void IIC_NAck(void); //IIC不发送ACK信号
void SDA_Rx(void); //主机recv from 从机
/************** GN1650 **************/
void GN1650_display(void); //数码管显示
void GN1650_display_D(void); //数码管无显示
void GN1650_Wrt_RAM(uint8_t Address, uint8_t Data); //对IIC数据进行写入
uint8_t GetKey(void); //按键扫描
/************** usart ************/
void usart0_init();
/************** flash ************/
uint8_t FMC_FLASH_Write( u32 data );
uint8_t FMC_FLASH_Read(u32 *data );
main.c
#define READ_SDA gpio_input_bit_get(GPIOB,GPIO_PIN_7)
#define LEDDOT 0x80
#define MAXNUM 10
#define TIMEPRESS 350 //key press times
#define DIG1 17
#define DIG2 25
#define DIG3 21
#define DIG4 29
#define ADDRMAX 512
uint8_t i;
uint16_t value=0;
void myGPIO_init(void)
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOA);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_0);//PB6_42 I2C0_SCL GPIO_OTYPE_PP推挽输出
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);
}
void keycheck(void)
{
uint16_t KeyNum;
uint16_t LastKeyNum = 0;
static uint8_t Keyleased=1,fastCnt=0;
static uint16_t keydowntime = 0;
KeyNum = GetKey();
switch(KeyNum)
{
case DIG2:
if(keydowntime++ >= TIMEPRESS )//long press ++
{
keydowntime=TIMEPRESS;
if(++