GD32E230C8T6《调试篇》之 FMC(闪存)的读写 + USART打印

本文详细描述了一项基于GD32E230C8T6微控制器的实验,涉及GPIO配置、USART通信、I2C与数码管交互、按键扫描以及Flash存储操作,展示了如何利用这些功能进行数据读写和显示控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验:按键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(++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值