GD32F103 通信例程及IO口设置

该代码段展示了如何在GD32F103微控制器上配置GPIO端口和USART接口。GPIO初始化包括设置PA,PB和PC端口的输出和输入模式,以及禁用JTAG的JDTI引脚并重映射为GPIO。同时,配置了USART1,包括波特率、数据帧格式和中断处理,用于串行通信。

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

MCU是GD32F103R8T6

IO口设置

void GPIO_config(void)
	{
	//GPIO时钟使能
		rcu_periph_clock_enable(RCU_GPIOA);
		gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
		
		rcu_periph_clock_enable(RCU_GPIOB);
		gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
		gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
		
		rcu_periph_clock_enable(RCU_GPIOC);
		gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|
							GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15);
	}	
		
	
/* GD32禁用jtag的JDTI脚,重映射成GPIO */
void fun_init(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_AF);
	gpio_pin_remap_config(GPIO_SWJ_DISABLE_REMAP,ENABLE);
	
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
	gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
	gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
	
}

通信口设置

void usart_init(unsigned int bd)		//波特率
{
    // GPIO时钟使能
    rcu_periph_clock_enable(RCU_GPIOA);
    // USART时钟使能
    rcu_periph_clock_enable(RCU_USART1);
    rcu_periph_clock_enable(RCU_AF);
    // 配置TX为推挽复用模式
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
    // 配置RX为浮空输入模式
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
    
    // 配置串口的工作参数
    usart_deinit(USART1);
    usart_baudrate_set(USART1, bd);                        // 波特率
    usart_word_length_set(USART1, USART_WL_9BIT);               // 帧数据字长
    usart_stop_bit_set(USART1, USART_STB_1BIT);                 // 停止位
    usart_parity_config(USART1, USART_PM_EVEN);                 // 奇偶校验位
    usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);  // 硬件流控制RTS
    usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);  // 硬件流控制CTS
    usart_receive_config(USART1, USART_RECEIVE_ENABLE);         // 使能接收
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);       // 使能发送
    usart_enable(USART1);                                       // 使能串口    
    
    // 中断管理器使能,并分配优先级
	nvic_irq_enable(USART1_IRQn, 0, 0);
    /*清除中断标志*/
	usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
    // 使能串口接收中断
	usart_interrupt_enable(USART1, USART_INT_RBNE);
}



void UART1_SendBuffer(u8 *p,u8 len)
{
	u8 e=0;
	for(e=0;e<len;e++)
	{ 
	 usart_data_transmit(USART1, *(p+e));
	 while(RESET == usart_flag_get(USART1, USART_FLAG_TC));	//发送完成
	 }	
}


void USART1_IRQHandler(void )
	{
		if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
		{
			rx_data[rx_n++] = (uint8_t)usart_data_receive(USART1);
		}	
	}

主函数MAIN()

#include "gd32f10x.h"

u8	rx_data[255]={0};
u8	tx_data[100]={0};
u8	rx_n=0,tx_n=0;		

int main(void)
{
	
	GPIO_config();
	flag=0;

	usart_init(9600);		//波特率9600

	UART1_SendBuffer(&pcb_address,1);
	

	while(1)
            {
            ;
            }


}

GD32F103是一款基于ARM Cortex-M4的微控制器,而OLED通常指的是有机发光二极管显示器,常用于小巧的设备上。要在GD32F103上控制六脚OLED,你需要完成以下几个步骤: 1. **硬件连接**: - 将GD32F103的GPIO连接到OLED的数据线(Data)、命令线(Command)、时钟线(Clock),以及电源和地线。 - 如果OLED有背光驱动,还需要连接背光控制线。 2. **初始化例程**: - 首先编写一个初始化函数,设置GPIO配置为推挽输出,必要时设置正确的数据传输模式。 ```c void OLED_Init(void){ GPIO_InitStructure.GPIO_Pin = OLED_DAT|OLED_CMD; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 同理设置其他IO和背光控制端 } ``` 3. **发送命令序列**: - 编写一个函数来发送OLED所需的命令序列,比如显示模式设置、屏幕地址等。 ```c void OLED_SendCommand(uint8_t command){ OLED_Cmd(command); Delay_ms(1); // 每次写入后稍作延时,让OLED处理 } void OLED_Cmd(uint8_t command){ GPIO_ResetBits(GPIOA, OLED_CMD); // 数据线低电平表示写命令 OLED_Write8(command); GPIO_SetBits(GPIOA, OLED_CMD); // 数据线高电平结束命令 } ``` 4. **发送数据和刷新屏幕**: - 发送字符或图像数据到OLED需要将每个像素转换为相应命令和数据,并通过`OLED_WriteData()`函数发送。 ```c void OLED_WriteData(uint8_t data){ GPIO_ResetBits(GPIOA, OLED_DAT); // 写数据 OLED_Write8(data); GPIO_SetBits(GPIOA, OLED_DAT); // 结束数据 } void OLED_ClearDisplay(){ OLED_Cmd(OLED_CLEAR); // 清屏命令 OLED_Delay(); } ``` 5. **显示示例文本或图片**: - 使用循环遍历字符数组并逐行发送数据,最后刷新屏幕。 ```c void OLED_DisplayString(const char* str){ for(int i=0; str[i]; i++){ OLED_WriteChar(str[i]); } OLED_Cmd(OLED_DISPLAYON); OLED_Delay(); // 等待画面稳定 } void OLED_WriteChar(char c){ const uint8_t font_table[] = ... // 字体映射表 // ...按照字模库解析字符并发送数据 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值