GD32F103 通信例程及IO口设置

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

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是一款高性能的32位ARM Cortex-M3 微控制器,它的成本相对较低,而且功能齐全。在制作电路板时,往往需要考虑低功耗,并且不希望通过按下电源按钮来重新启动系统,因此在这种情况下,gd32f103 standby例程非常有用。 对于新手来说,gd32f103 standby例程可能会比较困难,但仔细阅读文档并尝试理解它是很重要的。确保在使用之前充分了解该例程的工作原理,以便于正确的应用。 该例程涉及到的寄存器设置很多,需要充分理解。在该例程中,需要调用PWR_EnterSTANDBYMode函数来将设备进入待机模式,该函数在stlib库中有定义。该函数会将CPU放入休眠状态,以达到节能的目的。进入待机模式时,需要先备份需要保留的寄存器,延时一定时间等待其完成,并在完成之后重启设备以恢复正常运行。 在编写gd32f103 standby例程时,需要考虑到电源管理方面的一些细节。例如,如果使用外置晶体时,可以通过在RCC_CR中设置HSEON位来使其运行并进入待机模式。如果使用内部时钟,则可以通过设置HSION位来启用它,并将16MHz的HSI时钟分频为2MHz,以减少功耗。 在完成所有这些设置之后,就可以成功地将gd32f103芯片置于待机模式下,这将极大地降低系统的功耗,实现低能耗的运行。需要注意的是,gd32f103 standby例程需要适当的硬件设备和驱动程序的支持,以保证其正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值